rping.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:2k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /* Copyright (c) 1996 NEC Corporation.  All rights reserved.                 */
  2. /*                                                                           */
  3. /* The redistribution, use and modification in source or binary forms of     */
  4. /* this software is subject to the conditions set forth in the copyright     */
  5. /* document ("COPYRIGHT") included with this distribution.                   */
  6. #include "socks5p.h"
  7. #include "wrap.h"
  8. #include "libproto.h"
  9. #include "protocol.h"
  10. #include "addr.h"
  11. #include "share.h"
  12. #define EXITERROR(err) ( perror("ping"), exit((err)) )
  13. int main(int argc, char *argv[]) {
  14.     S5IOHandle fd;
  15.     S5NetAddr rsin;
  16.     lsSocksInfo *pcon;
  17.     struct hostent *rhp;
  18.     if (argc != 2 || *argv[1] == '-') {
  19. fprintf(stderr, "Usage: %s hostn", argv[0]);
  20. exit(-1);
  21.     }
  22.     if (LIBPREFIX2(init)(NULL) != 0) EXITERROR(-1);
  23.     memset((char *)&rsin, 0, sizeof(S5NetAddr));
  24.     rsin.sin.sin_family = AF_INET;
  25.     if ((rsin.sin.sin_addr.s_addr = inet_addr(argv[1])) == INVALIDADDR) {
  26.         if ((rhp = LIBPREFIX(gethostbyname)(argv[1])) == NULL) EXITERROR(-1);
  27.         memcpy((char *)&rsin.sin.sin_addr.s_addr, (char *)rhp->h_addr_list[0], rhp->h_length);
  28.         rsin.sin.sin_family = rhp->h_addrtype;
  29.     }
  30.     if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == S5InvalidIOHandle) return -1;
  31.     Signal(SIGPIPE, SIG_IGN);
  32.     if ((pcon = lsLibProtoExchg(fd, &rsin, SOCKS_PING)) == NULL) {
  33.         fprintf(stderr, "lsLibProtoExchg: Protocol exchange failed. n");
  34. CLOSESOCKET(fd);
  35.         return -1;
  36.     }
  37.     if (!pcon->pri || pcon->pri->how == DIRECT || !lsAddrAddrComp(&rsin, &pcon->pri->prxyin)) {
  38. LIBPREFIX(close)(fd);
  39. #ifndef PINGPROG
  40. fprintf(stderr, "Real ping unavailable.n");
  41. exit(0);
  42. #else
  43. execlp(PINGPROG, "ping", argv[1], NULL);
  44. _exit(0);
  45. #endif
  46.     }
  47.     DataRelay(fd, &pcon->pri->cinfo, 0);
  48.     LIBPREFIX(close)(fd);
  49.     exit(0);
  50. }