1: /* 2: * Copyright (c) 1989 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n"; 9: static char SccsId[] = "@(#)@(#)pop_init.c 2.1 2.1 3/18/91"; 10: #endif not lint 11: 12: #include <errno.h> 13: #include <stdio.h> 14: #include <sys/types.h> 15: #include <sys/socket.h> 16: #include <netinet/in.h> 17: #include <netdb.h> 18: #include <arpa/inet.h> 19: #include "popper.h" 20: 21: extern int errno; 22: 23: /* 24: * init: Start a Post Office Protocol session 25: */ 26: 27: pop_init(p,argcount,argmessage) 28: POP * p; 29: int argcount; 30: char ** argmessage; 31: { 32: 33: struct sockaddr_in cs; /* Communication parameters */ 34: struct hostent * ch; /* Client host information */ 35: int errflag = 0; 36: int c; 37: int len; 38: extern char * optarg; 39: int options = 0; 40: int sp = 0; /* Socket pointer */ 41: char * trace_file_name; 42: 43: /* Initialize the POP parameter block */ 44: bzero ((char *)p,(int)sizeof(POP)); 45: 46: /* Save my name in a global variable */ 47: p->myname = argmessage[0]; 48: 49: /* Get the name of our host */ 50: (void)gethostname(p->myhost,MAXHOSTNAMELEN); 51: 52: /* Open the log file */ 53: #ifdef SYSLOG42 54: (void)openlog(p->myname,0); 55: #else 56: (void)openlog(p->myname,POP_LOGOPTS,POP_FACILITY); 57: #endif 58: 59: /* Process command line arguments */ 60: while ((c = getopt(argcount,argmessage,"dt:")) != EOF) 61: switch (c) { 62: 63: /* Debugging requested */ 64: case 'd': 65: p->debug++; 66: options |= SO_DEBUG; 67: break; 68: 69: /* Debugging trace file specified */ 70: case 't': 71: p->debug++; 72: if ((p->trace = fopen(optarg,"a+")) == NULL) { 73: pop_log(p,POP_PRIORITY, 74: "Unable to open trace file \"%s\", err = %d", 75: optarg,errno); 76: exit(-1); 77: } 78: trace_file_name = optarg; 79: break; 80: 81: /* Unknown option received */ 82: default: 83: errflag++; 84: } 85: 86: /* Exit if bad options specified */ 87: if (errflag) { 88: (void)fprintf(stderr,"Usage: %s [-d]\n",argmessage[0]); 89: exit(-1); 90: } 91: 92: /* Get the address and socket of the client to whom I am speaking */ 93: len = sizeof(cs); 94: if (getpeername(sp,(struct sockaddr *)&cs,&len) < 0){ 95: pop_log(p,POP_PRIORITY, 96: "Unable to obtain socket and address of client, err = %d",errno); 97: exit(-1); 98: } 99: 100: /* Save the dotted decimal form of the client's IP address 101: in the POP parameter block */ 102: p->ipaddr = inet_ntoa(cs.sin_addr); 103: 104: /* Save the client's port */ 105: p->ipport = ntohs(cs.sin_port); 106: 107: /* Get the canonical name of the host to whom I am speaking */ 108: ch = gethostbyaddr((char *) &cs.sin_addr, sizeof(cs.sin_addr), AF_INET); 109: if (ch == NULL){ 110: pop_log(p,POP_PRIORITY, 111: "Unable to get canonical name of client, err = %d",errno); 112: p->client = p->ipaddr; 113: } 114: /* Save the cannonical name of the client host in 115: the POP parameter block */ 116: else { 117: 118: #ifndef BIND43 119: p->client = ch->h_name; 120: #else 121: # include <arpa/nameser.h> 122: # include <resolv.h> 123: 124: /* Distrust distant nameservers */ 125: extern struct state _res; 126: struct hostent * ch_again; 127: char * * addrp; 128: 129: /* We already have a fully-qualified name */ 130: _res.options &= ~RES_DEFNAMES; 131: 132: /* See if the name obtained for the client's IP 133: address returns an address */ 134: if ((ch_again = gethostbyname(ch->h_name)) == NULL) { 135: pop_log(p,POP_PRIORITY, 136: "Client at \"%s\" resolves to an unknown host name \"%s\"", 137: p->ipaddr,ch->h_name); 138: p->client = p->ipaddr; 139: } 140: else { 141: /* Save the host name (the previous value was 142: destroyed by gethostbyname) */ 143: p->client = ch_again->h_name; 144: 145: /* Look for the client's IP address in the list returned 146: for its name */ 147: for (addrp=ch_again->h_addr_list; *addrp; ++addrp) 148: if (bcmp(*addrp,&(cs.sin_addr),sizeof(cs.sin_addr)) == 0) break; 149: 150: if (!*addrp) { 151: pop_log (p,POP_PRIORITY, 152: "Client address \"%s\" not listed for its host name \"%s\"", 153: p->ipaddr,ch->h_name); 154: p->client = p->ipaddr; 155: } 156: } 157: #endif BIND43 158: } 159: 160: /* Create input file stream for TCP/IP communication */ 161: if ((p->input = fdopen(sp,"r")) == NULL){ 162: pop_log(p,POP_PRIORITY, 163: "Unable to open communication stream for input, err = %d",errno); 164: exit (-1); 165: } 166: 167: /* Create output file stream for TCP/IP communication */ 168: if ((p->output = fdopen(sp,"w")) == NULL){ 169: pop_log(p,POP_PRIORITY, 170: "Unable to open communication stream for output, err = %d",errno); 171: exit (-1); 172: } 173: 174: pop_log(p,POP_PRIORITY, 175: "(v%s) Servicing request from \"%s\" at %s\n", 176: VERSION,p->client,p->ipaddr); 177: 178: #ifdef DEBUG 179: if (p->trace) 180: pop_log(p,POP_PRIORITY, 181: "Tracing session and debugging information in file \"%s\"", 182: trace_file_name); 183: else if (p->debug) 184: pop_log(p,POP_PRIORITY,"Debugging turned on"); 185: #endif DEBUG 186: 187: return(POP_SUCCESS); 188: }