|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 5980 (0x175c) Types: TextFile Names: »pop_init.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦ac17ffda3⟧ »EurOpenD3/mail/popper-1.7b1.tar.Z« └─⟦d6ac5563a⟧ └─⟦this⟧ »pop_init.c«
/* * Copyright (c) 1989 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #ifndef lint static char copyright[] = "@(#) Copyright (c) 1989 Regents of the University of California.\n\ All rights reserved.\n"; static char SccsId[] = "@(#)pop_init.c 1.10 5/15/90"; #endif not lint #include <errno.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include "popper.h" extern int errno; /* * init: Start a Post Office Protocol session */ pop_init(p,argcount,argmessage) POP * p; int argcount; char ** argmessage; { struct sockaddr_in cs; /* Communication parameters */ struct hostent * ch; /* Client host information */ FILE * input; /* Input from client host */ FILE * output; /* Output to client host */ int errflag = 0; int c; int len; extern char * optarg; extern int optind; int options = 0; int sp = 0; /* Socket pointer */ char * trace_file_name; /* Initialize the POP parameter block */ bzero ((char *)p,sizeof(POP)); /* Save my name in a global variable */ p->myname = argmessage[0]; /* Get the name of our host */ gethostname(p->myhost,MAXHOSTNAMELEN); /* Open the log file */ #ifdef SYSLOG42 openlog(p->myname,0); #else openlog(p->myname,POP_LOGOPTS,POP_FACILITY); #endif /* Process command line arguments */ while ((c = getopt(argcount,argmessage,"dt:")) != EOF) switch (c) { /* Debugging requested */ case 'd': p->debug++; options |= SO_DEBUG; break; /* Debugging trace file specified */ case 't': p->debug++; if ((p->trace = fopen(optarg,"a+")) == NULL) { pop_log(p,POP_PRIORITY, "Unable to open trace file \"%s\", err = %d", optarg,errno); exit(-1); } trace_file_name = optarg; break; /* Unknown option received */ default: errflag++; } /* Exit if bad options specified */ if (errflag) { fprintf(stderr,"Usage: %s [-d]\n",argmessage[0]); exit(-1); } /* Get the address and socket of the client to whom I am speaking */ len = sizeof(cs); if (getpeername(sp,(struct sockaddr *)&cs,&len) < 0){ pop_log(p,POP_PRIORITY, "Unable to obtain socket and address of client, err = %d",errno); exit(-1); } /* Save the dotted decimal form of the client's IP address in the POP parameter block */ p->ipaddr = inet_ntoa(cs.sin_addr); /* Save the client's port */ p->ipport = ntohs(cs.sin_port); /* Get the canonical name of the host to whom I am speaking */ ch = gethostbyaddr((char *) &cs.sin_addr, sizeof(cs.sin_addr), AF_INET); if (ch == NULL){ pop_log(p,POP_PRIORITY, "Unable to get canonical name of client, err = %d",errno); p->client = p->ipaddr; } /* Save the cannonical name of the client host in the POP parameter block */ else { #ifndef BIND43 p->client = ch->h_name; #else # include <arpa/nameser.h> # include <resolv.h> /* Distrust distant nameservers */ extern struct state _res; struct hostent * ch_again; char * * addrp; /* We already have a fully-qualified name */ _res.options &= ~RES_DEFNAMES; /* See if the name obtained for the client's IP address returns an address */ if ((ch_again = gethostbyname(ch->h_name)) == NULL) { pop_log(p,POP_PRIORITY, "Client at \"%s\" resolves to an unknown host name \"%s\"", p->ipaddr,ch->h_name); p->client = p->ipaddr; } else { /* Save the host name (the previous value was destroyed by gethostbyname) */ p->client = ch_again->h_name; /* Look for the client's IP address in the list returned for its name */ for (addrp=ch_again->h_addr_list; *addrp; ++addrp) if (bcmp(*addrp,&(cs.sin_addr),sizeof(cs.sin_addr)) == 0) break; if (!*addrp) { pop_log (p,POP_PRIORITY, "Client address \"%s\" not listed for its host name \"%s\"", p->ipaddr,ch->h_name); p->client = p->ipaddr; } } #endif BIND43 } /* Create input file stream for TCP/IP communication */ if ((p->input = fdopen(sp,"r")) == NULL){ pop_log(p,POP_PRIORITY, "Unable to open communication stream for input, err = %d",errno); exit (-1); } /* Create output file stream for TCP/IP communication */ if ((p->output = fdopen(sp,"w")) == NULL){ pop_log(p,POP_PRIORITY, "Unable to open communication stream for output, err = %d",errno); exit (-1); } pop_log(p,POP_PRIORITY, "(v%s) Servicing request from \"%s\" at %s\n", VERSION,p->client,p->ipaddr); #ifdef DEBUG if (p->trace) pop_log(p,POP_PRIORITY, "Tracing session and debugging information in file \"%s\"", trace_file_name); else if (p->debug) pop_log(p,POP_PRIORITY,"Debugging turned on"); #endif DEBUG return(POP_SUCCESS); }