|
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 u
Length: 3156 (0xc54) Types: TextFile Names: »util.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦5c79bab04⟧ »EurOpenD3/mail/pop/pop3d.tar.Z« └─⟦150fd6a32⟧ └─⟦this⟧ »util.c«
/* * pop3d - IP/TCP/POP3 server for UNIX 4.3BSD * Post Office Protocol - Version 3 (RFC1081) * * Katie Stevens * dkstevens@ucdavis.edu * Computing Services * University of California, Davis * ************************************** * * util.c * * REVISIONS: * 02-27-90 [ks] original implementation * 1.000 03-04-90 [ks] */ #include <stdio.h> #include <ctype.h> #include <string.h> #include <pwd.h> #include "pop3.h" char flash_buf[SVR_BUFSIZ]; #ifdef DEBUG extern FILE *logfp; #endif /**************************************************************************/ /* Verify a usercode/password */ int verify_user(user,pass) char *user; char *pass; { struct passwd *pwd; char *cp; pwd = getpwnam(user); if (pwd == NULL) return -1; cp = crypt(pass,pwd->pw_passwd); if (strcmp(cp,pwd->pw_passwd) == 0) { return(setuid(pwd->pw_uid)); } else { return(-1); } } /**************************************************************************/ /* Read a line of text from a stream. If more than n-1 */ /* characters are read without a line terminator (LF), */ /* discard characters until line terminator is located. */ char * fgetl(buf,n,fp) char *buf; /* Buffer for text */ int n; /* Size of buffer */ FILE *fp; /* Stream to read from */ { if (fgets(buf,n,fp) == NULL) return(NULL); if ((strlen(buf) == (n-1))&&(buf[n-1] != LF_CHAR)) { buf[n-1] = LF_CHAR; while (fgets(flash_buf,SVR_BUFSIZ,fp) != NULL) { if (strlen(flash_buf) != (SVR_BUFSIZ-1)) break; if (flash_buf[SVR_BUFSIZ-1] == LF_CHAR) break; } } return(buf); } /* Prepare client command for server */ void cmd_prepare(buf) char *buf; { char *cp; if (buf == NULL) return; /* Convert command verb to lowercase */ while (*buf != NULL_CHAR) { if (isupper(*buf)) *buf = tolower(*buf); else if (isspace(*buf)) break; ++buf; } /* Strip trailing whitespace from client command */ if ((cp = strchr(buf,CR_CHAR)) != NULL) { while ((cp != buf)&&(isspace(*cp))) --cp; if (!isspace(*cp)) ++cp; *cp = NULL_CHAR; } if ((cp = strchr(buf,LF_CHAR)) != NULL) { while ((cp != buf)&&(isspace(*cp))) --cp; if (!isspace(*cp)) ++cp; *cp = NULL_CHAR; } return; } /**************************************************************************/ /* Send an error message and exit POP3 server */ void fail(err) int err; { char *cp; switch(err) { case FAIL_FILE_ERROR: /* File I/O error */ cp = "File I/O error"; break; case FAIL_HANGUP: /* Client hung up on us */ cp = "Lost connectino to client"; break; case FAIL_LOST_CLIENT: /* Timeout waiting for client */ cp = "Timeout waiting for command from client"; break; case FAIL_OUT_OF_MEMORY: /* Failed malloc() */ cp = "Out of memory!"; break; case FAIL_PROGERR: /* Fatal program error */ cp = "Fatal program error!"; break; case FAIL_CONFUSION: /* Shouldnt happen */ default: cp = "Complete confusion!"; break; } fprintf(stdout,"-ERR POP3 Server Abnormal Shutdown: %s\r\n",cp); fflush(stdout); #ifdef DEBUG fprintf(logfp,"-ERR POP3 Server Abnormal Shutdown: %s\r\n",cp); fclose(logfp); #endif exit(err); /* Exit with error */ }