Initial revision

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Björn Groenvall
1992-05-05 22:35:44 +00:00
parent 2ea6910976
commit 3ee6e108c0
3 changed files with 378 additions and 0 deletions

188
appl/popper/pop_init.c Normal file
View 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);
}