ip-lib.c
上传用户:skhuanbao
上传日期:2007-01-04
资源大小:43k
文件大小:3k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.     File: smtp/ip-lib.c
  3.     Version 1.0
  4.     
  5.     Copyright (C) 1999 by Wolfgang Zekoll <wzk@quietsche-entchen.de>
  6.     This source is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 1, or (at your option)
  9.     any later version.
  10.     This source is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program; if not, write to the Free Software
  16.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <signal.h>
  22. #include <unistd.h>
  23. #include <sys/types.h>
  24. #include <sys/socket.h>
  25. #include <sys/wait.h>
  26. #include <netinet/in.h>
  27. #include <netdb.h>
  28. #include <errno.h>
  29. #include "lib.h"
  30. #include "ip-lib.h"
  31. int ip_lib_error = 0;
  32. struct {
  33.     int code;
  34.     char msg[40];
  35.     } _error[] = {
  36.     0, "unknown error",
  37.     1, "socket allocation error",
  38.     2, "nameserver lookup error",
  39.     3, "connection refused",
  40.     4, "fdopen() failed",
  41.     5, "setvbuf() failed",
  42.     6, "timeout reached",
  43.     0, ""
  44.     };
  45.     
  46. char *get_error(int code)
  47. {
  48. int i;
  49. for (i=0; _error[i].msg[0] != 0; i++) {
  50. if (_error[i].code == code)
  51. return (_error[i].msg);
  52. }
  53. return (_error[i].msg);
  54. }
  55. static void alarm_handler()
  56. {
  57. /* fprintf (stderr, "TIMEOUTn"); */
  58. /* exit (-2); */
  59. return;
  60. }
  61. FILE *ip_open(char *host, unsigned int port)
  62. {
  63. int socketd;
  64. struct sockaddr_in server;
  65. struct hostent *hostp, *gethostbyname();
  66. FILE *fp;
  67. socketd = socket(AF_INET, SOCK_STREAM, 0);
  68. if (socketd < 0) {
  69. ip_lib_error = 1;
  70. return (NULL);
  71. }
  72.   
  73. server.sin_family = AF_INET;
  74. hostp = gethostbyname(host);
  75. if (hostp == NULL) {
  76. ip_lib_error = 2;
  77. return (NULL);
  78. }
  79.   
  80. memcpy(&server.sin_addr, hostp->h_addr, hostp->h_length);
  81. server.sin_port = htons(port);
  82. signal(SIGALRM, alarm_handler);
  83. alarm(10);
  84. if (connect(socketd, (struct sockaddr *) &server, sizeof(server)) < 0) {
  85. ip_lib_error = 3;
  86. if (errno == EINTR)
  87. ip_lib_error = 6;
  88. return (NULL);
  89. }
  90. alarm(0);
  91. signal(SIGALRM, SIG_DFL);
  92. if ((fp = fdopen(socketd, "w+")) == NULL) {
  93. ip_lib_error = 4;
  94. return (NULL);
  95. }
  96.   return (fp);
  97. }
  98. unsigned int get_port(char *server, unsigned int def_port)
  99. {
  100. unsigned int port;
  101. char *p;
  102. if ((p = strchr(server, ':')) == NULL)
  103. return (def_port);
  104. *p++ = 0;
  105. port = atol(p);
  106. return (port);
  107. }
  108. int get_client_info(int pfd, char *ipnum, char *name)
  109. {
  110. int size;
  111. struct sockaddr_in saddr;
  112. struct in_addr *addr;
  113. struct hostent *hostp = NULL;
  114. *ipnum = 0;
  115. *name  = 0;
  116. size = sizeof(saddr);
  117. if (getpeername(pfd, (struct sockaddr *) &saddr, &size) < 0 ) {
  118. if (isatty(pfd) == 0) {
  119. strcpy(ipnum, "127.0.0.2");
  120. strcpy(name, "local.host");
  121. }
  122. strcpy(ipnum, "127.0.0.1");
  123. strcpy(name, "local.host");
  124. return (0);
  125. }
  126. copy_string(ipnum, (char *) inet_ntoa(saddr.sin_addr), 80);
  127. addr = &saddr.sin_addr,
  128. hostp = gethostbyaddr((char *) addr,
  129. sizeof (saddr.sin_addr.s_addr), AF_INET);
  130. if (hostp == NULL)
  131. copy_string(name, ipnum, 200);
  132. else {
  133. copy_string(name, hostp->h_name, 200);
  134. strlwr(name);
  135. }
  136. return (0);
  137. }