Initial revision
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
188
appl/popper/pop_init.c
Normal file
188
appl/popper/pop_init.c
Normal file
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
* 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) 1990 Regents of the University of California.\nAll rights reserved.\n";
|
||||
static char SccsId[] = "@(#)@(#)pop_init.c 2.1 2.1 3/18/91";
|
||||
#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 */
|
||||
int errflag = 0;
|
||||
int c;
|
||||
int len;
|
||||
extern char * optarg;
|
||||
int options = 0;
|
||||
int sp = 0; /* Socket pointer */
|
||||
char * trace_file_name;
|
||||
|
||||
/* Initialize the POP parameter block */
|
||||
bzero ((char *)p,(int)sizeof(POP));
|
||||
|
||||
/* Save my name in a global variable */
|
||||
p->myname = argmessage[0];
|
||||
|
||||
/* Get the name of our host */
|
||||
(void)gethostname(p->myhost,MAXHOSTNAMELEN);
|
||||
|
||||
/* Open the log file */
|
||||
#ifdef SYSLOG42
|
||||
(void)openlog(p->myname,0);
|
||||
#else
|
||||
(void)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) {
|
||||
(void)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);
|
||||
}
|
Reference in New Issue
Block a user