www.pudn.com > socks5.zip > finger.c
#include "config.h"
#include "includes.h"
#include "defs.h"
#include "protos.h"
#include "socks.h"
static char *Progname;
int main(int argc, char **argv) {
struct sockaddr_in sin;
struct hostent *hp;
struct servent *sp;
char *cp, buf[1024], msg[2048];
int v, n, i, s;
u_int l;
#ifdef WHOIS_SERVER
char *service = "whois", *host = WHOIS_SERVER;
#else
char *service = "finger", *host = "localhost";
#endif
struct in_addr dstaddr[21];
#ifdef linux
int optind = 1;
#else
extern int optind;
#endif
if ((Progname = strrchr(argv[0], '/')) == NULL) Progname = argv[0];
else Progname++;
#ifdef SOCKS
LIBPREFIX2(init)(Progname);
#endif
#ifdef WHOIS_SERVER
while ((i = getopt(argc,argv,"h:")) != EOF) {
extern char *optarg;
switch (i) {
case 'h':
host = optarg;
break;
default:
fprintf(stderr,"Usage: %s [-h host] name\n", Progname);
exit(1);
}
}
#endif
*(cp = buf) = '\0';
for (i = optind; i < argc; i++) {
if (i == 1 && !strcmp(argv[i], "-l")) {
strcat(cp, "/W ");
cp += 3;
} else {
strcat(cp, argv[i]);
cp += strlen(argv[i]);
}
}
#ifndef WHOIS_SERVER
if ((cp = strrchr(buf, '@')) != NULL) {
*cp = '\0';
host = cp + 1;
} else {
if ((cp = getenv("ORIG_FINGER")) == NULL) cp = ORIG_FINGER;
execvp(cp, argv);
fprintf(stderr, "Unable to run %s\n", cp);
exit(1);
}
#endif
sin.sin_family = AF_INET;
if ((sp = getservbyname(service, "tcp")) == NULL) {
if ((v = atoi(service)) == 0) {
fprintf(stderr, "%s: unknown service '%s'\n", Progname, service);
exit(1);
}
sin.sin_port = htons((short) v);
} else {
sin.sin_port = sp->s_port;
}
if ((hp = gethostbyname(host)) == NULL) {
if ((l = inet_addr(host)) == -1) {
fprintf(stderr, "%s: unknown host '%s'\n", Progname, host);
exit(1);
}
/* you are out of luck if your system doesn't use 2's */
/* complement in integer representation */
sin.sin_addr.s_addr = l ;
} else {
for (i = 0; (i < 20) && *hp->h_addr_list; i++, hp->h_addr_list++)
memcpy(&(dstaddr[i].s_addr), *hp->h_addr_list, hp->h_length);
dstaddr[i].s_addr = 0;
i = 0;
sin.sin_addr.s_addr = dstaddr[i++].s_addr;
}
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
sprintf(msg, "%s: socket", Progname);
perror(msg);
exit(1);
}
while (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
if ((errno == ETIMEDOUT) && (hp != NULL) &&
((sin.sin_addr.s_addr = dstaddr[i++].s_addr) != 0)) {
continue;
}
sprintf(msg, "%s: connect", Progname);
perror(msg);
exit(1);
}
strcat(buf, "\r\n");
if (write(s,buf,strlen(buf)) < 0) {
sprintf(msg, "%s: write", Progname);
perror(msg);
}
while ((n = read(s, buf, sizeof(buf) - 1)) > 0) {
write(1, buf, n);
}
close(s);
return 0;
}