This is popper.c in view mode; [Download] [Up]
/* * 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[] = "@(#)@(#)popper.c 2.1 2.1 3/18/91"; #endif #include <stdio.h> #include <sys/types.h> #include <signal.h> #include <setjmp.h> #include <ctype.h> #include "popper.h" #ifdef POPSCO #include <sys/security.h> #include <sys/audit.h> #include <prot.h> #endif extern state_table * pop_get_command(); int hangup = FALSE ; int catchSIGHUP(); int pop_timeout = POP_TIMEOUT; int simple_from = FALSE; /* * popper: Handle a Post Office Protocol version 3 session */ main (argc, argv) int argc; char ** argv; { POP p; state_table * s; char message[MAXLINELEN]; char * tgets(); #ifdef POPSCO (void) set_auth_parameters(argc, argv); #endif (void) signal(SIGHUP,(void *)catchSIGHUP); (void) signal(SIGPIPE,(void *)catchSIGHUP); /* Start things rolling */ pop_init(&p,argc,argv); /* Tell the user that we are listenting */ pop_msg(&p,POP_SUCCESS, "UCB Pop server (version %s) at %s starting.",VERSION,p.myhost); /* State loop. The POP server is always in a particular state in which a specific suite of commands can be executed. The following loop reads a line from the client, gets the command, and processes it in the current context (if allowed) or rejects it. This continues until the client quits or an error occurs. */ for (p.CurrentState=auth1;p.CurrentState!=halt&&p.CurrentState!=error;) { if (hangup) { pop_msg(&p,POP_FAILURE,"POP hangup",p.myhost); if (p.CurrentState > auth2 && !pop_updt(&p)) pop_msg(&p,POP_FAILURE,"POP mailbox update failed.",p.myhost); p.CurrentState = error; } else if (tgets(message,MAXLINELEN,p.input,pop_timeout) == NULL) { pop_msg(&p,POP_FAILURE,"POP timeout",p.myhost); if (p.CurrentState > auth2 && !pop_updt(&p)) pop_msg(&p,POP_FAILURE,"POP mailbox update failed!",p.myhost); p.CurrentState = error; } else if ((s = pop_get_command(&p,message)) != NULL) { if (s->function != NULL) { p.CurrentState = s->result[(*s->function)(&p)]; } else { p.CurrentState = s->success_state; pop_msg(&p,POP_SUCCESS,NULL); } } } /* Say goodbye to the client */ pop_msg(&p,POP_SUCCESS,"Pop server at %s signing off.",p.myhost); /* Log the end of activity */ pop_log(&p,POP_PRIORITY, "(v%s) Ending request from \"%s\" at %s\n",VERSION,p.client,p.ipaddr); /* Stop logging */ closelog(); return(0); } jmp_buf env; /* * fgets, but with a timeout */ char *tgets(str,size,fp,timeout) char *str; int size; FILE *fp; int timeout; { int ring(); (void) signal(SIGALRM, (void *)ring); alarm(timeout); if (setjmp(env)) str = NULL; else str = fgets(str,size,fp); alarm(0); signal(SIGALRM,SIG_DFL); return(str); } int ring() { longjmp(env,1); } #ifdef STRNCASECMP /* * Perform a case-insensitive string comparision */ strncasecmp(str1,str2,len) register char * str1; register char * str2; register int len; { register int i; char a, b; for (i=len-1;i>=0;i--){ a = str1[i]; b = str2[i]; if (isupper(a)) a = tolower(str1[i]); if (isupper(b)) b = tolower(str2[i]); if (a > b) return (1); if (a < b) return(-1); } return(0); } #endif int catchSIGHUP() { extern int hangup ; hangup = TRUE ; /* This should not be a problem on BSD systems */ signal(SIGHUP, (void *)catchSIGHUP); signal(SIGPIPE, (void *)catchSIGHUP); } /* * $Author: mark $ $Date: 1994/08/04 17:28:09 $ * $Header: /local/src/popper/npopper/qpopper2.1.1/RCS/popper.c,v 1.5 1994/08/04 17:28:09 mark Exp mark $ * $Revision: 1.5 $ */ #ifdef POPSCO /* * Ftruncate() for non-BSD systems. * * This module gives the basic functionality for ftruncate() which * truncates the given file descriptor to the given length. * ftruncate() is a Berkeley system call, but does not exist in any * form on many other versions of UNIX such as SysV. Note that Xenix * has chsize() which changes the size of a given file descriptor, * so that is used if M_XENIX is defined. * * Since there is not a known way to support this under generic SysV, * there is no code generated for those systems. * * SPECIAL NOTE: On Xenix, using this call in the BSD library * will REQUIRE the use of -lx for the extended library since chsize() * is not in the standard C library. * * By Marc Frajola, 3/27/87 */ #include <fcntl.h> ftruncate(fd,length) int fd; /* File descriptor to truncate */ off_t length; /* Length to truncate file to */ { int status; /* Status returned from truncate proc */ status = chsize(fd,length); /* status = -1; NON-XENIX SYSTEMS CURRENTLY NOT SUPPORTED */ return(status); } #endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.