|
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 p
Length: 3003 (0xbbb) Types: TextFile Names: »popper.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦ac17ffda3⟧ »EurOpenD3/mail/popper-1.7b1.tar.Z« └─⟦d6ac5563a⟧ └─⟦this⟧ »popper.c«
/* * 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) 1989 Regents of the University of California.\n\ All rights reserved.\n"; static char SccsId[] = "@(#)popper.c 1.6 5/15/90"; #endif not lint #include <stdio.h> #include <sys/types.h> #include "popper.h" extern state_table * pop_get_command(); /* * popper: Handle a Post Office Protocol version 3 session */ main (argc, argv) int argc; char ** argv; { POP p; state_table * s; char message[MAXLINELEN]; /* 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;) { /* Obtain a line from the client */ if (fgets(message,MAXLINELEN,p.input) == NULL) { p.CurrentState = error; pop_msg(&p,POP_FAILURE,"POP server at %s signing off.",p.myhost); } else { /* Search for the command in the command/state table */ if ((s = pop_get_command(&p,message)) == NULL) continue; /* Call the function associated with this command in the current state */ if (s->function) p.CurrentState = s->result[(*s->function)(&p)]; /* Otherwise assume NOOP and send an OK message to the client */ 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(); } #ifdef STRNCASECMP /* * Perform a case-insensitive string comparision */ #include <ctype.h> 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 STRNCASECMP