fw~ POPPER1.BCKw. POPPER1.BCKZBACK/LOG [BIWINE.POPPER.BE]*.*,[BIWINE.POPPER.FE]*.* $$3:[NETDIST.PUB]POPPER1.BCK/SAVE/NEW SYSTEM @aډxV5.3 _VAXSAR::  _$2$DUA3: V5.3 ~  *[BIWINE.POPPER.BE]AAA.README;3+,{T./ 4I(-%B0123KPWO56}d7 }d89GHJ$Files available at vaxsar.vassar.edu1. POPPER.BCKGVMS backup save set containing files for VMS POP3 server. We have beenHrunning this server under VMS 5.3-1 for several months. It will not runAwith VMS 5.4 due to changes in the password encryption algorithm.FThe VMS POP3 server is based on the Berkeley Popper. It uses callableGVMS mail. There are 2 executables. A front end (fe.exe) which listensDon the POP3 port (110), and a back end (be.exe) which does the work.FThe 2 processes communicate by way of a VMS mailbox. This was done toFavoid the overhead of process creation for each client session. Also,Ea variable number of back end daemons may be running at the same timeIif needed. Logging of client activity is provided. The logical "POPLOG"Hmust be defined (system-wide) as the log file directory. Also, "SYSUAF" and "VMSMAIL" must be defined. BPrograms are written in C, with one Fortran and one Macro routine.$Object and executables are included.Your comments are welcome. Bill Winebiwine@vassar.edu *[BIWINE.POPPER.BE]ADDMAILDEF.H;1+,%. / 4# -%B0123KPWO 56w7 Pa]89GHJ#define MAIL$_FACILITY 126#define MAIL$_CODERR 8290316#define MAIL$_UPGRADE 8290324 #define MAIL$_UAFGETERR 8290330 #define MAIL$_UAFOPNERR 8290338 #define MAIL$_NOSUCHUSR 8290346 #define MAIL$_NOTREADIN 8290354#define MAIL$_LOGLINK 8290362 #define MAIL$_CREPRIJOB 8290370#define MAIL$_SENDERR 8290378 #define MAIL$_NOMOREMSG 8290386#define MAIL$_NOMSGS 8290394#define MAIL$_USERSPEC 8290402 #define MAIL$_SENDABORT 8290410#define MAIL$_EDITPROC 8290418#define MAIL$_INVCMD 8290426#define MAIL$_NOTFOUND 8290434#define MAIL$_NETIOERR 8290442 #define MAIL$_USERDSABL 8290450#define MAIL$_FORWLOOP 8290458 #define MAIL$_NAMTOOBIG 8290466#define MAIL$_ILLCHAR 8290474 #define MAIL$_DATIMUSED 8290482#define MAIL$_NOTISAM 8290490#define MAIL$_DELMSG 8290498#define MAIL$_DELWASTE 8290506#define MAIL$_NOFOLDER 8290514#define MAIL$_NOTEXIST 8290522 #define MAIL$_NOTSUBDIR 8290530 #define MAIL$_ILLSUBDIR 8290538 #define MAIL$_ILLFOLNAM  8290546#define MAIL$_NOMSGPRI 8290554 #define MAIL$_ALTPRIJOB 8290562 #define MAIL$_ILLPERNAM 8290570"#define MAIL$_NOSUCHUSRAT 8290578 #define MAIL$_SENDERRAT 8290586#define MAIL$_CONABORT 8290594 #define MAIL$_NOTCALEDT 8290602##define MAIL$_FILECONFUSED 8290610#define MAIL$_CAPTIVE 8290618 #define MAIL$_IVPROTVAL 8290626#define MAIL$_RECTOBIG 8290634 #define MAIL$_ILLCTXADR 8290642#define MAIL$_WRONGCTX 8290650 #define MAIL$_FAILGETVM 8290658 #define MAIL$_INVITMCOD 8290666 #define MAIL$_MISREQITM 8290674 #define MAIL$_INVITMLEN 8290682#define MAIL$_FILEOPEN 8290690!#define MAIL$_NOFILEOPEN 8290698 #define MAIL$_CONITMCOD 8290706 #define MAIL$_NOMORECTX 8290714 #define MAIL$_WRONGFILE 8290722#define MAIL$_ILLTPRT 8290730 #define MAIL$_INVITMVAL 8290738#define MAIL$_ERACTED 8290746#define MAIL$_FORMSG 8290754 #define MAIL$_NOTFORMSG 8290762 #define MAIL$_ERRACTRNS 8290770#define MAIL$_BADVALUE 8290778#define MAIL$_CLOSEDEL 8290786 #define MAIL$_FILNOTDEL 8290794#define MAIL$_OPENIN 8290802#define MAIL$_OPENOUT 8290810 #define MAIL$_PARSEFAIL 8290818#define MAIL$_READERR 8290826!#define MAIL$_SEARCHFAIL 8290834#define MAIL$_SYSERROR 8290842#define MAIL$_NOSYSNAM 8290850#define MAIL$_NOSYSPRV 8290858#define MAIL$_PROTOCOL 8290866!#define MAIL$_NOACCPTMSG 8290874#define MAIL$_SELECTED 8306307#define MAIL$_DELMSGS 8306315#define MAIL$_CVTFILE 8306323#define MAIL$_DELSPACE 8306331 #define MAIL$_NEWFOLDER 8306339"#define MAIL$_RECLPLSWAIT 8306347#define MAIL$_REENTER 8306355#define MAIL$_MOREMSG 8314304#define MAIL$_DIRHD0 8314312#define MAIL$_DIRHD10 8314320#define MAIL$_DIRHD20 8314328#define MAIL$_DIRDEL10 8314336#define MAIL$_ISUB10 8314344#define MAIL$_ISUB20 8314352#define MAIL$_ISUB30 8314360#define MAIL$_PRESRET 8314368!#define MAIL$_YOUHAVENEW 8314376#define MAIL$_MAIL10 8314384#define MAIL$_MAIL20 8314392 #define MAIL$_WANTOSEND 8314400#define MAIL$_NOTIFY10 8314408#define MAIL$_NOTIFY20 8314416!#define MAIL$_JOBENTERED 8314424#define MAIL$_SHOW10 8314432#define MAIL$_SHOW20 8314440#define MAIL$_SHOW30 8314448#define MAIL$_SHOW40 8314456#define MAIL$_SHOW50 8314464#define MAIL$_SHOW60 8314472#define MAIL$_SHOW70 8314480#define MAIL$_SHOW80 8314488#define MAIL$_SHOW90 8314496#define MAIL$_SHOW100 8314504#define MAIL$_SHOW110 8314512#define MAIL$_EDIT10 8314520#define MAIL$_INFO10 8314528#define MAIL$_INFO20 8314536#define MAIL$_INFO30 8314544#define MAIL$_SEND 8314552#define MAIL$_REPLY 8314560#define MAIL$_SHOW120 8314568#define MAIL$_SHOW130 8314576#define MAIL$_INFO50 8314584#define MAIL$_SHOW140 8314592#define MAIL$_SHOW150 8314600#define MAIL$_SHOW160 8314608#define MAIL$_ISUB50 8314616#define MAIL$_MAIL30 8314624#define MAIL$_RETCONT 8314632#define MAIL$_NEWSEQ 8314640#define MAIL$_MAILDIR 8314648#define MAIL$_MAILFILE 8314656!#define MAIL$_MAILFOLDER 8314664#define MAIL$_MAIL40 8314672!#define MAIL$_CRENEWFOLD 8314680 #define MAIL$_NONEWMAIL 8314688 #define MAIL$_SHOWKEY10 8314696 #define MAIL$_SHOWKEY20 8314704 #define MAIL$_SHOWKEY30 8314712 #define MAIL$_SHOWKEY40 8314720 #define MAIL$_SHOWKEY50 8314728 #define MAIL$_SHOWKEY60 8314736 #define MAIL$_SHOWKEY70 8314744#define MAIL$_NOTIFY30 8314752#define MAIL$_NOTIFY40 8314760#define MAIL$_NOPARENT 8314768#define MAIL$_FILEMPTY 8314776 #define MAIL$_NONEFOUND 8314784 #define MAIL$_NOMOREREC 8314792#define MAIL$_USERFWD 8314800#define MAIL$_PROMPT 8314808#define MAIL$_INFO12 8314816#define MAIL$_INFO14 8314824#define MAIL$_INFO16 8314832#define MAIL$_INFO18 8314840!#define MAIL$_CRENEWFILE 8314848#define MAIL$_SHOW15 8314856#define MAIL$_SHOW25 8314864#define MAIL$_SHOW35 8314872#define MAIL$_FORWARD 8314880#define MAIL$_SHOW200 8314888#define MAIL$_SHOW205 8314896#define MAIL$_SHOW210 8314904#define MAIL$_SHOW215 8314912#define MAIL$_CLOSEIN 8314920#define MAIL$_CLOSEOUT 8314928 #define MAIL$_INVQUAVAL 8314936#define MAIL$_WRITEERR 8314944#define MAIL$_SHOW220 8314952#define MAIL$_SHOW225 8314960#define MAIL$_MSGTEXT 8322305#define MAIL$_MSGINFO 8322313#define MAIL$_MSGSENT 8322321 #define MAIL$_MSGSENTAT 8322329#define MAIL$_YES 8322337#define MAIL$_COPIEDR 8322345#define MAIL$_CREATED 8322353#define MAIL$_RENAMED 8322361#define MAIL$_TEXT 8322369*[BIWINE.POPPER.BE]BE.EXE;21+,.0/ 401-%B0123 KPWO156!0j7Њ0j89GHJZ0DX0205(.jLh&)BEV1.0.j05-05%&& ' ? ! VAXCRTL_001! LIBRTL_001! MTHRTL_001B!d FORRTL_001 j! MAILSHR_001!@! MAILSHRP_001vmsmailPOPMBXPOPCEF0 00:00:30.00Openlog failedp.debug = %dLog file openProcess name: %sHostname: %sCannot assign to mbxCannot ascefcCannot open vmsmailCannot open sysuafPopInit Failed, continuingVMS Pop server (version %s) at %s starting.1.0POP server at %s signing off.Pop server at %s signing off.Request count = %dTimeoutMessage %d does not exist.Message %d has already been deleted.Message %d has been deleted.Can't startcnt for '%s'Can't startcnt for '%s', %dCan't build message list for '%s': Out of memoryMsg %d at id %d is %d octets long and has %u lines.userpassquitquitstatlistretrdelenooprsettoplastxtndquitpassReceived: "%s xxxxxxxxx"Received: "%s"Too few arguments for the %s command.Too many arguments for the %s command.Unknown command: "%s".xmitToo few arguments for the %s %s command.Too many arguments for the %s %s command.Unknown command: "%s %s".My_accept failed, sts = %dGetpeername failed, err = %dServicing request from %s at %s%u is the last message seen.Message %d does not exist.Message %d has been deleted.%u %u%u messages (%u octets)%u %u . %s +OK%s -ERR%s%s Too many arguments supplied.Logfail: %sPassword supplied for "%s" is incorrect.User: %s has %d messages.%s has %d message(s) (%d octets).Maildrop has %u messages (%u octets)Message %d does not exist.Message %d has been deleted.top%u octetsMess: %d,%d,%d. ..Sending line "%s" %u %uPerforming maildrop update...Message %d, del flag %dPassword required for %s.XMIT not supported.qiosts: %x,%x,%xSTOPStopassign failed: device = %s, status = %d new connection,socket=%dsetef failed: status = %dsysuafsys$system:.datCOPYIT: user begun COPYIT: maildir: %s, new: %d MAIL.MAICOPYIT: maildir-full: %s COPYIT: mailfile open %s COPYIT: message begun NEWMAILNEWMAILCOPYIT: messages selected %d Date: From:%s Tmp: '%s' "No end quote in pname No end quote in uname ::%s <%s><%s>%s Subj:Subject: %sMAIL START: %s END: %s %s: %s Zero length prcnam: %d poplog:pop_%s.log;0wCannot open logfile: %s %d.%d.%d.%dLNM$SYSTEM_TABLEARPANET_HOST_NAME[unknown] Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_get_command.c 1.9 8/16/90L5QP1V2[2` 5eH.jt2o)ty(2~t2(.c685Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_get_subcommand.c 1.5 7/13/90$T6Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_last.c 1.5 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_list.c 1.5 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_lower.c 1.6 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_msg.c 1.7 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_parse.c 1.5 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_quit.c 1.5 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_rset.c 1.5 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_send.c 1.7 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_stat.c 1.5 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_user.c 1.5 7/13/90Copyright (c) 1990 Regents of the University of California. All rights reserved. @(#)pop_xtnd.c 1.5 7/13/90 INFODEBUGERROR ` \u u @(x\%p% d^&V~YP<~f%fPs&b&fffݦSc<߭cXP|~?PPPvcs%|~@~@PRPV :%P=\%P/:%2~fP 1.fSΆ Έ[hZ|<~WSUTS1XP|~XjޜP(i2T~Q2UPPQ~okPRi|~jiR SW2PR+2UQ2RPPQQU2TQ2RPPQQTS2UPP@ SSW=2WSΆ8fތW W#XPPfPR<ТSfc@SPТSfވ2WRSRSΆΆ1fqF߭l#2o~1X^2P ^-SBRH2o~`P^]TЬR{"PSS[SdRSRRЬPBWRբSߤPЬP_gcSScSߤ@PT^-VЬR|[|ck?PfRЬR2[[!PW[ߦ4RSެWgRWT2RSRGЧU߭߭TSSdŏPЭЭ |ŏPRRk2RSRެWgUS[e8S4RWTR[&gSݤݤݤ dߦeRTR[P^UWЬRռ R ЬSRSPËPЬRbGߥEw PwߥJF# P@ߥc!ާvSգoެVЦTwݣZ PMfRcSCЬR‹wߥrRRЬR‹ wŘR2SPSգЬRwſR<^]TRޢzScoU{cPRЬQPP{wߤQЬQPP{wߤ.QSPScЬS{wߤXSh,^)W2~߭PSSS  SgSP߭ݭP}ߧ}PЬV^(nsP <~ P ЭoЭs ߧ8+P^ЬPcP<^UЬR‹c{FPTT[TeRCTRRЬSBWRբTߥSݢTߥ8ݬЬTgk~_[~ߥ>T[RWSR@Pգ0ݣcߥV߭߭P߭ЬPsRSRߥ^ЬRsP ^ެQQQP`RQSSP`PSPSR ^SЬRb bPPP@c b~PbRb^SެQQQP`UQQP`WQTTP`VRWߣcRߣ ߣRyR|PRV TVRXTeWߣWߣߣPsWP< ^UTSRcPPP@dPScPPP@dcUReݬPЬPSBwcPPP@dcPScPPP@dccRPRPЬSwERP ^USЬR=PPH{P"cߣ RݬPP[ЬRc[ߣ5ak[ߣOR^ЬPW WP^ЬQ[PWRP ԢPRPЬR_|ck[RW|μ^UЬS{PRR[ReSRSSЬTCWVզRߥTߥ8ЬSwPPS PSݦߥ<ЬTTdݦ ݦRߥFЦ ߭ P iЬV00TޥYRTRߥ[s ݮ4 P`ݮ0Pݮ4sfݮ0ߥ]ߥosc߭9 P1IVS SRSR~ЬT44PޥYRPR ߥ[sf ݮ8pP`ݮ4|Pݮ8sfdݮ4ߥ]ߥosf߭P1uߥUЬRsP^TRޤYPRPߤ[ЬRsw ЬSSP`SPSЬRsFbSߤ]XߤoЬRs ^ЬQgk~_[~Q^Uռ e|VRެXhSR[STRP@WSУ dݣcߥգ߭i V ߭ WRR[2VS2WRRSSV2V~ЬRi R(^ЬR{R^ЬR{hRPPР Rݬbݬu^ݬ]^STRWVU|~|~ f|~b12~ Pe%2~2b~ecw2dffߣPߣQ P|~?gdPPeP%dP@fefߣ$@~eP2g~ߣD@~PePeߣ]2geP^%WXV\(Pl(Df4g,5ާ0Џ $l<5lPhPhPf^]^IVUTXSЬRbPb~ PbRbЬRbb~PbRbЬ0ݬ&P4cPfPfPfd\ݬPeЬ2f~h~eTPѾЮRЮWѧPPffP^PЬRb~>PbR^RЬQЬPa` ѡRRP^ЬP` ЬЬ^2P ^=S6T?UXVYWZ[|~|~hhh^PfPfPݬ< ~ݬ2P~eIRb|~|~ bigX|~<~f Rb|~|~ bЬTTЬWW<5~~eb|~|~ bef PhP1tdRBg,1WûP1 ~TyPR(RTb Pr Rb"TP)`%RPRRQa q Qa"RPRR"R@P%`! PRRPRT+TP``, `P`RT~ ^R ~ J BЬRR P+R~ R gP ^Sݬ<~c$Rb|~|~ b|~|~bwcK P |^UUNVWR@T< ~2~bSc'd d< ~d 2P~ cݬ<~c<~$c|~<~0c|~|~<c<3~fc|~|~ cfbk P-^]T~SSU WEXNVgլ\2dP¬PPddݬ< ~ݬ 2P~cRb?d< ~ b|~|~bech` Pgee$ feef eef heeh PggPH0[ ЫPHT[k H[}PQPk ` "~~t b _ P$P QaQ2QP|^9RUSVެTd.|~?cHP2cP@eebfS Od/|~?cHPO2cP@eeߢ f ݬdP@ߢf 2P^RST|~|~Pߢ PP@cЬPccߢ7d ߢKdw P|dߢM P2P^YJ P ^ЬPЬQˏPRSSQ ˏPRQQ `PQQSSQ^PˏP~PˏP~PˏP~PˏP~P<^TUkSЬRdݭPޤݭPꛏ@ce>c韭꟭P 2P@ePߤ#RteRiP ^|~|~ݬ ݬ|~߭<~ݬ PQˏQR^^V}f ,f  f~T~T P~Q $PaQ}Pd|d~SVS dP#include #include #include "popper.h"/* E * dropinfo: Extract information about the POP maildrop and store ) * it for use by the other POP routines. */pop_dropinfo(p)POP * p;{K MsgInfoList * mp; /* Pointer to message D info list */H register int msg_num; /* Current message B counter */ short new; int size, sts, id;J /* Initialize maildrop status variables in the POP parameter block */ p->msg_count = 0; p->msgs_deleted = 0; p->last_msg = 0; p->bytes_deleted = 0; p->drop_size = 0; sts = startcnt(p->user,&new); if ( !(sts&1) ) {C return pop_msg (p,POP_FAILURE,"Can't startcnt for '%s'", p->user);@ pop_log(POP_ERROR, "Can't startcnt for '%s', %d", p->user,sts); } p->msg_count = new;= /* Allocate memory for message information structures */O p->mlp = (MsgInfoList *)calloc((unsigned)p->msg_count,sizeof(MsgInfoList)); if (p->mlp == NULL){ p->msg_count = 0;& return pop_msg (p,POP_FAILURE,I "Can't build message list for '%s': Out of memory", p->user); }C /* Scan the folder, loading the message information list with ) information about each message */7 for (msg_num = 0, mp = p->mlp - 1; msg_num < new; ) { sts = getcnt(&id,&size); ++mp; ++msg_num; mp->number = msg_num; mp->length = 80*size; mp->lines = size; mp->offset = id; mp->del_flag = FALSE; mp->retr_flag = FALSE; p->drop_size += 80*size; } p->msg_count = msg_num;! if(p->debug && msg_num > 0) { register i;= for (i = 0, mp = p->mlp; i < p->msg_count; i++, mp++) pop_log(POP_DEBUG,F "Msg %d at id %d is %d octets long and has %u lines.",@ mp->number,mp->offset,mp->length,mp->lines); } return(POP_SUCCESS);}#*[BIWINE.POPPER.BE]BE_DROPINFO.OBJ;1+,a./ 4 -%B0123KPWO56Ppxd7mxd89GHJ8 BE_DROPINFOV1.028-MAR-1991 11:31VAX C V3.1-051R BE_DROPINFO pop_dropinfo r9 GETCNTCALLOCPOP_LOGPOP_MSGSTARTCNT POP_DROPINFO$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO$CHAR_STRING_CONSTANTSPCan't startcnt for '%s'PCan't startcnt for '%s', %d4PCan't build message list for '%s': Out of memoryePMsg %d at id %d is %d octets long and has %u lines.P^VЬR|[|ck?STARTCNTPfRPOP_MSGЬR2[[CALLOCPW[ߦ4RPOP_MSGSެWgRWT2RSRGЧU߭߭GETCNTTSSdŏPЭЭ |ŏPRRk2RSRެWgUS[e8S4RWTR[&gSݤݤݤ dߦePOP_LOGRTR[P!*[BIWINE.POPPER.BE]BE_GETSOCK.C;18+,./ 4E|-%B0123KPWO56#~td7ϥtd89GHJE/* Getsock: Read network device name from pop mailbox, assign channel0* and set common event flag to notify front end.*/#include stdio#include string#include iodef#include "popper.h" extern POP p; int status;char devnam[12];short netchan,iosb[4];struct { int len; char *addr; } devd;int pop_getsock(sp,mbxchan)int *sp;short mbxchan;{; status = sys$qiow(0,mbxchan,IO$_READVBLK,iosb,0,0,devnam, sizeof(devnam)-1,0,0,0,0); if (p.debug)> pop_log(POP_DEBUG,"qiosts: %x,%x,%x",status,iosb[0],iosb[1]); devd.len = (int)iosb[1]; devd.addr = devnam;" if (!strncmp("STOP",devnam,4)) { pop_log(POP_INFO,"Stop"); return POP_STOP; }* status = sys$assign(&devd,&netchan,0,0); if ( !(status&1) ) { devnam[devd.len] = 0;? pop_log(POP_ERROR,"assign failed: device = %s, status = %d\n", devnam,status); sys$setef(64); return status; } if (p.debug)7 pop_log(POP_DEBUG,"new connection,socket=%d",netchan); status = sys$setef(64); if ( !(status&1) )7 pop_log(POP_ERROR,"setef failed: status = %d",status); *sp = (int)netchan; return status;}"*[BIWINE.POPPER.BE]BE_GETSOCK.OBJ;1+,L ./ 4 -%B0123KPWO566yd7l:yd89GHJ7 BE_GETSOCKV1.028-MAR-1991 11:33VAX C V3.1-051iR BE_GETSOCK pop_getsock  P 4STRNCMP SYS$SETEF SYS$ASSIGNPOP_LOGSYS$QIOW POP_GETSOCK $CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOPSTATUS DEVNAMNETCHANIOSBDEVDw$CHAR_STRING_CONSTANTS Pqiosts: %x,%x,%x PSTOP PStop Passign failed: device = %s, status = %d  DPnew connection,socket=%d ]Psetef failed: status = %dP^ S T R W VU|~|~ f|~b12~ SYS$QIOWPe2~2b~ecPOP_LOG2dffߣSTRNCMPPߣPOP_LOG P|~?gd SYS$ASSIGNPeP%dP@fefߣPOP_LOG@~ SYS$SETEFeP2g~ߣDPOP_LOG@~ SYS$SETEFPePeߣ]POP_LOG2geP *[BIWINE.POPPER.BE]BE_POPPER.C;36+,. / 4N -%B0123KPWO 56Oj7@Bj89GHJ/*?* This program is based on the POP3 Unix server written at theE* University of California, Berkeley. The original program has beenF* extensively modified for use on VMS 5.3-1. Some code has been usedH* with little or no change. In those cases, the original UCB copyright* message is included.*D* Modifed for VMS version 5.3-1 by Bill Wine, Vassar College, 1991.* All rights reserved.*E* POP3 back end. Waits for a message (device name) to arrive in the I* POP mailbox. Assigns a channel to the net device, then sets a flag to D* notify the front end program (fe). Gets the username and passwordD* from the client and checks the vmsmail file for the newmail count.?* If non-zero, verifies the password using the pre-5.4 passwordI* algorithm. If valid, uses callable VMS mail to handle client requests.*/#include #include #include "popper.h"#include descrip"static $DESCRIPTOR(mbxd,"POPMBX");"static $DESCRIPTOR(cefd,"POPCEF");0static $DESCRIPTOR(timout_desc,"0 00:00:30.00");int timout[2],requests;int sts,timer_set;void my_ast();POP p;/* ; * popper: Handle a Post Office Protocol version 3 session */main (argc, argv)int argc;char ** argv;{ state_table *s; char message[MAXLINELEN];/ short n,nc,ncl,done,error,loopdone,mbxchan; int hostnamelen; float stime = 0.5;+ /* Initialize the POP parameter block */& bzero ((char *)&p,(int)sizeof(POP)); requests = 0; if (!openlog(&p)) { printf("Openlog failed"); exit(1); } #ifdef DEBUG p.debug = 1;#else p.debug = 0;#endif, pop_log(POP_DEBUG,"p.debug = %d",p.debug);2 if (p.debug) pop_log(POP_DEBUG,"Log file open");0 pop_log(POP_INFO,"Process name: %s",p.myname); hostnamelen = MAXHOSTNAMELEN;% gethostname(p.myhost,&hostnamelen);, pop_log(POP_INFO,"Hostname: %s",p.myhost);( sts = sys$bintim(&timout_desc,timout);' sts = sys$assign(&mbxd,&mbxchan,0,0); if (!(sts&1)) {+ pop_log(POP_ERROR,"Cannot assign to mbx"); exit(sts); }! sts = sys$ascefc(64,&cefd,0,0); if (!(sts&1)) {$ pop_log(POP_ERROR,"Cannot ascefc"); exit(sts); } if (openmail() != 0) {* pop_log(POP_ERROR,"Cannot open vmsmail"); exit(1); }  if (!(openuaf() & 1)) {) pop_log(POP_ERROR,"Cannot open sysuaf"); exit(1); } while (1) { sts = pop_init(&p,mbxchan); if (sts == POP_STOP) break; if ( !(sts&1) ) {1 pop_log(POP_ERROR,"PopInit Failed, continuing"); continue; } requests++;/ /* Tell the user that we are listenting */ pop_msg(&p,POP_SUCCESS,H "VMS Pop server (version %s) at %s starting.",VERSION,p.myhost);G /* State loop. The POP server is always in a particular state in K which a specific suite of commands can be executed. The following K loop reads a line from the client, gets the command, and processes N it in the current context (if allowed) or rejects it. This continues 5 until the client quits or an error occurs. */ p.CurrentState = auth1; loopdone = 0;, /* Obtain a line from the client */ while (!loopdone) { bzero(message,MAXLINELEN); n = nc = done = error = 0; ncl = MAXLINELEN; while (!done) {( sts = sys$setimr(0,timout,my_ast,0,0); timer_set = 1;$ nc=netread(p.input,message+n,ncl); if (timer_set) { sys$cantim(0,0); timer_set = 0; } if (nc < 1) { done++; error++; } else if (nc) { n += nc; ncl -= nc; if (ncl < 1) done++;$ if (message[n-1] == '\n') done++; } } if (error) { p.CurrentState = error; loopdone++;9 pop_msg(&p,POP_FAILURE,"POP server at %s signing off.", p.myhost);" if (p.mlp) free ((char *)p.mlp); endit(p.user,0); } else {D /* Search for the command in the command/state table */D if ((s = pop_get_command(&p,message)) == NULL) continue;B /* Call the function associated with this command in $ the current state */L if (s->function) p.CurrentState = s->result[(*s->function)(&p)];M /* Otherwise assume NOOP and send an OK message to the client */ else {2 p.CurrentState = s->success_state;- pop_msg(&p,POP_SUCCESS,NULL); }? if ((p.CurrentState == error) || (p.CurrentState == halt)) loopdone++; }  }$ /* Say goodbye to the client */E pop_msg(&p,POP_SUCCESS,"Pop server at %s signing off.",p.myhost);" /* Log the end of activity */ syslog(POP_END,0);  lib$wait(&stime); sys$dassgn((short)p.input); } /* end while */4 pop_log(POP_INFO,"Request count = %d",requests); closelog(); closemail(); closeuaf();} void my_ast(){ pop_log(POP_INFO,"Timeout");# sts = sys$cancel((short)p.input); timer_set = 0;}!*[BIWINE.POPPER.BE]BE_POPPER.OBJ;3+, ./ 4 -%B0123KPWO56G j7$j89GHJ6 BE_POPPERV1.0 5-APR-1991 08:53VAX C V3.1-051PPPOPMBXPPPOPCEF P P0 00:00:30.00PPOpenlog failed+Pp.debug = %d8PLog file openFPProcess name: %sWPHostname: %sdPCannot assign to mbxyPCannot ascefcPCannot open vmsmailPCannot open sysuafPPopInit Failed, continuingPVMS Pop server (version %s) at %s starting.P1.0PPOP server at %s signing off.PPop server at %s signing off.5PRequest count = %dHPTimeoutPd^ C$MAIN_ARGS V YP<~fBZERO fOPENLOGPPRINTFEXITff+POP_LOGf8POP_LOGݦFPOP_LOGSc<߭ GETHOSTNAMEWc SYS$BINTIMP |~? SYS$ASSIGNP Pdc EXIT|~@~ SYS$ASCEFCP PyPOP_LOG EXITOPENMAILPPOP_LOGEXITOPENUAFPPOP_LOGEXIT2~fPOP_INITP   1 POP_LOG fPOP_MSGSΆ SYS$SETIMRΈNETREAD[ SYS$CANTIMZPOP_MSG|<~BZEROWSUTS1MY_ASTXP|~XޜP i2T~Q2UPPQ~okPRi|~jiR SW2PR+2UQ2RPPQQU2TQ2RPPQQTS2UPP@ SSW=2WSΆfތW WFREEENDITPPfPOP_GET_COMMANDPR<ТSfc@SPТSfވ2WRSRSΆΆ1R BE_POPPER main my_ast: MY_ASTPRINTFCLOSEUAF CLOSEMAILCLOSELOG SYS$DASSGNLIB$WAITSYSLOGPOP_GET_COMMANDENDITFREE SYS$CANTIMNETREAD SYS$SETIMRPOP_MSGPOP_INITOPENUAFOPENMAIL SYS$ASCEFC SYS$ASSIGN SYS$BINTIM GETHOSTNAMEPOP_LOGEXITOPENLOGBZERO SYS$CANCELPOP_LOG MAIN  MY_AST C$MAIN_ARGS$CODE$DATASTDINSTDOUTSTDERRERRNO{ VAXC$ERRNOP$CHAR_STRING_CONSTANTSTIMOUTREQUESTSSTS TIMER_SETPfPOP_MSGSYSLOG߭LIB$WAIT2o~ SYS$DASSGN1 5POP_LOGCLOSELOG CLOSEMAILCLOSEUAF2P ^ SRHPOP_LOG2o~ SYS$CANCELP  "*[BIWINE.POPPER.BE]BE_POP_INIT.C;18+,./ 4J-%B0123KPWO56I$ud7Vud89GHJ/* /* init: Start a Post Office Protocol session*/#include #include #include #include #include #include #include "popper.h"pop_init(p,mbxchan)POP * p;short mbxchan;{ struct sockaddr_in cs;& int len, sp, sts;! sts = pop_getsock(&sp,mbxchan); if (!(sts&1)) { if (sts != POP_STOP)6 pop_log(POP_ERROR,"My_accept failed, sts = %d",sts); return sts; } syslog(POP_START,0);I /* Get the address and socket of the client to whom I am speaking */ len = sizeof(cs);7 if (getpeername(sp,(struct sockaddr *)&cs,&len) < 0){9 pop_log(POP_ERROR,"Getpeername failed, err = %d",errno); return 0; }C /* Save the dotted decimal form of the client's IP address */% p->ipaddr = inet_ntoa(cs.sin_addr);! /* Save the client's port */! p->ipport = ntohs(cs.sin_port); p->client = p->ipaddr; p->input = sp; p->output = sp;J pop_log(POP_INFO,"Servicing request from %s at %s",p->client,p->ipaddr); return POP_SUCCESS;}#*[BIWINE.POPPER.BE]BE_POP_INIT.OBJ;1+,s./ 4b -%B0123KPWO56`Ixd7^yd89GHJ8 BE_POP_INITV1.028-MAR-1991 11:32VAX C V3.1-051mR BE_POP_INITpop_init & INET_NTOANTOHS GETPEERNAMESYSLOGPOP_LOG POP_GETSOCK POP_INIT$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOX$CHAR_STRING_CONSTANTSbPMy_accept failed, sts = %dPGetpeername failed, err = %d8PServicing request from %s at %sP,^W2~߭ POP_GETSOCKPSSS  SgPOP_LOGSPSYSLOG߭ݭ GETPEERNAMEPߧPOP_LOGPЬV^(n INET_NTOAP <~NTOHSٰP ЭoЭs ߧ8POP_LOGP!*[BIWINE.POPPER.BE]BE_POP_PASS.C;1+,Z./ 4E-%B0123KPWO56#include #include #include "popper.h"/* 6 * pass: Verify the user password from a POP client */int pop_pass (p)POP * p;{" int newcnt,readcnt(),checkpass(); struct { int len; char *addr; } udesc; udesc.len = strlen(p->user); udesc.addr = p->user; newcnt = readcnt(&udesc);  if (newcnt > 0) {. if (checkpass(p->user,p->pop_parm[1]) != 1) {* pop_log(POP_INFO,"Logfail: %s",p->user);' return (pop_msg(p,POP_FAILURE,D "Password supplied for \"%s\" is incorrect.",p->user)); }% if (pop_dropinfo(p) != POP_SUCCESS)  return(POP_FAILURE); } else p->msg_count = 0;  p->last_msg = 0;/ /* Authorization completed successfully */E pop_log(POP_INFO,"User: %s has %d messages.",p->user,p->msg_count);! return (pop_msg (p,POP_SUCCESS,, "%s has %d message(s) (%d octets).",0 p->user,p->msg_count,p->drop_size));}#*[BIWINE.POPPER.BE]BE_POP_PASS.OBJ;1+,J./ 4s$ -%B0123KPWO56yd7yd89GHJ8 BE_POP_PASSV1.028-MAR-1991 11:32VAX C V3.1-051gR BE_POP_PASSpop_pass q STRLEN POP_DROPINFOPOP_MSGPOP_LOG CHECKPASSREADCNT POP_PASS$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOq$CHAR_STRING_CONSTANTSsPLogfail: %s PPassword supplied for "%s" is incorrect.5PUser: %s has %d messages.OP%s has %d message(s) (%d octets).P ^SЬRSTRLENPREADCNTPH{ CHECKPASSP"cPOP_LOGߣ RPOP_MSGݬ POP_DROPINFOPP[ЬRc[ߣ5POP_LOGk[ߣORPOP_MSG*[BIWINE.POPPER.BE]BE_RUN.COM;2+,0"'./ 4=-%B0123KPWO56@pyd7@9yd89GHJ$ if p1 .eqs. ""$ then&$ wr sys$output "Process name missing"$ exit$ endif=$ run/det/proc='p1'/out=poplog:'p1'.out/err=poplog:'p1'.err - $$2:[biwine.popper.be]be*[BIWINE.POPPER.BE]BE_STOP.COM;2+,ݠ#./ 4D-%B0123KPWO56` qd7 )-qd89GHJ,$! Send a "STOP" message to the pop mailbox.:$! The be process currently reading the mailbox will exit.D$! Avoids stopping the be in the middle of serving a client request.$!$ open/write/share f popmbx$ write f "STOP" $ close f*[BIWINE.POPPER.BE]BE_SYSLOG.C;2+,7#!./ 47-%B0123KPWO56@T }d7.| }d89GHJ#include stdio#include jpidef#include "popper.h"/* !* syslog: Handle activity logging*/ FILE *logfp;char logname[50]; short timlen;int sts, retlen;char timbuf[30], prcnam[16];struct { int len; char *buf; } timbufd = {29,timbuf}; struct { short len, item; char *buf; int *retlenaddr;, } itmlst = {15,JPI$_PRCNAM,prcnam,&retlen};7static char levelstr[3][6] = {" INFO","DEBUG","ERROR"};int syslog(level,msg) int level; char *msg;{ if (level == POP_START) {( sts = sys$asctim(&timlen,&timbufd,0,0); timbuf[timlen] = 0;' fprintf(logfp,"\nSTART: %s\n",timbuf); } else if (level == POP_END) {( sts = sys$asctim(&timlen,&timbufd,0,0); timbuf[timlen] = 0;% fprintf(logfp," END: %s\n",timbuf); } else/ fprintf(logfp,"%s: %s\n",levelstr[level],msg); return 1;}int openlog(p)POP *p;{( sts = sys$getjpi(0,0,0,&itmlst,0,0,0); if (retlen == 0) {( printf("Zero length prcnam: %d\n",sts); return 0; } prcnam[retlen] = 0; p->myname = prcnam;0 sprintf(logname,"poplog:pop_%s.log;0",prcnam); logfp = fopen(logname,"w"); if (logfp == NULL) {- printf("Cannot open logfile: %s\n",logname); return 0; } else return 1;}int closelog(){ fclose(logfp); return 1;}!*[BIWINE.POPPER.BE]BE_SYSLOG.OBJ;1+,./ 4  -%B0123KPWO56 P;yd7@=yd89GHJ6 BE_SYSLOGV1.028-MAR-1991 11:34VAX C V3.1-051P P  P INFOPDEBUG PERRORP START: %s  P END: %s P%s: %s PZero length prcnam: %d 7Ppoplog:pop_%s.log;0KPwMPCannot open logfile: %s P|^R U SVެTd.|~?c SYS$ASCTIMP 2cP@eebfFPRINTFOd/|~?c SYS$ASCTIMP 2cP@eeߢ fFPRINTFݬdP@ߢfFPRINTF2P^R ST|~|~ SYS$GETJPIP   ߢPRINTFP P@cЬR BE_SYSLOG syslogopenlogHcloselog ,SPRINTFPRINTFFPRINTFFCLOSEFOPEN SYS$ASCTIM SYS$GETJPI |SYSLOG OPENLOG HCLOSELOG^$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOLOGFP2LOGNAMETIMLENSTSRETLENTIMBUFPRCNAMTIMBUFD ITMLSTf$CHAR_STRING_CONSTANTSkPccߢ7dSPRINTFߢKdFOPENPdߢMPRINTFP2P^FCLOSEP*[BIWINE.POPPER.BE]BUILD.COM;10+,T./ 4;d-%B0123KPWO56@d7`<@d89GHJ $ set def $$2:[biwine.popper.be]*$ define sys twg$tcp:[netdist.include.sys],$ define arpa twg$tcp:[netdist.include.arpa]3$ define netinet twg$tcp:[netdist.include.netinet]#$ if p1 .eqs. "LINK" then goto link$!$! For debugging messages, use:$!$! cc/define=DEBUG be_popper$!$ cc be_popper $ cc pop_dele$ cc be_dropinfo$ cc pop_get_command$ cc pop_get_subcommand$ cc be_pop_init $ cc pop_last $ cc pop_list $ cc pop_log$ cc pop_lower $ cc pop_msg$ cc pop_parse$ cc be_pop_pass $ cc pop_quit $ cc pop_rset $ cc pop_send $ cc pop_stat $ cc pop_updt $ cc pop_user $ cc pop_xtnd $ cc pop_xmit$ cc be_getsock$ cc be_syslog $ cc uafsubs $ macro hpwd $ cc callmail$ for mailsubs$ link:;$ link/nodeb/exe=BE.exe be_popper,pop_dele,be_dropinfo, -6 pop_get_command, pop_get_subcommand, be_pop_init, -, pop_last, pop_list, pop_log, pop_lower, -/ pop_msg, pop_parse, be_pop_pass, pop_quit, -, pop_rset, pop_send, pop_stat, pop_updt, -. pop_user, pop_xtnd, pop_xmit, be_getsock, -' uafsubs, hpwd, callmail, mailsubs, - be_syslog, vaxc/opt*[BIWINE.POPPER.BE]BUILD.LOG;1+,*./ 4G-%B0123KPWO56 xd7t\yd89GHJ$ set noverify: SYSTEM job terminated at 28-MAR-1991 11:34:56.02 Accounting information:F Buffered I/O count: 1186 Peak working set size: 2654F Direct I/O count: 1003 Peak page file size: 5726F Page faults: 31396 Mounted volumes: 0I Charged CPU time: 0 00:01:42.90 Elapsed time: 0 00:03:19.70*[BIWINE.POPPER.BE]CALLMAIL.C;3+,\S?./ 4M-%B0123KPWO56 +}d7$a}d89GHJ/*# This routine uses callable mail.C Written by Bill Wine, based on a routine written by Joe Meadows.*/#include ctype#include maildef#include "string_def.h"#include "itmlst.h" #include "addmaildef.h"#include prvdef#define DEBUG 0/ int mcontext = 0, fcontext = 0, ucontext = 0;, long current_id, folder_created, selected;. char mailspec[255],maildir[255],folder[255];@ long mailspec_len, i, j, ulen, mlen, sts, plen, size, totsize;. ItemList null_list, in_list[7], `j~ POPPER1.BCK\S?%B[BIWINE.POPPER.BE]CALLMAIL.C;3M@Iout_list[3]; short new, got_subj, got_from;=void setitem(ItemList *a, short b, short c, void *d, long *e){ a->buffer_length = b; a->item_code = c; a->buffer_address = d; a->return_length_address = e;}7int folder_routine(int *user_data, STRING *folder_name){/*5 Always create a new folder, if it does not exist.*/ return 1;}int startcnt(tostr,newret) char *tostr;short *newret;{/*> Set up a user context. Get the addressee's mail directory@ and newmail count. Then, open the mail file, and get count.*/" setitem(&null_list, 0, 0, 0, 0);9 sts = mail$user_begin(&ucontext,&null_list,&null_list); if ( !(sts&1) )  return sts;- if (DEBUG) printf("COPYIT: user begun\n");F setitem(&in_list[0], strlen(tostr), MAIL$_USER_USERNAME, tostr, 0);$ setitem(&in_list[1], 0, 0, 0, 0);G setitem(&out_list[0], sizeof(maildir) - 1,MAIL$_USER_FULL_DIRECTORY, maildir, &mlen);G setitem(&out_list[1], sizeof(new), MAIL$_USER_NEW_MESSAGES,&new, 0);% setitem(&out_list[2], 0, 0, 0, 0);: sts = mail$user_get_info(&ucontext,&in_list,&out_list); if ( !(sts&1) )  return sts; maildir[mlen] = 0;D if (DEBUG) printf("COPYIT: maildir: %s, new: %d\n",maildir,new);$ strcpy(maildir+mlen,"MAIL.MAI");< if (DEBUG) printf("COPYIT: maildir-full: %s\n",maildir);A sts = mail$mailfile_begin(&fcontext, &null_list, &null_list); if ( !(sts&1) )  return sts;H setitem(&in_list[0], strlen(maildir), MAIL$_MAILFILE_DEFAULT_NAME,  maildir, 0);G setitem(&out_list[0], sizeof(mailspec), MAIL$_MAILFILE_RESULTSPEC, mailspec, &mailspec_len);' setitem(&out_list[1], 0, 0, 0, 0);> sts = mail$mailfile_open(&fcontext, &in_list, &out_list); if ( !(sts&1) ) return sts;! mailspec[mailspec_len] = 0;? if (DEBUG) printf("COPYIT: mailfile open %s\n",mailspec);E setitem(&in_list[0], 4 , MAIL$_MESSAGE_FILE_CTX, &fcontext, 0);@ sts = mail$message_begin(&mcontext, &in_list, &null_list); if ( !(sts&1) ) return sts;4 if (DEBUG) printf("COPYIT: message begun\n");E setitem(&in_list[0], strlen("NEWMAIL"), MAIL$_MESSAGE_FOLDER,  "NEWMAIL",0);5 setitem(&in_list[1], 0, MAIL$_NOSIGNAL, 0, 0);( setitem(&in_list[2], 0, 0, 0, 0);F setitem(&out_list[0], 4, MAIL$_MESSAGE_SELECTED, &selected, 0);) setitem(&out_list[1], 0, 0, 0, 0);A sts = mail$message_select(&mcontext, &in_list, &out_list); if (sts == MAIL$_NOTEXIST) { *newret = 0; return 1; } else if ( !(sts&1) ) return sts; else {G if (DEBUG) printf("COPYIT: messages selected %d\n",selected);< setitem(&in_list[0], 0, MAIL$_MESSAGE_NEXT, 0, 0);8 setitem(&in_list[1], 0, MAIL$_NOSIGNAL, 0, 0);+ setitem(&in_list[2], 0, 0, 0, 0);M setitem(&out_list[0], 4, MAIL$_MESSAGE_CURRENT_ID, ¤t_id, 0);A setitem(&out_list[1], 4, MAIL$_MESSAGE_SIZE, &size, 0);, setitem(&out_list[2], 0, 0, 0, 0);  *newret = selected; return 1; }}int getcnt(retid,retsize)long *retid,*retsize;{@ sts = mail$message_info(&mcontext, &in_list, &out_list); *retid = current_id; *retsize = size; return sts;}int startmsg(id,date_buf)int *id;char *date_buf;{ long date_len; got_subj = got_from = 0; strcpy(date_buf,"Date: ");3 setitem(&in_list[0], 4, MAIL$_MESSAGE_ID, id, 0);# setitem(&in_list[1], 0, 0, 0, 0);9 setitem(&out_list[0], 4, MAIL$_MESSAGE_SIZE, &size, 0);H setitem(&out_list[1], 255, MAIL$_MESSAGE_DATE, date_buf+6, &date_len);$ setitem(&out_list[2], 0, 0, 0, 0);9 sts = mail$message_get(&mcontext, &in_list, &out_list); if (sts&1) { date_buf[date_len+6] = 0; } return sts;}!int getmsg(msg_buffer,msg_length)char *msg_buffer;int *msg_length;{- char tmp_buffer[256],*loc,*pers,*endq,*tmp;8 setitem(&in_list[0], 0, MAIL$_MESSAGE_CONTINUE, 0, 0);# setitem(&in_list[1], 0, 0, 0, 0);K setitem(&out_list[0], 255, MAIL$_MESSAGE_RECORD, msg_buffer, msg_length);$ setitem(&out_list[1], 0, 0, 0, 0);9 sts = mail$message_get(&mcontext, &in_list, &out_list); if (sts&1) { msg_buffer[*msg_length] = 0;9 if ((got_from==0) && (!strncmp("From:",msg_buffer,5))) { got_from = 1;' if (DEBUG) printf("%s\n",msg_buffer);" strcpy(tmp_buffer,msg_buffer+6);. if (DEBUG) printf("Tmp: '%s'\n",tmp_buffer); pers = 0;% if (loc=strstr(tmp_buffer," \"")) { pers = loc + 2; while ( *loc == ' ' ) loc--; loc++; *loc = 0; if(endq = strchr(pers,'"')) *endq = 0; else if (DEBUG) & printf("No end quote in pname\n"); } else {- loc = tmp_buffer + strlen(tmp_buffer) - 1; while ( *loc == ' ' ) loc--; loc++; *loc = 0; }# if (loc=strchr(tmp_buffer,'"')) { loc++; if(endq = strchr(loc,'"')) *endq = 0; else if (DEBUG) & printf("No end quote in uname\n");+ } else if (loc=strstr(tmp_buffer,"::")) { loc += 2; } else loc = tmp_buffer; if (pers) { for (tmp=pers; *tmp; tmp++) if (*tmp == ',') *tmp = ' ';, sprintf(msg_buffer+6,"%s <%s>",pers,loc); } else$ sprintf(msg_buffer+6,"<%s>",loc);' if (DEBUG) printf("%s\n",msg_buffer);@ } else if ((got_subj==0) && (!strncmp("Subj:",msg_buffer,5))) { got_subj = 1;" strcpy(tmp_buffer,msg_buffer+6);/ sprintf(msg_buffer,"Subject: %s",tmp_buffer); } } else *msg_buffer = 0; return sts;}int delmsg(id)int *id;{3 setitem(&in_list[0], 4, MAIL$_MESSAGE_ID, id, 0);# setitem(&in_list[1], 0, 0, 0, 0);$ setitem(&out_list[0], 0, 0, 0, 0);< sts = mail$message_delete(&mcontext, &in_list, &out_list); return sts;}int copymsg(id)int *id;{J setitem(&in_list[0], mailspec_len, MAIL$_MESSAGE_FILENAME, mailspec, 0); strcpy(folder,"MAIL");H setitem(&in_list[1], strlen(folder), MAIL$_MESSAGE_FOLDER, folder, 0);3 setitem(&in_list[2], 4, MAIL$_MESSAGE_ID, id, 0);J setitem(&in_list[3], 4, MAIL$_MESSAGE_FOLDER_ACTION, folder_routine, 0);6 setitem(&in_list[4], 0, MAIL$_MESSAGE_DELETE, 0, 0);# setitem(&in_list[5], 0, 0, 0, 0);M setitem(&out_list[0], 4, MAIL$_MESSAGE_FOLDER_CREATED, &folder_created, 0);$ setitem(&out_list[1], 0, 0, 0, 0);: sts = mail$message_copy(&mcontext, &in_list, &out_list); return sts;}int endit(tostr,deccnt) char *tostr; int deccnt;{ sts = 1; if (deccnt) { new -= deccnt; if (new < 0) new = 0;E setitem(&in_list[0], strlen(tostr), MAIL$_USER_USERNAME, tostr,0);B setitem(&in_list[1], sizeof(new), MAIL$_USER_SET_NEW_MESSAGES,  &new, 0);$ setitem(&in_list[2], 0, 0, 0, 0);= sts = mail$user_set_info(&ucontext, &in_list, &null_list); }D if (mcontext) mail$message_end(&mcontext, &null_list, &null_list); if (fcontext) {8 mail$mailfile_close(&fcontext, &null_list, &null_list);6 mail$mailfile_end(&fcontext, &null_list, &null_list); }G if (ucontext) sts = mail$user_end(&ucontext, &null_list, &null_list); return sts;} *[BIWINE.POPPER.BE]CALLMAIL.OBJ;1+,*. / 4 \ -%B0123KPWO 56@̥Iyd7Pyd89GHJ5CALLMAILV1.028-MAR-1991 11:34VAX C V3.1-051 C$V_CTYPEDEFSFOLDER_ROUTINESETITEMMAIL$MESSAGE_SELECTMAIL$MESSAGE_BEGINMAIL$MAILFILE_OPENMAIL$MAILFILE_BEGINSTRCPYMAIL$USER_GET_INFOSTRLENPRINTFMAIL$USER_BEGINMAIL$MESSAGE_INFOMAIL$MESSAGE_GETSTRCPYSPRINTFSTRLENSTRCHRSTRSTRSTRCPYPRINTFSTRNCMPMAIL$MESSAGE_GETMAIL$MESSAGE_DELETEMAIL$MESSAGE_COPYSTRLENSTRCPY MAIL$USER_ENDMAIL$MAILFILE_ENDPCOPYIT: user begun PCOPYIT: maildir: %s, new: %d 2PMAIL.MAI;PCOPYIT: maildir-full: %s UPCOPYIT: mailfile open %s oPCOPYIT: message begun PNEWMAILPNEWMAILPCOPYIT: messages selected %d PDate: PFrom:P%s PTmp: '%s' P "PNo end quote in pname PNo end quote in uname P::P%s <%s> P<%s>P%s PSubj:PSubject: %s'PMAILP^ЬP` ЬЬ^2P ^STUXVY W Z[|~|~hSETITEMhhMAIL$USER_BEGINPfPfPݬ< ~ݬSTRLEN2P~eSETITEMRb|~|~ big .LONG ^O00000000000,^O03555610144,^O07333420310,^O04666230254> .LONG ^O16667040620,^O15332650764,^O11554460530,^O12001270474> .LONG ^O35556101440,^O36003711504,^O32665521750,^O31330331614> .LONG ^O23331141260,^O20664751324,^O24002561170,^O27557371034  E; The following table of coefficients is used by the Pur$dy polynomialF; algorithm. They are prime, but the algorithm does not require this. C: .long -83, -1 ; C1 .long -179, -1 ; C2 .long -257, -1 ; C3 .long -323, -1 ; C4 .long -363, -1 ; C5 -.SBTTL Dispatch - select encryption algorithm ;++;; FUNCTIONAL DESCRIPTION:;5; Smash up the password into a non-reversable number.;; CALLINGS SEQUENCE:; ; CALLS/CALLG; ; INPUTS:;); PWDDSC - Address of password descriptor-; ENCRYPT - Encryption algorithm index (byte); SALT - random number (word)); USRDSC - Address of username descriptor;; IMPLICIT INPUTS:;; none; ; OUTPUTS:;.; OUTDSC - Address of output buffer descriptor;; IMPLICIT OUTPUTS:;; none;; ROUTINE VALUE:;; Success status;; SIDE EFFECTS:;; none;-- /.entry LGI$HPWD,^M ; entry mask ) tstb ENCRYPT(ap) ; using CRC algorithm?7 beql 20$ ; yes, no processing of user desc necessay.4 subl2 #20,sp ; Get temp desc and buffer off stack# movl sp,r6 ; Put address into r6? movq @USRDSC(ap),(r6) ; Put current user desc into stack desc.. cmpb #1,ENCRYPT(ap) ; Which PURDY algorithm? bneq 10$I movc5 (r6),@4(r6),#32,#12,8(r6) ; PURDY. 12 character blank pad username( movw #12,(r6) ; size of desc is now 124 movab 8(r6),4(r6) ; Point desc to buffer on stack. brb 20$ ; goto main line - ; PURDY_V. Remove padding from username.610$: movzwl (r6),r5 ; Save length of username in r5. clrw (r6)9 movl 4(r6),r0 ; Get address of username buffer into R0.815$: cmpb (r0)+,#32 ; Search until we find first blank. beql 20$5 incw (r6) ; Increment byte count until blank found9 cmpw #31,(r6) ; or 31 characters have been encountered, beql 20$ ; (31 is max username length).4 cmpw r5,(r6) ; or entire buffer has been parsed.2 beql 20$ ; (someone not playing by the rules) brb 15$ 920$: movaq @PWDDSC(ap),r4 ; If password is zero length% tstw (r4) ; (only check low word) bneq 25$2 movaq @OUTDSC(ap),r4 ; Then return null password clrw (r4)1 movc5 #0,(r4),#0,#8,@4(r4) ; (quadword of zeros) brb 40$ 925$: movaq @OUTDSC(ap),r4 ; Get pointer to output buffer movaq @4(r4),r47 tstb ENCRYPT(ap) ; Use the CRC algorithm if the index bgtru 30$ ; is zero mnegl #1,r0 ; initial CRC/ movaq @PWDDSC(ap),r1 ; get descriptor address? crc AUTODIN,r0,(r1),@4(r1) ; convert password to 32-bit number- clrl r1 ; high order longword will be zero2 movq r0,(r4) ; copy result to the output buffer brb 40$ +30$: clrq (r4) ; Initialize output buffer8 movaq @PWDDSC(ap),r3 ; Collapse password to a quadword bsbb COLLAPSE_R29 addw2 SALT(ap),3(r4) ; Add random salt into middle of U3 movl r6,r3 ; Collapse username into the quadword bsbb COLLAPSE_R2" pushaq (r4) ; Push pointer to U5 calls #1,Purdy ; Run U through the polynomial mod P 40$: movl #1,r0 ret COLLAPSE_R2: .enabl LSBK; This routine takes a string of bytes (the descriptor for which is pointedK; to by r3) and collapses them into a quadword (pointed to by r4). It doesK; this by cycling around the bytes of the output buffer adding in the bytes; of the input string. 3 movzwl (r3),r0 ; Obtain the number of input bytes beqlu 20$1 moval @4(r3),r2 ; Obtain pointer to input string=10$: bicl3 #-8,r0,r1 ; Obtain cyclic index into output buffer addb2 (r2)+,(r4)[r1]6 sobgtr r0,10$ ; Loop until input string is exhausted20$: rsb .dsabl LSB (.sbttl Purdy - evaluate Purdy polynomial 1a=59 ; 2^64 - 59 is the biggest quadword prime 6n0=1@24 - 3 ; These exponents are prime, but this is/n1=1@24 - 63 ; not required by the algorithm. .entry Purdy,^M;J; This routine computes f(U) = p(U) mod P. Where P is a prime of the form<; P = 2^64 - a. The function p is the following polynomial:.; X^n0 + X^n1*C1 + X^3*C2 + X^2*C3 + X*C4 + C5&; The input U is an unsigned quadword.;  pushq @4(ap) ; Push U% bsbw PQMOD_R0 ; Ensure U less than P) movaq (sp),r4 ; Maintain a pointer to X1 movaq C,r5 ; Point to the table of coefficients pushq (r4) pushl #n1 bsbb PQEXP_R3 ; X^n1 pushq (r4) pushl #n0-n1 bsbb PQEXP_R3 pushq (r5)+ ; C1! bsbw PQADD_R0 ; X^(n0 - n1) + C1 bsbw PQMUL_R2 ; X^n0 + X^n1*C1 pushq (r5)+ ; C2 pushq (r4) bsbw PQMUL_R2 ; X*C2 pushq (r5)+ ; C3 bsbw PQADD_R0 ; X*C2 + C3 pushq (r4) bsbb PQMUL_R2 ; X^2*C2 + X*C3 pushq (r5)+ ; C4# bsbw PQADD_R0 ; X^2*C2 + X*C3 + C4 pushq (r4)' bsbb PQMUL_R2 ; X^3*C2 + X^2*C3 + C4*X pushq (r5)+ ; C5, bsbw PQADD_R0 ; X^3*C2 + X^2*C3 + C4*X + C5, bsbw PQADD_R0 ; Add in the high order terms# popq @4(ap) ; Replace U with f(X) movl #1,r0 ret  PQEXP_R3: .enabl LSBI; Replaces the inputs with U^n mod P where P is of the form P = 2^64 - a.-; U is a quadword, n is an unsigned longword. & popr #^M ; Record return address pushq #1 ; Initialize2 pushq 8+4(sp) ; Copy U to top of stack for speed- tstl 8+8(sp) ; Only handle n greater than 0 beqlu 30$10$: blbc 8+8(sp),20$* pushq (sp) ; Copy the current power of U- pushq 8+8(sp) ; Multiply with current value bsbb PQMUL_R2$ popq 8(sp) ; Replace current value cmpzv #1,#31,8+8(sp),#0 beqlu 30$-20$: pushq (sp) ; Proceed to next power of U bsbb PQMUL_R2 extzv #1,#31,8+8(sp),8+8(sp) brb 10$130$: movq 8(sp),8+8+4(sp) ; Copy the return value* movaq 8+8+4(sp),sp ; Discard the exponent jmp (r3) ; return .dsabl LSB u=0 ; Low longword of Uv=u+4 ; High longword of Uy=u+8 ; Low longword of Yz=y+4 ; High longword of Y PQMOD_R0: .enabl LSBE; Replaces the quadword U on the stack with U mod P where P is of the; form P = 2^64 - a. & popr #^M ; Record return address( cmpl v(sp),#-1 ; Replace U with U mod P blssu 10$ cmpl u(sp),#-a blssu 10$ addl2 #a,u(sp) adwc #0,v(sp)10$: jmp (r0) ; return .dsabl LSB  PQMUL_R2:E; Computes the product U*Y mod P where P is of the form P = 2^64 - a.M; U, Y are quadwords less than P. The product replaces U and Y on the stack. G; The product may be formed as the sum of four longword multiplications3; which are scaled by powers of 2^32 by evaluating:#; 2^64*v*z + 2^32*(v*y + u*z) + u*yH; The result is computed such that division by the modulus P is avoided. & popr #^M ; Record return address) movl sp,r2 ; Record initial stack value pushl z(r2) pushl v(r2) bsbb EMULQ bsbb PQMOD_R0 bsbb PQLSH_R0 ; Obtain 2^32*v*z pushl y(r2) pushl v(r2) bsbb EMULQ bsbb PQMOD_R0 pushl z(r2) pushl u(r2) bsbb EMULQ bsbb PQMOD_R0# bsbb PQADD_R0 ; Obtain (v*y + u*z) bsbb PQADD_R0 ; Add in 2^32*v*z+ bsbb PQLSH_R0 ; Obtain the first two terms pushl y(r2) pushl u(r2) bsbb EMULQ, bsbb PQMOD_R0 ; Obtain the third term: u*y bsbb PQADD_R0 ; Add it in$ popq Y(r2) ; Copy the return value5 movaq Y(r2),sp ; Point the stack to the return value jmp (r1) ; return  EMULQ: .enabl LSBK; This routine knows how to multiply two unsigned longwords, replacing them2; with the unsigned quadword product on the stack.  emul 4(sp),8(sp),#0,-(sp) clrl -(sp)8 tstl 4+8+4(sp) ; Check both longwords to see if we must. bgeq 10$ ; compensate for the unsigned bias. addl 4+8+8(sp),(sp)10$: tstl 4+8+8(sp) bgeq 20$ addl 4+8+4(sp),(sp)020$: addl (sp)+,4(sp) ; Add in the compensation.8 popq 4(sp) ; Replace the longwords with their product. rsb .dsabl LSB  PQLSH_R0: .enabl LSBH; Computes the product 2^32*U mod P where P is of the form P = 2^64 - a.D; U is a quadword less than P. The product replaces U on the stack. H; This routine is used by PQMUL in the formation of quadword products in3; such a way as to avoid division by the modulus P.I; The product 2^64*v + 2^32*u is congruent a*v + 2^32*u mod P (where u, v; are longwords). & popr #^M ; Record return address pushl v(sp) pushl #a bsbb EMULQ ; Push a*v' ashq #32,Y(sp),Y(sp) ; Form Y = 2^32*u' brb 10$ ; Return the sum U + Y mod P. PQADD_R0:C; Computes the sum U + Y mod P where P is of the form P = 2^64 - a.I; U, Y are quadwords less than P. The sum replaces U and Y on the stack. & popr #^M ; Record return address.10$: addl2 u(sp),y(sp) ; Add the low longwords9 adwc v(sp),z(sp) ; Add the high longwords with the carry4 bcs 20$ ; If the result is greater than a quadword cmpl z(sp),#-1 blssu 30$6 cmpl y(sp),#-a ; or simply greater than or equal to P blssu 30$)20$: addl2 #a,y(sp) ; we must subtract P. adwc #0,z(sp)930$: movaq Y(sp),sp ; Point the stack to the return value jmp (r0) ; return .dsabl LSB .END*[BIWINE.POPPER.BE]HPWD.OBJ;1+,./ 4_-%B0123KPWO56LGyd7 qHyd89GHJ0HPWDX-228-MAR-1991 11:34 VAX MACRO V5.0-9 MACRO HPWD- hash user password HPWD . ABS .P| _LIB$CODEpPd n;0&AvQkkXaM^^V}f ,f  f~T~T P~Q $PaQ}Pd|d~SVS dP trans, /* Transaction */H update, /* Update: session ended, K process maildrop changes */I halt, /* (Halt): stop processing ; and exit */J error /* (Error): something really ? bad happened */} state;Jtypedef struct { /* State information for G each POP command */K state ValidCurrentState; /* The operating state of B the command */F char * command; /* The POP command */L int min_parms; /* Minimum number of parms F for the command */L int max_parms; /* Maximum number of parms F for the command */N int (*function) (); /* The function that process B the command */N state result[2]; /* The resulting state after I command processing */I#define success_state result[0] /* State when a command ? succeeds */} state_table;Jtypedef struct { /* Table of extensions */N char * subcommand; /* The POP XTND subcommand */O int min_parms; /* Minimum number of parms forE the subcommand */O int max_parms; /* Maximum number of parms forE the subcommand */P int (*function) (); /* The function that processes E the subcommand */ } xtnd_table;Jtypedef struct { /* Message information */O int number; /* Message number relative to L the beginning of list */I long length; /* Length of message in < bytes */ int lines; /* Number of (null-terminated) lines in the message */M long offset; /* Offset from beginning of ; file */O int del_flag; /* Flag indicating if message M is marked for deletion */O int retr_flag; /* Flag indicating if message D was retrieved */} MsgInfoList;Jtypedef struct { /* POP parameter block */J int debug; /* Debugging requested */M char * myname; /* Process name of this POP E daemon program */I char myhost[MAXHOSTNAMELEN]; /* The name of our host ? computer */M char * client; /* Canonical name of client ? computer */N char * ipaddr; /* Dotted-notation format of H client IP address */O unsigned short ipport; /* Client port for privileged A operations */K char user[MAXUSERNAMELEN]; /* Name of the POP user */ state CurrentState; /* The current POP operational state */O MsgInfoList * mlp; /* Message information list */J int msg_count; /* Number of messages in C the maildrop */O int msgs_deleted; /* Number of messages flagged C for deletion */L int last_msg; /* Last message touched by ? the user */M long bytes_deleted; /* Number of maildrop bytes K flagged for deletion */K long drop_size; /* Size of the maildrop in< bytes */N int * input; /* Input TCP/IP communication = stream */ int * output; /* Output TCP/IP communication stream */O char * pop_parm[MAXPARMCOUNT]; /* Parse POP parameter list */L int parm_count; /* Number of parameters in B parsed list */} POP;extern int pop_user();extern int pop_pass();extern int pop_rpop();extern int pop_quit();extern int pop_quit();extern int pop_stat();extern int pop_list();extern int pop_send();extern int pop_dele();extern int pop_rset();extern int pop_send();extern int pop_last();extern int pop_xtnd();extern int pop_updt();extern int pop_xmit();*[BIWINE.POPPER.BE]POP_DELE.C;2+,@./ 4N-%B0@123KPWO56` 0n\73Vn\89GHJ#include #include #include #include "popper.h"/* 2 * dele: Delete a message from the POP maildrop */ pop_dele (p)POP * p;{G MsgInfoList * mp; /* Pointer to message info list */ int msg_num;= /* Convert the message number parameter to an integer */# msg_num = atoi(p->pop_parm[1]);- /* Is requested message out of range? */2 if ((msg_num < 1) || (msg_num > p->msg_count))N return (pop_msg (p,POP_FAILURE,"Message %d does not exist.",msg_num));; /* Get a pointer to the message in the message list */ mp = &(p->mlp[msg_num-1]);7 /* Is the message already flagged for deletion? */ if (mp->del_flag)N return (pop_msg (p,POP_FAILURE,"Message %d has already been deleted.", msg_num));( /* Flag the message for deletion */ mp->del_flag = TRUE;A /* Update the messages_deleted and bytes_deleted counters */ p->msgs_deleted++;# p->bytes_deleted += mp->length;D /* Update the last-message-accessed number if it is lower than  the deleted message */5 if (p->last_msg < msg_num) p->last_msg = msg_num;L return (pop_msg (p,POP_SUCCESS,"Message %d has been deleted.",msg_num));} *[BIWINE.POPPER.BE]POP_DELE.OBJ;1+,+./ 4 -%B0123KPWO56spxd7!\xd89GHJ5POP_DELEV1.028-MAR-1991 11:31VAX C V3.1-051fRPOP_DELEpop_dele t" C$V_CTYPEDEFSPOP_MSGATOI POP_DELE$CODE$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO]$CHAR_STRING_CONSTANTSPMessage %d does not exist.PMessage %d has already been deleted.@PMessage %d has been deleted.P^TЬR{ATOIPSS[SdRPOP_MSGSRRЬPBWRբSߤPPOP_MSGЬP_gcSScSߤ@PPOP_MSG%*[BIWINE.POPPER.BE]POP_GET_COMMAND.C;3+,tL-./ 4pH-%B0@123KPWO 56mBc]7Asc]89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";=static char SccsId[] = "@(#)pop_get_command.c 1.9 8/16/90";#endif not lint#include #include #include #include "popper.h"/* L * get_command: Extract the command from an input line form a POP client */static state_table states[] = {; auth1, "user", 1, 1, pop_user, {auth1, auth2},; auth2, "pass", 1, 1, pop_pass, {auth1, trans}, #ifdef RPOP; auth2, "rpop", 1, 1, pop_rpop, {auth1, trans}, #endif RPOP: auth1, "quit", 0, 0, pop_quit, {halt, halt},: auth2, "quit", 0, 0, pop_quit, {halt, halt},; trans, "stat", 0, 0, pop_stat, {trans, trans},; trans, "list", 0, 1, pop_list, {trans, trans},; trans, "retr", 1, 1, pop_send, {trans, trans},; trans, "dele", 1, 1, pop_dele, {trans, trans},; trans, "noop", 0, 0, NULL, {trans, trans},; trans, "rset", 0, 0, pop_rset, {trans, trans},; trans, "top", 2, 2, pop_send, {trans, trans},; trans, "last", 0, 0, pop_last, {trans, trans},; trans, "xtnd", 1, 99, pop_xtnd, {trans, trans},: trans, "quit", 0, 0, pop_updt, {halt, halt},> (state) 0, NULL, 0, 0, NULL, {halt, halt},};"state_table *pop_get_command(p,mp)POP * p;=register char * mp; /* Pointer to unparsed line ? received from the client */{ state_table * s;+ char buf[MAXMSGLINELEN];2 /* Save a copy of the original client line */! if(p->debug) strcpy (buf,mp);5 /* Parse the message into the parameter array */< if ((p->parm_count = pop_parse(p,mp)) < 0) return(NULL);) /* Do not log cleartext passwords */ if(p->debug){. if(strcmp(p->pop_command,"pass") == 0)K pop_log(POP_DEBUG,"Received: \"%s xxxxxxxxx\"",p->pop_command); else {' /* Remove trailing */& buf[strlen(buf)-2] = '\0';6 pop_log(POP_DEBUG,"Received: \"%s\"",buf); } }@ /* Search for the POP command in the command/state table */' for (s = states; s->command; s++) {G /* Is this a valid command for the current operating state? */2 if (strcmp(s->command,p->pop_command) == 0: && s->ValidCurrentState == p->CurrentState) {A /* Were too few parameters passed to the command? */- if (p->parm_count < s->min_parms)< return((state_table *)pop_msg(p,POP_FAILURE,M "Too few arguments for the %s command.",p->pop_command));B /* Were too many parameters passed to the command? */- if (p->parm_count > s->max_parms)< return((state_table *)pop_msg(p,POP_FAILURE,N "Too many arguments for the %s command.",p->pop_command));B /* Return a pointer to the entry for this command in * the command/state table */ return (s); } }H /* The client command was not located in the command/state table */0 return((state_table *)pop_msg(p,POP_FAILURE,4 "Unknown command: \"%s\".",p->pop_command));}'*[BIWINE.POPPER.BE]POP_GET_COMMAND.OBJ;1+,c./ 4 -%B0123KPWO56`Bxd7xd89GHJ<POP_GET_COMMANDV1.028-MAR-1991 11:32VAX C V3.1-051PCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_get_command.c 1.9 8/16/90PuserzPPPpassPP PquitP PPquitPPPstatPPPlistPPPPretr"P2P#Pdele>P#NP(PnoopZP(jP-PrsetvP-P2PtopP2P6PlastP6P;PxtndP;cP@PquitP@PPEPpassJPReceived: "%s xxxxxxxxx"cPReceived: "%s"rPToo few arguments for the %s command.PToo many arguments for the %s command.PUnknown command: "%s".P^UWЬRռ RSTRCPYЬSRS POP_PARSEPËPЬRbGߥEwSTRCMPPwߥJPOP_LOG#RPOP_GET_COMMANDpop_get_command# 1zPOP_UPDTPOP_XTNDPOP_LASTPOP_SENDPOP_RSETPOP_DELEPOP_LISTPOP_STATPOP_QUITPOP_PASSPOP_USERSTRLENSTRCMPSTRCPYPOP_MSGPOP_LOG POP_PARSE POP_GET_COMMAND#$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO$CHAR_STRING_CONSTANTSSTRLENP@ߥcPOP_LOGާvSգoެVЦTwݣSTRCMPPMfRcSCЬR‹wߥrRPOP_MSGЬR‹ wŘRPOP_MSGSPSգЬRwſRPOP_MSGPPOP_USERPPOP_PASSPPOP_QUITPPOP_QUITPPOP_STATPPOP_LIST.PPOP_SENDJPPOP_DELEPPOP_RSETPPOP_SENDPPOP_LASTPPOP_XTNDPPOP_UPDT(*[BIWINE.POPPER.BE]POP_GET_SUBCOMMAND.C;1+,4} ./ 4p-%B0@123KPWO56 HO7@!ZY89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";Astatic char SccsId[] = "@(#)pop_get_subcommand.c 1.5 7/13/90";#endif not lint#include #include #include #include "popper.h"/* J * get_subcommand: Extract a POP XTND subcommand from a client input line */#static xtnd_table subcommands[] = {% "xmit", 0, 0, pop_xmit, NULL};!xtnd_table *pop_get_subcommand(p)POP * p;{ xtnd_table * s;@ /* Search for the POP command in the command/state table *// for (s = subcommands; s->subcommand; s++) {; if (strcmp(s->subcommand,p->pop_subcommand) == 0) {D /* Were too few parameters passed to the subcommand? */1 if ((p->parm_count-1) < s->min_parms); return((xtnd_table *)pop_msg(p,POP_FAILURE,? "Too few arguments for the %s %s command.",; p->pop_command,p->pop_subcommand));E /* Were too many parameters passed to the subcommand? */1 if ((p->parm_count-1) > s->max_parms); return((xtnd_table *)pop_msg(p,POP_FAILURE,@ "Too many arguments for the %s %s command.",; p->pop_command,p->pop_subcommand));B /* Return a pointer to the entry for this subcommand , in the XTND command table */ return (s); } }J /* The client subcommand was not located in the XTND command table *// return((xtnd_table *)pop_msg(p,POP_FAILURE,I "Unknown command: \"%s %s\".",p->pop_command,p->pop_subcommand));}**[BIWINE.POPPER.BE]POP_GET_SUBCOMMAND.OBJ;1+,k'./ 4 -%B0123KPWO56xd7[cxd89GHJ?POP_GET_SUBCOMMANDV1.028-MAR-1991 11:32VAX C V3.1-051wRPOP_GET_SUBCOMMANDpop_get_subcommand POP_XMITSTRCMPPOP_MSG <POP_GET_SUBCOMMAND$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOr$CHAR_STRING_CONSTANTSPCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_get_subcommand.c 1.5 7/13/90PxmitzPPToo few arguments for the %s %s command..PToo many arguments for the %s %s command.XPUnknown command: "%s %s".P<^TRޢzScoU{cSTRCMPPRЬQPP{wߤQPOP_MSGЬQPP{wߤ.QPOP_MSGSPScЬS{wߤXSPOP_MSGPPOP_XMIT*[BIWINE.POPPER.BE]POP_LAST.C;1+,G./ 4p-%B0@123KPWO56MR7 :cZY89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_last.c 1.5 7/13/90";#endif not lint#include #include #include "popper.h"/* = * last: Display the last message touched in a POP session */int pop_last (p)POP * p;{O return (pop_msg(p,POP_SUCCESS,"%u is the last message seen.",p->last_msg));} *[BIWINE.POPPER.BE]POP_LAST.OBJ;1+,vv1./ 4 -%B0123KPWO56AQyd7 tyd89GHJ5POP_LASTV1.028-MAR-1991 11:32VAX C V3.1-051LRPOP_LASTpop_last NPOP_MSG POP_LAST$CODEn$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO$CHAR_STRING_CONSTANTSPCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_last.c 1.5 7/13/90P%u is the last message seen.P^ЬPcPPOP_MSG*[BIWINE.POPPER.BE]POP_LIST.C;2+,N"./ 4pL-%B0@123KPWO56`< 7ʚZY89GHJ /*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_list.c 1.5 7/13/90";#endif not lint#include #include #include "popper.h"/* / * list: List the contents of a POP maildrop */int pop_list (p)POP * p;{K MsgInfoList * mp; /* Pointer to message info list */ register int i;$ register int msg_num; char buf[80];) /* Was a message number provided? */ if (p->parm_count > 0) {' msg_num = atoi(p->pop_parm[1]);1 /* Is requested message out of range? */6 if ((msg_num < 1) || (msg_num > p->msg_count))+ return (pop_msg (p,POP_FAILURE,7 "Message %d does not exist.",msg_num));? /* Get a pointer to the message in the message list */ mp = &p->mlp[msg_num-1];; /* Is the message already flagged for deletion? */ if (mp->del_flag)+ return (pop_msg (p,POP_FAILURE,9 "Message %d has been deleted.",msg_num));* /* Display message information */C return (pop_msg(p,POP_SUCCESS,"%u %u",msg_num,mp->length)); } . /* Display the entire list of messages */ pop_msg(p,POP_SUCCESS," "%u messages (%u octets)",H p->msg_count-p->msgs_deleted,p->drop_size-p->bytes_deleted);L /* Loop through the message information list. Skip deleted messages */; for (i = p->msg_count, mp = p->mlp; i > 0; i--, mp++) { if (!mp->del_flag) {; sprintf(buf,"%u %u\r\n",mp->number,mp->length);0 netwrite(p->output,buf,strlen(buf)); } }; /* "." signals the end of a multi-line transmission */" netwrite(p->output,".\r\n",3); return(POP_SUCCESS);} *[BIWINE.POPPER.BE]POP_LIST.OBJ;1+,z./ 4 -%B0123KPWO56yd7JPyd89GHJ5POP_LISTV1.028-MAR-1991 11:32VAX C V3.1-051PCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_list.c 1.5 7/13/90PMessage %d does not exist.PMessage %d has been deleted.8P%u %u>P%u messages (%u octets)VP%u %u ^P. P<^UЬR‹c{ATOIPTT[TeRPOP_MSGTRRЬSBWRբTߥSPOP_MSGݢTߥ8ݬPOP_MSGЬTgk~_[~ߥ>TPOP_MSG[RWSR@Pգ0ݣcߥV߭SPRINTF߭STRLENP߭ЬPstRPOP_LISTpop_list N0SPRINTFNETWRITESTRLENPOP_MSGATOI <POP_LIST$CODEn$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOb$CHAR_STRING_CONSTANTS5NETWRITERSRߥ^ЬRsNETWRITEP*[BIWINE.POPPER.BE]POP_LOG.C;5+,ey./ 4-%B0@123KPWO56@;_7^_89GHJ#include #include #include #include "popper.h"/*  * log: Make a log entry */static char msgbuf[MAXLINELEN];pop_log(va_alist)va_dcl{ va_list ap; POP * p; int level; char * format; va_start(ap); level = va_arg(ap,int); format = va_arg(ap,char *); vsprintf(msgbuf,format,ap); va_end(ap); syslog (level,msgbuf);}*[BIWINE.POPPER.BE]POP_LOG.OBJ;1+,)G./ 4 -%B0123KPWO5698yd7 yd89GHJ4POP_LOGV1.028-MAR-1991 11:32VAX C V3.1-051ORPOP_LOGpop_logA b VSPRINTFSYSLOG POP_LOGA$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOUP ^ެQQQP`RQSSP`PSPVSPRINTFSRSYSLOG*[BIWINE.POPPER.BE]POP_LOWER.C;2+,N ./ 4p-%B0@123KPWO56`4bY74bY89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_lower.c 1.6 7/13/90";#endif not lint#include #include #include /* ) * lower: Convert a string to lowercase */pop_lower (buf)char * buf;{ char * mp; for (mp = buf; *mp; mp++)M/* if (isupper(*mp) && isupper(*mp)) *mp = (char)tolower((int)*mp); */8 if (isupper(*mp)) *mp = (char)tolower((int)*mp);}!*[BIWINE.POPPER.BE]POP_LOWER.OBJ;1+,]./ 4 -%B0123KPWO56 yd7j yd89GHJ6 POP_LOWERV1.028-MAR-1991 11:32VAX C V3.1-051QR POP_LOWER pop_lower5   C$V_CTYPEDEFSTOLOWER POP_LOWER5$CODEn$DATASTDINSTDOUTSTDERR_CTYPE_PCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_lower.c 1.6 7/13/90P ^SЬRb bPPP@c b~TOLOWERPbRb*[BIWINE.POPPER.BE]POP_MSG.C;6+,VX./ 4p-%B0@123KPWO56@?Wc]7c]89GHJp>~ POPPER1.BCKVX%B[BIWINE.POPPER.BE]POP_MSG.C;6pY/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_msg.c 1.7 7/13/90";#endif not lint#include #include #include #include #include "popper.h"/* 3 * msg: Send a formatted line to the POP client */pop_msg(va_alist)va_dcl{ POP * p;G int stat; /* POP status indicator */P char * format; /* Format string for the message */ va_list ap; register char * mp;, char message[MAXLINELEN]; va_start(ap); p = va_arg(ap, POP *); stat = va_arg(ap, int); format = va_arg(ap, char *);& /* Point to the message buffer */ mp = message;E /* Format the POP status code at the beginning of the message */ if (stat == POP_SUCCESS)( (void)sprintf (mp,"%s ",POP_OK); else) (void)sprintf (mp,"%s ",POP_ERR);E /* Point past the POP status indicator in the message message */ mp += strlen(mp);7 /* Append the message (formatted, if necessary) */ if (format)  vsprintf(mp,format,ap); va_end(ap); 4 /* Log the message if debugging is turned on */( if (p->debug && stat == POP_SUCCESS)( pop_log(POP_DEBUG,"%s",message);0 /* Log the message if a failure occurred */ if (stat != POP_SUCCESS) ( pop_log(POP_ERROR,"%s",message); /* Append the */" (void)strcat(message, "\r\n"); ) /* Send the message to the client */- netwrite(p->output,message,strlen(message)); return stat;}*[BIWINE.POPPER.BE]POP_MSG.OBJ;1+,C./ 4l -%B0123KPWO56\=yd7dyd89GHJ4POP_MSGV1.028-MAR-1991 11:32VAX C V3.1-051qRPOP_MSGpop_msg /STRLENSTRCATVSPRINTFSPRINTFNETWRITEPOP_LOG POP_MSG$CODEn$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO$CHAR_STRING_CONSTANTSPCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_msg.c 1.7 7/13/90P%s P+OKP%s  P-ERRP%sP%sP P^SެQQQP`UQQP`WQTTP`VRWߣcRSPRINTFߣ ߣRSPRINTFRSTRLENPRV TVRVSPRINTFTeWߣPOP_LOGWߣPOP_LOGߣSTRCATSTRLENPsNETWRITEWP*[BIWINE.POPPER.BE]POP_PARSE.C;1+,5./ 4p^-%B0@123KPWO56|X7`ZY89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_parse.c 1.5 7/13/90";#endif not lint#include #include #include #include "popper.h"/* 5 * parse: Parse a raw input line from a POP client  * into null-delimited tokens */pop_parse(p,buf)POP * p;@char * buf; /* Pointer to a message containing ; the line from the client */{ char * mp; register int i; - /* Loop through the POP command array */" for (mp = buf, i = 0; ; i++) { : /* Skip leading spaces and tabs in the message */! while (isspace(*mp))mp++;0 /* Are we at the end of the message? */ if (*mp == 0) break;I /* Have we already obtained the maximum allowable parameters? */ if (i >= MAXPARMCOUNT) {B pop_msg(p,POP_FAILURE,"Too many arguments supplied."); return(-1); }. /* Point to the start of the token */ p->pop_parm[i] = mp;F /* Search for the first space character (end of the token) */* while (!isspace(*mp) && *mp) mp++;, /* Delimit the token with a null */ if (*mp) *mp++ = 0; }- /* Were any parameters passed at all? */ if (i == 0) return (-1);> /* Convert the first token (POP command) to lower case */ pop_lower(p->pop_command);I /* Return the number of tokens extracted minus the command itself */ return (i-1); }!*[BIWINE.POPPER.BE]POP_PARSE.OBJ;1+, ./ 4[ -%B0123KPWO56Lyd7<yd89GHJ6 POP_PARSEV1.028-MAR-1991 11:32VAX C V3.1-051oR POP_PARSE pop_parse ) C$V_CTYPEDEFS POP_LOWERPOP_MSG < POP_PARSE$CODEn$DATASTDINSTDOUTSTDERR_CTYPE_ERRNO VAXC$ERRNO$CHAR_STRING_CONSTANTS[PCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_parse.c 1.5 7/13/90PToo many arguments supplied.P< ^UTSRcPPP@dPScPPP@dcUReݬPOP_MSGPЬPSBwcPPP@dcPScPPP@dccRPRPЬSw POP_LOWERRP*[BIWINE.POPPER.BE]POP_QUIT.C;2+,K./ 4p-%B0@123KPWO56B@397`sZY89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_quit.c 1.5 7/13/90";#endif not lint#include #include #include "popper.h"/* # * quit: Terminate a POP session */int pop_quit (p)POP * p;{/ /* Release the message information list */& if (p->mlp) free ((char *)p->mlp); return(POP_SUCCESS);} *[BIWINE.POPPER.BE]POP_QUIT.OBJ;1+,4./ 4 -%B0123KPWO56@@yd74yd89GHJ5POP_QUITV1.028-MAR-1991 11:33VAX C V3.1-051ORPOP_QUITpop_quit N FREE POP_QUIT$CODEn$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOPCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_quit.c 1.5 7/13/90P^ЬPW WFREEP*[BIWINE.POPPER.BE]POP_RSET.C;1+, ./ 4p-%B0@123KPWO56#]7`dZY89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_rset.c 1.5 7/13/90";#endif not lint#include #include #include "popper.h"/* F * rset: Unflag all messages flagged for deletion in a POP maildrop */int pop_rset (p)POP * p;{K MsgInfoList * mp; /* Pointer to the message info list */ register int i;" /* Unmark all the messages */9 for (i = p->msg_count, mp = p->mlp; i > 0; i--, mp++) mp->del_flag = FALSE;  @ /* Reset the messages-deleted and bytes-deleted counters */ p->msgs_deleted = 0; p->bytes_deleted = 0; - /* Reset the last-message-access flag */ p->last_msg = 0;I return (pop_msg(p,POP_SUCCESS,"Maildrop has %u messages (%u octets)",$ p->msg_count,p->drop_size));} *[BIWINE.POPPER.BE]POP_RSET.OBJ;1+,./ 4R -%B0123KPWO56wyd7l yd89GHJ5POP_RSETV1.028-MAR-1991 11:33VAX C V3.1-051WRPOP_RSETpop_rsetJ NPOP_MSG POP_RSETJ$CODEn$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO%$CHAR_STRING_CONSTANTSPCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_rset.c 1.5 7/13/90PMaildrop has %u messages (%u octets)P^ЬQ[PWRP ԢPRPЬR_|ck[RPOP_MSG*[BIWINE.POPPER.BE]POP_SEND.C;27+,Xa./ 4p-%B0@123KPWO56 2'_]7>e'_]89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_send.c 1.7 7/13/90";#endif not lint#include stdio.h#include #include #include "popper.h"/* < * send: Send the header and a specified number of lines 0 * from a mail message to a POP client. */ pop_send(p)POP * p;{K MsgInfoList * mp; /* Pointer to message info list */$ register int msg_num;& register int msg_lines;2 char buffer[MAXMSGLINELEN]; int sts, id, len;6 /* Convert the first parameter into an integer */# msg_num = atoi(p->pop_parm[1]);- /* Is requested message out of range? */2 if ((msg_num < 1) || (msg_num > p->msg_count))N return (pop_msg (p,POP_FAILURE,"Message %d does not exist.",msg_num));; /* Get a pointer to the message in the message list */ mp = &p->mlp[msg_num-1];/ /* Is the message flagged for deletion? */ if (mp->del_flag)' return (pop_msg (p,POP_FAILURE,5 "Message %d has been deleted.",msg_num));D /* If this is a TOP command, get the number of lines to send */, if (strcmp(p->pop_command,"top") == 0) {; /* Convert the second parameter into an integer */) msg_lines = atoi(p->pop_parm[2]); } else {? /* Assume that a RETR (retrieve) command was issued */ msg_lines = -1;, /* Flag the message as retreived */ mp->retr_flag = TRUE; } 5 /* Display the number of bytes in the message */2 pop_msg(p,POP_SUCCESS,"%u octets",mp->length); if(p->debug)C pop_log(POP_DEBUG,"Mess: %d,%d,%d",msg_num,mp->length,mp->offset); id = mp->offset; sts = startmsg(&id,buffer); if ( !(sts&1) ) exit(1); pop_sendline(p,buffer); /* Send the message body */# while (getmsg(buffer,&len)&1) {; /* Decrement the lines sent (for a TOP command) */6 if (msg_lines >= 0 && msg_lines-- == 0) break; pop_sendline(p,buffer); }; /* "." signals the end of a multi-line transmission */ netwrite(p->output,".\r\n",3); return(POP_SUCCESS);}/*A * sendline: Send a line of a multi-line response to a client. */pop_sendline(p,buffer)POP * p;char * buffer;{ char * bp;A /* Byte stuff lines that begin with the termination octet */F if (*buffer == POP_TERMINATE) netwrite(p->output,POP_TERMINATE,1);( /* Look for a in the buffer */- if (bp = strchr(buffer,NEWLINE)) *bp = 0;' /* Send the line to the client */ + netwrite(p->output,buffer,strlen(buffer)); if(p->debug)1 pop_log(POP_DEBUG,"Sending line \"%s\"",buffer);B /* Put a if a newline was removed from the buffer */! netwrite(p->output,"\r\n",2);} *[BIWINE.POPPER.BE]POP_SEND.OBJ;1+,./ 4 -%B0123KPWO56w yd7 #yd89GHJ5POP_SENDV1.028-MAR-1991 11:33VAX C V3.1-051PCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_send.c 1.7 7/13/90PMessage %d does not exist.PMessage %d has been deleted.8Ptop * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_stat.c 1.5 7/13/90";#endif not lint#include #include #include "popper.h"/* > * stat: Display the status of a POP maildrop to its client */int pop_stat (p)POP * p;{# return (pop_msg (p,POP_SUCCESS,M "%u %u",p->msg_count-p->msgs_deleted,p->drop_size-p->bytes_deleted));} *[BIWINE.POPPER.BE]POP_STAT.OBJ;1+,-./ 4 -%B0123KPWO56 $yd7&yd89GHJ5POP_STATV1.028-MAR-1991 11:33VAX C V3.1-051LRPOP_STATpop_stat+ NPOP_MSG POP_STAT+$CODEn$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO$CHAR_STRING_CONSTANTSPCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_stat.c 1.5 7/13/90P%u %uP^ЬQgk~_[~QPOP_MSG*[BIWINE.POPPER.BE]POP_UPDT.C;12+,k./ 4K>-%B0@123KPWO56`ȵ_]7`5_]89GHJ#include #include #include #include "popper.h"/* 2 * updt: Apply changes to a user's POP maildrop */int pop_updt (p)POP * p;{K MsgInfoList * mp; /* Pointer to message D info list */H register int msg_num; /* Current message B counter */ int id; short delcnt,movcnt; if (p->debug)4 pop_log(POP_DEBUG,"Performing maildrop update..."); delcnt = movcnt = 0;8 for (msg_num = 0; msg_num < p->msg_count; ++msg_num) {< /* Get a pointer to the message information list */ mp = &p->mlp[msg_num]; id = mp->offset; if(p->debug). pop_log(POP_DEBUG,"Message %d, del flag %d", mp->number,mp->del_flag); if (mp->del_flag) { delmsg(&id); delcnt++; } else { copymsg(&id); movcnt++; } } delcnt += movcnt; endit(p->user,delcnt); return(pop_quit(p));} *[BIWINE.POPPER.BE]POP_UPDT.OBJ;1+,J./ 4 -%B0123KPWO56'yd7 /*yd89GHJ5POP_UPDTV1.028-MAR-1991 11:33VAX C V3.1-051bRPOP_UPDTpop_updt rPOP_QUITENDITCOPYMSGDELMSGPOP_LOG POP_UPDT$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO6$CHAR_STRING_CONSTANTSPPerforming maildrop update...PMessage %d, del flag %dP^Uռ ePOP_LOG|VRެXhSR[STRP@WSУ dݣcߥPOP_LOGգ߭DELMSGV ߭COPYMSGܶWRR[2VS2WRRSSV2V~ЬRENDITRPOP_QUIT*[BIWINE.POPPER.BE]POP_USER.C;1+,2./ 4p<-%B0@123KPWO56`6pb7şZY89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_user.c 1.5 7/13/90";#endif not lint#include #include #include #include "popper.h"/* B * user: Prompt for the user name at the start of a POP session */int pop_user (p)POP * p;{ /* Save the user name */* (void)strcpy(p->user, p->pop_parm[1]);6 /* Tell the user that the password is required */H return (pop_msg(p,POP_SUCCESS,"Password required for %s.",p->user));} *[BIWINE.POPPER.BE]POP_USER.OBJ;1+,'./ 42 -%B0123KPWO56`+r+yd7=.yd89GHJ5POP_USERV1.028-MAR-1991 11:33VAX C V3.1-051ORPOP_USERpop_user. | STRCPYPOP_MSG POP_USER.$CODEn$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO$CHAR_STRING_CONSTANTSPCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_user.c 1.5 7/13/90PPassword required for %s.P^ЬR{STRCPYRPOP_MSG*[BIWINE.POPPER.BE]POP_XMIT.C;6+,7./ 48-%B0@123KPWO56exX7ҠZY89GHJ#include #include "popper.h"/*8 * xmit: POP XTND function to receive a message from , * a client and send it in the mail */ pop_xmit (p)POP * p;{1 pop_msg(p,POP_FAILURE,"XMIT not supported.");} *[BIWINE.POPPER.BE]POP_XMIT.OBJ;1+,./ 4 -%B0123KPWO56`TP3yd75yd89GHJ5POP_XMITV1.028-MAR-1991 11:33VAX C V3.1-051LRPOP_XMITpop_xmit POP_MSG POP_XMIT$CODE$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNO$CHAR_STRING_CONSTANTS=PXMIT not supported.P^ݬPOP_MSG*[BIWINE.POPPER.BE]POP_XTND.C;1+,)./ 4p:-%B0@123KPWO565e7 |4ZY89GHJ/*> * Copyright (c) 1989 Regents of the University of California.@ * All rights reserved. The Berkeley software License Agreement9 * specifies the terms and conditions for redistribution. */ #ifndef lintpstatic char copyright[] = "Copyright (c) 1990 Regents of the University of California.\nAll rights reserved.\n";5static char SccsId[] = "@(#)pop_xtnd.c 1.5 7/13/90";#endif not lint#include #include #include "popper.h"/* 7 * xtnd: Handle extensions to the POP protocol suite */-extern xtnd_table * pop_get_subcommand();int pop_xtnd (p)POP * p;{ xtnd_table * x;4 /* Convert the XTND subcommand to lower case */! pop_lower(p->pop_subcommand);> /* Search for the subcommand in the XTND command table */A if ((x = pop_get_subcommand(p)) == NULL) return(POP_FAILURE);< /* Call the function associated with this subcommand *// if (x->function) return((*x->function)(p)); /* Otherwise assume NOOP */) return (pop_msg(p,POP_SUCCESS,NULL));} *[BIWINE.POPPER.BE]POP_XTND.OBJ;1+,8./ 4< -%B0123KPWO566$/yd71yd89GHJ5POP_XTNDV1.028-MAR-1991 11:33VAX C V3.1-051URPOP_XTNDpop_xtnd@ PPOP_GET_SUBCOMMANDPOP_MSG POP_LOWER POP_XTND@$CODEn$DATASTDINSTDOUTSTDERRERRNO VAXC$ERRNOPCopyright (c) 1990 Regents of the University of California. All rights reserved. RP@(#)pop_xtnd.c 1.5 7/13/90P^ЬR{ POP_LOWERRPOP_GET_SUBCOMMANDPPР RݬbݬPOP_MSG*[BIWINE.POPPER.BE]SETITEM.C;1+,}!./ 4=-%B0123KPWO56`uœ7@J`]89GHJ~ POPPER1.BCK}!%B[BIWINE.POPPER.BE]SETITEM.C;1=#include "itmlst"=void setitem(ItemList *a, short b, short c, void *d, long *e){ a->buffer_length = b; a->item_code = c; a->buffer_address = d; a->return_length_address = e;}*[BIWINE.POPPER.BE]STANDARD.H;1+,/./ 4(-%B0123KPWO566J7@m=h]89GHJ#ifndef ___STANDARD_H___#define ___STANDARD_H___ #ifdef vax11c(# define VARIANT_STRUCT variant_struct'# define VARIANT_UNION variant_union&# define END_VARIANT ___kludge___&# define GLOBAL_DEFINITION globaldef&# define GLOBAL_REFERENCE globalref#else # define VARIANT_STRUCT struct# define VARIANT_UNION union# define END_VARIANT # define GLOBAL_DEFINITION "# define GLOBAL_REFERENCE extern#endif#endif *[BIWINE.POPPER.BE]STRING_DEF.H;1+,~o1./ 48B-%B0123KPWO56vœ7|"a]89GHJ#ifndef STRING_DEF_H#define STRING_DEF_H#include descrip$#define STRING struct dsc$descriptor8#define DYNAMIC_STRING {0,DSC$K_DTYPE_T,DSC$K_CLASS_D,0}##define SPTR(a) ((a).dsc$a_pointer)"#define SLEN(a) ((a).dsc$w_length)$#define PPTR(a) ((a)->dsc$a_pointer)##define PLEN(a) ((a)->dsc$w_length)#endif*[BIWINE.POPPER.BE]UAF.H;4+,}./ 4_,-%B0123KPWO56h]7`@h]89GHJ#ifndef ___UAF_H___#define ___UAF_H___#include prvdef#include "standard.h"//* add the following for the second longword */ #define PRV$M_UPGRADE 0x00000001"#define PRV$M_DOWNGRADE 0x00000002#define PRV$M_GRPPRV 0x00000004 #define PRV$M_READALL 0x00000008!#define PRV$M_SECURITY 0x00000040/* *** MODULE $UAFDEF *** *//* ++ */$/* User authorization file format */@/* Note: With the exception of the username and account name, */@/* all strings are blank padded counted strings. Username and *///* account name are uncounted, blank padded. *//* -- */1#define UAF$C_USER_ID 1 /* main user ID record */+#define UAF$C_VERSION1 1 /* this version */9#define UAF$C_KEYED_PART 52 /* ISAM keys come this far */6#define UAF$C_AD_II 0 /* AUTODIN-II 32 bit crc code */>#define UAF$C_PURDY 1 /* Purdy polynomial over salted input */I#define UAF$C_PURDY_V 2 /* Purdy polynomial + variable length username */"#define UAF$C_PREFERED_ALGORITHM 25#define UAF$K_FIXED 644 /* length of fixed portion */5#define UAF$C_FIXED 644 /* length of fixed portion */"#define UAF$K_LENGTH 1412 #define UAF$C_LENGTH 1412#define UAF$S_UAFDEF 1412#define UAF$S_USERNAME 32#define UAF$S_PARENT_ID 8#define UAF$S_ACCOUNT 32#define UAF$S_OWNER 32#define UAF$S_DEFDEV 32#define UAF$S_DEFDIR 64#define UAF$S_LGICMD 64#define UAF$S_DEFCLI 32#define UAF$S_CLITABLES 32#define UAF$S_PWD 8#define UAF$S_PWD2 8#define UAF$S_EXPIRATION 8#define UAF$S_PWD_LIFETIME 8#define UAF$S_PWD_DATE 8#define UAF$S_PWD2_DATE 8#define UAF$S_LASTLOGIN_I 8#define UAF$S_LASTLOGIN_N 8#define UAF$S_PRIV 8#define UAF$S_DEF_PRIV 8#define UAF$S_MIN_CLASS 20#define UAF$S_MAX_CLASS 20 #define UAF$S_NETWORK_ACCESS_P 3 #define UAF$S_NETWORK_ACCESS_S 3#define UAF$S_BATCH_ACCESS_P 3#define UAF$S_BATCH_ACCESS_S 3#define UAF$S_LOCAL_ACCESS_P 3#define UAF$S_LOCAL_ACCESS_S 3#define UAF$S_DIALUP_ACCESS_P 3#define UAF$S_DIALUP_ACCESS_S 3#define UAF$S_REMOTE_ACCESS_P 3#define UAF$S_REMOTE_ACCESS_S 3struct uaf$r_flags_bits{5 unsigned uaf$v_disctly:1; /* no user control-y */> unsigned uaf$v_defcli:1; /* only allow user default CLI */@ unsigned uaf$v_lockpwd:1; /* disable SET PASSWORD command */B unsigned uaf$v_captive:1; /* captive account (no overrides) */8 unsigned uaf$v_disacnt:1; /* no interactive login */: unsigned uaf$v_diswelcom:1; /* skip welcome message */9 unsigned uaf$v_dismail:1; /* skip new mail message */8 unsigned uaf$v_nomail:1; /* disable mail delivery */> unsigned uaf$v_genpwd:1; /* passwords must be generated */< unsigned uaf$v_pwd_expired:1; /* password has expired */A unsigned uaf$v_pwd2_expired:1; /* 2nd password has expired */3 unsigned uaf$v_audit:1; /* audit all actions */> unsigned uaf$v_disreport:1; /* skip last login messages */> unsigned uaf$v_disreconnect:1; /* inhibit reconnections */5 unsigned uaf$v_autologin:1; /* auto-login only */N unsigned uaf$v_disforce_pwd_change:1; /* disable forced password change */};struct uaf$r_flags_v5_bits{5 unsigned uaf$v_disctly:1; /* no user control-y */> unsigned uaf$v_defcli:1; /* only allow user default CLI */@ unsigned uaf$v_lockpwd:1; /* disable SET PASSWORD command */9 unsigned uaf$v_restricted:1; /* restricted account */8 unsigned uaf$v_disacnt:1; /* no interactive login */: unsigned uaf$v_diswelcom:1; /* skip welcome message */9 unsigned uaf$v_dismail:1; /* skip new mail message */8 unsigned uaf$v_nomail:1; /* disable mail delivery */> unsigned uaf$v_genpwd:1; /* passwords must be generated */< unsigned uaf$v_pwd_expired:1; /* password has expired */A unsigned uaf$v_pwd2_expired:1; /* 2nd password has expired */3 unsigned uaf$v_audit:1; /* audit all actions */> unsigned uaf$v_disreport:1; /* skip last login messages */> unsigned uaf$v_disreconnect:1; /* inhibit reconnections */5 unsigned uaf$v_autologin:1; /* auto-login only */N unsigned uaf$v_disforce_pwd_ch ange:1; /* disable forced password change */ unsigned uaf$v_captive:1; unsigned uaf$v_disimage:1;};struct uaf$r_primedays_bits{H unsigned uaf$v_monday:1; /* bit clear means this is a primary day */D unsigned uaf$v_tuesday:1; /* bit set means this is an off day */ unsigned uaf$v_wednesday:1;  unsigned uaf$v_thursday:1;  unsigned uaf$v_friday:1;  unsigned uaf$v_saturday:1;  unsigned uaf$v_sunday:1; }; struct UAFDEF{+ char uaf$b_rtype; /* UAF record type */0 char uaf$b_version; /* UAF format version */J short int uaf$w_usrdatoff; /* offset of counted string of user data */7 char uaf$t_username[UAF$S_USERNAME]; /* username */ VARIANT_UNION {. long int uaf$l_uic; /* user ID code */ VARIANT_STRUCT {6 short int uaf$w_mem; /* member subfield */5 short int uaf$w_grp; /* group subfield */ } END_VARIANT; } END_VARIANT;4 long int uaf$l_sub_id; /* user sub-identifier */J long int uaf$q_parent_id[2]; /* identifier of owner of this account */9 char uaf$t_account[UAF$S_ACCOUNT]; /* account name */5 char uaf$t_owner[UAF$S_OWNER]; /* owner's name */9 char uaf$t_defdev[UAF$S_DEFDEV]; /* default device */< char uaf$t_defdir[UAF$S_DEFDIR]; /* default directory */= char uaf$t_lgicmd[UAF$S_LGICMD]; /* login command file */F char uaf$t_defcli[UAF$S_DEFCLI]; /* default command interpreter */@ char uaf$t_clitables[UAF$S_CLITABLES]; /* user CLI tables */ VARIANT_UNION {5 long int uaf$q_pwd[2]; /* hashed password */1 long int uaf$l_pwd; /* 32 bit subfield */ } END_VARIANT;1 long int uaf$q_pwd2[2]; /* second password */; short int uaf$w_logfails; /* count of login failures */4 short int uaf$w_salt; /* random password salt */2 char uaf$b_encrypt; /* encryption algorithm */? char uaf$b_encrypt2; /* encryption algorithm for 2nd pwd */8 char uaf$b_pwd_length; /* minimum password length */ char uaf$fill_1;C long int uaf$q_expiration[2]; /* expiration date for account */; long int uaf$q_pwd_lifetime[2]; /* password lifetime */= long int uaf$q_pwd_date[2]; /* date of password change */B long int uaf$q_pwd2_date[2]; /* date of 2nd password change */G long int uaf$q_lastlogin_i[2]; /* date of last interactive login */K long int uaf$q_lastlogin_n[2]; /* date of last non-interactive login */ VARIANT_UNION {> long int uaf$q_priv[2]; /* process privilege vector */ union prvdef uaf$r_priv; } END_VARIANT; VARIANT_UNION {D long int uaf$q_def_priv[2]; /* default process privileges */$ union prvdef uaf$r_def_priv; } END_VARIANT;G char uaf$r_min_class[UAF$S_MIN_CLASS]; /* minimum security class */G char uaf$r_max_class[UAF$S_MAX_CLASS]; /* maximum security class */ VARIANT_UNION {7 long int uaf$l_flags; /* user flags longword */1 struct uaf$r_flags_bits uaf$r_flags_bits; } END_VARIANT;] char uaf$b_network_access_p[UAF$S_NETWORK_ACCESS_P]; /* hourly network access, primary */_ char uaf$b_network_access_s[UAF$S_NETWORK_ACCESS_S]; /* hourly network access, secondary */W char uaf$b_batch_access_p[UAF$S_BATCH_ACCESS_P]; /* hourly batch access, primary */Y char uaf$b_batch_access_s[UAF$S_BATCH_ACCESS_S]; /* hourly batch access, secondary */W char uaf$b_local_access_p[UAF$S_LOCAL_ACCESS_P]; /* hourly local access, primary */Y char uaf$b_local_access_s[UAF$S_LOCAL_ACCESS_S]; /* hourly local access, secondary */Z char uaf$b_dialup_access_p[UAF$S_DIALUP_ACCESS_P]; /* hourly dialup access, primary */\ char uaf$b_dialup_access_s[UAF$S_DIALUP_ACCESS_S]; /* hourly dialup access, secondary */Z char uaf$b_remote_access_p[UAF$S_REMOTE_ACCESS_P]; /* hourly remote access, primary */\ char uaf$b_remote_access_s[UAF$S_REMOTE_ACCESS_S]; /* hourly remote access, secondary */ char uaf$fill_2[514 - 502]; VARIANT_UNION {B char uaf$b_primedays; /* bits representing primary days */9 struct uaf$r_primedays_bits uaf$r_primedays_bits; } END_VARIANT; char uaf$fill_3[516 - 515];/ char uaf$b_pri; /* base process priority */9 char uaf$b_quepri; /* maximum job queuing priority */? short int uaf$w_maxjobs; /* maximum jobs for UIC allowed */ /* 0 means no limit */G short int uaf$w_maxacctjobs; /* maximum jobs for account allowed */ /* 0 means no limit */G short int uaf$w_maxdetach; /* maximum detached processes for UIC */ /* 0 means no limit */; short int uaf$w_prccnt; /* subprocess creation limit */3 short int uaf$w_biolm; /* buffered I/O limit */1 short int uaf$w_diolm; /* direct I/O limit */8 short int uaf$w_tqcnt; /* timer queue entry limit */0 short int uaf$w_astlm; /* AST queue limit */. short int uaf$w_enqlm; /* enqueue limit */0 short int uaf$w_fillm; /* open file limit */5 short int uaf$w_shrfillm; /* shared file limit */8 long int uaf$l_wsquota; /* working set size quota */: long int uaf$l_dfwscnt; /* default working set size */9 long int uaf$l_wsextent; /* working set size limit */3 long int uaf$l_pgflquota; /* page file quota *// long int uaf$l_cputim; /* CPU time quota */= long int uaf$l_bytlm; /* buffered I/O byte count limit */B long int uaf$l_pbytlm; /* paged buffer I/O byte count limit */L long int uaf$l_jtquota; /* job-wide logical name table creation quota */E short int uaf$w_proxy_lim; /* number of proxies user can grant */< short int uaf$w_proxies; /* number of proxies granted */E short int uaf$w_account_lim; /* number of sub-accounts allowed */A short int uaf$w_accounts; /* number of sub-accounts in use */( char uaf$fill_4[UAF$K_LENGTH - 580];};#endif*[BIWINE.POPPER.BE]UAFSUBS.C;1+,Uu+./ 4L6-%B0123KPWO56d77F\89GHJH/* Guess_Password, written by Joe Meadows, released to the world in '89.@ This is a public domain utility. No parts of this utility are@ copyrighted in any way. It may be used in any way, by anyone.= There are no restrictions on this code. You may include it@ in a commercial package if you wish. Feel free to send money,/ or better yet, make a donation to the FHCRC. Joe Meadows Jr.+ VAX/VMS System Manager / guru in training( Fred Hutchinson Cancer Research Center 1124 Columbia St. Seattle Wa. 98104 bitnet - JOE@FHCRCVAX1 arpa - JOE%FHCRCVAX.BITNET@WISCVM.WISC.EDU voice - (206) 467-4970*/#include #include #include #include #include "uaf.h" struct FAB fab; struct RAB rab; struct UAFDEF record; char pswd_bin[8];B struct dsc$descriptor outpswd = {sizeof(pswd_bin),0,0,pswd_bin};B struct dsc$descriptor username = {12,0,0,record.uaf$t_username};) struct dsc$descriptor word = {0,0,0,0}; int sts; int openuaf(){ fab = cc$rms_fab; rab = cc$rms_rab;# fab.fab$b_fns = sizeof("sysuaf"); fab.fab$l_fna = "sysuaf";, fab.fab$b_dns = sizeof("sys$system:.dat");$ fab.fab$l_dna = "sys$system:.dat"; fab.fab$b_fac = FAB$M_GET;L fab.fab$b_shr = FAB$M_SHRGET | FAB$M_SHRPUT | FAB$M_SHRDEL | FAB$M_SHRUPD; rab.rab$l_rop = RAB$M_NLK;! rab.rab$w_usz = sizeof(record); rab.rab$l_ubf = & record; rab.rab$l_fab = &fab; rab.rab$b_krf = 0; rab.rab$b_rac = RAB$C_KEY; sts = SYS$OPEN(&fab); if (!(sts & 1)) return(sts); return (SYS$CONNECT(&rab));} closeuaf(){ SYS$CLOSE(&fab);}int checkpass(user, pass)char *user,*pass;{ strupcase(user); strupcase(pass); rab.rab$l_kbf = user; rab.rab$b_ksz = strlen(user); sts = SYS$GET(&rab); if (!(sts & 1)) return(sts); sts = 0; if (record.uaf$b_rtype == 1) {' word.dsc$w_length = strlen(pass); word.dsc$a_pointer = pass;3 lgi$hpwd(&outpswd,&word,record.uaf$b_encrypt, record.uaf$w_salt,&username);0 sts = cmp_quad(pswd_bin,record.uaf$q_pwd); } return sts;}strupcase(char *s){ while (*s) { *s = toupper(*s); ++s; }}cmp_quad(int x1[2], int x2[2]){2 return( (x1[0] == x2[0]) && (x1[1] == x2[1]) );}*[BIWINE.POPPER.BE]UAFSUBS.OBJ;1+,.g4./ 4, -%B0123KPWO56@?yd7`&Fyd89GHJ4UAFSUBSV1.028-MAR-1991 11:34VAX C V3.1-051 P P P  P Psysuaf Psys$system:.datP^ W XV\(P CC$RMS_FABl(D CC$RMS_RABf4g,5ާ0Џ $l<5lSYS$OPENPhPhPf SYS$CONNECT^ SYS$CLOSE^ V UTSЬRbPb~TOUPPERPbRbЬRbb~TOUPPERPbRbЬ0ݬSTRLENP4cSYS$GETPfPfPfd\ݬSTRLENPeЬ 2f~h~e LGI$HPWDTPѾRUAFSUBSopenuafcloseuaf checkpass strupcase(cmp_quad! JB CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRMSTRLEN SYS$CONNECTSYS$OPEN SYS$CLOSECMP_QUADLGI$HPWDSYS$GET STRUPCASETOUPPER OPENUAF CLOSEUAF CHECKPASS  STRUPCASE CMP_QUAD$CODE$DATASTDINSTDOUTSTDERRPFABDRABzRECORDPSWD_BINOUTPSWDUSERNAMEWORDSTS$CHAR_STRING_CONSTANTSjЮRЮWѧPPffP^PЬRb~TOUPPERPbR^RЬQЬPa` ѡRRP*[BIWINE.POPPER.BE]VAXC.OPT;3+,()./ 4"-%B0123KPWO56pd7,rd89GHJsys$share:vaxcrtl/sharetwg$tcp:[netdist.lib]libnet/lib"twg$tcp:[netdist.lib]libnetacc/libtwg$tcp:[netdist.lib]libnet/lib*[BIWINE.POPPER.BE]VERSION.H;2+,O ./ 4.\-%B0123KPWO56෕-fY7-fY89GHJ/*. * Current version of this POP implementation */#define VERSION "1.0" 1oM7~ POPPER1.BCKp c[BIWINE.POPPER.FE]BUILD.COM;1$m*[BIWINE.POPPER.FE]BUILD.COM;1+,p./ 4$- c0123KPWO56h΀]7@%xd89GHJ#$ if p1 .eqs. "LINK" then goto link$!$! For debugging, use:$!$! cc/define=DEBUG fe$!$ cc fe$ link:$$ link/nodeb/exe=FE.exe fe, vaxc/opt*[BIWINE.POPPER.FE]FE.C;1+,[ ./ 4F:- c0123KPWO56xd7Txd89GHJ/* VMS POP3 server - front end*7* Written by Bill Wine (biwine@vassar.edu) March, 1991*F* Listen for connections on the POP3 port (110). When a connection isB* accepted, write the device name associated with the channel to aE* mailbox. Wait for an event flag to be set by the back end process,<* then deassign the channel and wait for another connection.F* The back end process does the work. This design avoids the overheadE* of process creation for each POP client request. A variable number** of back ends may be running at any time.*/#include stdio#include types#include socket#include netdb#include string #include in#include errno#include dvidef#include iodef#include descrip#define POP_PORT 110(int status,chan,buflen,new_socket,debug;struct sockaddr_in sin;char devnam[64]; int devunit,devlen,ulen,iosb[2];short mbxchan;struct { short buflen,itemcode; char *bufaddr; int retlenaddr;- } itmlst[]={{63,DVI$_DEVNAM,devnam,&devlen}, {4,DVI$_UNIT,&devunit,&ulen}, {0,0,0,0}};"static $DESCRIPTOR(mbxd,"POPMBX");"static $DESCRIPTOR(cefd,"POPCEF");main(){ #ifdef DEBUG debug = 1;#else debug = 0;#endif! sin.sin_port = htons(POP_PORT);# sin.sin_addr.s_addr = INADDR_ANY; sin.sin_family = AF_INET;' chan = socket(AF_INET,SOCK_STREAM,0);+ if (debug) printf ("chan = %d\n",socket); if ( chan == -1 ) { printf ("socket failed\n"); exit(1); } ) status = bind( chan,&sin,sizeof(sin) ); if (status == -1) errormsg("bind failed\n");" status = listen(chan,SOMAXCONN); if (status == -1) errormsg("listen failed\n");1 status = sys$crembx(1,&mbxchan,12,0,0,0,&mbxd);+ if (debug) printf("Mbxsts: %d\n",status); if (!(status&1)) errormsg("crembx failed\n");$ status = sys$ascefc(64,&cefd,0,0); if (!(status&1)) errormsg("ascefc failed\n"); while (1) { fe_accept(); }} fe_accept(){ new_socket = accept(chan,0,0); if ( new_socket == -1 ) errormsg("accept failed\n");@ if (debug) printf ("\nnew connection,socket=%d\n",new_socket);= status = sys$getdvi(0,(short)new_socket,0,&itmlst,0,0,0,0);A if (debug) printf("devnam: '%s', unit: '%d'\n",devnam,devunit); status = sys$clref(64);E status = sys$qiow(0,mbxchan,IO$_WRITEVBLK|IO$M_NOW,iosb,0,0,devnam, devlen,0,0,0,0);6 if (debug) printf("qiosts: %d,%x\n",status,iosb[0]); status = sys$waitfr(64);) status = sys$dassgn((short)new_socket);} errormsg(msg) char *msg;{ printf("%s\n",msg); shutdown(chan,2); exit(status);}*[BIWINE.POPPER.FE]FE.EXE;2+,Q"%. / 4 - c0123 KPWO 56ad7d89GHJ0DX0205(dh FEV1.0d05-05  ? ! VAXCRTL_001! LIBRTL_001! MTHRTL_001POPMBXPOPCEFchan = %d socket failed bind failed listen failed Mbxsts: %d crembx failed ascefc failed accept failed new connection,socket=%d devnam: '%s', unit: '%d' qiosts: %d,%x %s _INET0:?  8^< RWSWURTVgn~PԣcPegߢ eߢ  ceBPdd"ߢ( ed eaPdd"ߢ5c edK f|~ ?YPdg dߢD% d"ߢP eld|~@~@PdP"ߢ_e4dP<^aRJUTS|~/ Pdd&ߢnrcVe dߢ}J|~|~42d~Pce ˜@~Pc|~|~|~p~2~ Pcec²@~xPc2d~Pc^IRݬj| ^Ь RbbTTTUP|T|~|~|~|~߭<~ݬ ˏPSh/H` nyiJ?34p-w@£ clݳ۽T MF[f~D[2[6RaG<֣q.QEOf뷪M{ճ0I(褊YBA˕׎A뼏k=mHhq<1BՁ.ĸƸWy1JyT0I Fa\~y i7 '~K14H[+@ATqKKv~ptas) zi!IVGKA;(ctR '#GbM8?+ l)$a3(7-E-c![W%s^T+3 s?wG r$&(2) 'wׇT"(kSEo L ,C,%zqTRW)JN0$jk#}/(o;syk?w?4zKDI>%1}X OCtK\}.~g5~" (5mf#k/uk/=6l}}V NhCYp~4zDF]XmFA(y 6b&/If}nj\o9;7`k6sX^ #x))m kIv fG U:8s5j V"=+n2mcn;W0[McCJ}M{7T` t\{=hJ;~c(ebu;ttnx!`wY(c7dxz:UK!gm{f3Vv6ex6:$n`-oH V*Fy_!s<2I$l~mB @R )$MHN:)oK|l2t&kLͿ w:7v)J|$[X^I  (~V]H V*%Iiq59T`vldAY lyR){gw|^!zX32NbGOqgh.K"5;2Xp(hji2XK8D<+_}2Y nh92k8`>]:!i[ b%K@{iWd%7i+ %k>!LO,aPYlvE>xr \ \*RztYO %e5x QmF/-!xId@qlODpy>q8s.F j`Rs5r|qaDC/W^_&~J%hNKtLx,=Qt(P{j;f5 8*~l SF||zS[7j0HL,&*\K- AfRWe HsBO6vq T>e;)]wB ptz{NUKoz|l+VH1z!z=nvNA#tTV }ji=%a|6,'|s?Yu%C/EN-0k:CI ?\ Kva64T ~ U=#ek=blp2iMIPb!0CIBH\~7h%@oiLxa[+:2#3%4'},4isQ\F6tV[N4@qy,DYIT0gNa<3=KJUB\{%|@ En=&djDAyQ` ip\%}#H89js!$5.FX2RB^g]6>RC6ka`W%8C_ iG+Ilg\,7yYCYID*%Z aiCW.\zO,]b**4 TAd0#w%o2R<!pXfD]^U!5"VrKet.0}um>#q % v>@NA3WG? I,i#{k77\;H-"759v&LOuA-]Z llmRNxZv|PmS4=LnKw y?;0?`vFO::+'i(jsm617u@suC^\5u4+!Jsq*7I>xl$m !az{ (<~ :w3 7Seh)g;q"w84e4UHI,'[MP~V L*f!|KhntXV_AbXH?F!Cñcs&>J՞]?Mg#n|- wD"j@WhA g2Z6r?EQg+!&AXaz%*yX~^ap=iH>/K}G|o5I'O64`Rc"g.2^vn4 q.Y M8Y*FN['yFQ0g'}7`1Re.[ Wp$p b^B MXgZ.PH '8ZG"Gp 2no'; \7HQ @OWy ~"o;9%n 48zc\~|p'wr#cVUCP5&PLLyHC\ CUhY, g;O@0^(x^y#Pl[i,Bd)R[[Iov eIKNOCEww"GK[%p9o(NX9! 5y!֦c?A {P1f EbDB>X5U`k}>'\vc&hʽfF6$~kJ 'b$(&:7Н@yLiO\qAU+L>I a:UĄ۝s:Ww ݥwvG0@_PzfGr$Oi_Ws$`3 Q8eU7o_XZui|Hfb,7~| 00Z8pEN ])L~h G[.x5|YE*'Qk&2b%r;5 PtCz*8 d(f .}z8:diXDFb#o9fn ;]v,2(my1v2+;5X;\J=YPPc}b# N>a70ab~")D:cm@`K Pn` 1*Q9pm6B,}LDW.3: G:`i]X[Oum*/1Q;;fZ+o>YEyY/4`~m^A8"n0I:7,YQI f@hV`9&GWF@4YUM{30u CX-BTwr)l K=s'HT+)`}t`ASEIA<4-P(6v==vvu)Nt<> tmrG Q d,Fkq Y# s?w  XY_r#;pv8bg@GU/iuP.>!&Au lYOE^Z^8A^2EyTI}:OEQ@u'IG4ZR'w6E|\SDf]tao1h$6@*#0aH9s3CN*\"L:h.u>kH5{i :#XMJ0D7I xPv5 6'5*mXdX mLcjnma3UXA:,UR~A8 +&dJWuohW?{ORd,X1jIP&~ce[(t8$Z.ZEU;,D3.[v]*A;V&:r(C@ DDGLPyR '[H::!=OUu5d $>"f'~h,tV1FnzeKmN-;>U@0#=Y)LHZM;L.(jeqdbUUh;6zjBL+H\W^1>*BDQB!^;#yND%0E:bmgtlse*ut% GC V;1<@3[~Tsw-./Dst(N)6P-("e0) 셣d$.2q MZ@l"(^W[ JWs9 p #&{6LQj7DS~hY\oB f,Oqkvn-6)?KwI-v4s*:q."_zm<&[{suEi[|]aKoKO|'ep #/ C@W3:dqcD=kEfAFf`Y`z hO|gh9hONqSd;s`t@(wXbzNhOUd]Y*_ 0B8m`i}4T=!zv{ ) Q\R{q7,9 /a s*NrnAE%I^l{HXUSV#YRYUMNDii1oGB)!,lR-!~rYk2WgG&3lAN,[t  Sz _j68h,x=0k;23zrhp&Ly.nxv/QdhBYBA 3Nv>;eW V\L<B-DXM.bRC#>f0ؽԅ񺖡}ڇϕʛ>݂ΝԔr(1>mv 9r;y{vfKfti ъmWYQ;aϗۓ̻ȉ¾݊ܝ%h~;2VydNM )DJeGqE3K}#W\[.HI. ej'3ZuFQ=k%LGM'Gn nG"\JF!|YXQoVJz*c-eQ/Wt7Ie$/wydmaD8/vF]& l@.O8rRE=,{,|6Gg~.nxAHnPjB ![ FKX %Lt \P6t M302oKd9H0LK%aP&oR QZ !YXkOy88U {HJnEkpxq"]$U"e"|?(4mrk!mGP#olY8+Tuc~(u`o[e@[i27% \^W 13 e/pIL'Nv @4yyy7R"+V\Z%)uX?Yx2&?Mj`u8Db!'|ht4ON$zM1ܜ~ <VQpsR$0-"C4!lIp0,c/fV_sl44Hj]<}5%eIe6Z5Tn|Ha ,rt:O"QkNbAv)-I-Ã1f*i5y5)!]T#BTpi9~Jۖ[*-wP:-"%o~ՁU92JFiƼ,xv} t5n (K KBLH RkMTW vbpL J#%5As-ucwH#$K@CM\XwNw=;Տl](`*^â`1"X2No$_'GH?BX]cHe`=WCJ]3:+#A8?^V֥KEf2TsXct HBjZk3=et 0w_[q&x4k3tZ'KKwq#ez1'F+ZQs%nP`i=L{0lPSHQp[/ĺ㖅pWs uF Y}pM \ 0t#Eau֡.̹._ KϤFAM"&$G~n;`q/eX¢Y*ܱzB;zA92"Bئi>z}o.UMPcB8r\mP#~'DG7/ qmakAph*Ze>1_ڱUiegŢ" ]%e\?`4AHgu7mPZ2l]-&|j£YˮtO"f|Q"! afR58oADtg=mS8"M)߰BeqmUG>XdK[~ $OrFx;?x/:Ucz}ƀYɇpș~;ҿ lň4ěŠ۬|:?+ŝ=" Rz= Z[e yИł: a(aNϡL֦b|j)B0Prf7.٠V:dIЯY UwşKs y$涸aK1تAXxtD{S[<&~Q_-\+{}x{pQNEE'Z&҃R))sR^,fh%eBtb ;U>O!!K]=.p\o**p^X%OUl^cGnXp1D:'|bu#'fi@Q3LgH9sS};n@@mԢў|xїyc#d;%z!Ѣ,9;mJe W$J[ AIBj>8 xwyW NW P'16a KzBurwrnv5 -.BD]HPvGr731q*Vu9|j# dVfRR] T)OCEFi_JMEa{QRp. l/oi`zB,sFdf(|EDOYrj o!^!DV 9Pt cAJ@l^ B i$7>x!v*)/$(0:D+ FOAFXIPH)4=hJ$Xx:(\ON%?.-rM F*%$5i^:!^Zq~eIB<,KpnguC~\q`e~7j`r ~{mf N`XYU<8i+]_gZ1+UWSE ~ ^XW0WQ%gR?/Lq%U t/Y/^M[VEڊCHXO@K9Crk9t5xR^rrb2kz&R[ wHvTn~l087WcINW#x*wi;5h\!v:R' +V RWj%:F: KuS&KZJO nDaHof{/@Q )P.8%t=a5[)fatxebwczKyefJ))o*}mkeL2uMsD|#rq8(.0tFq*M5e$dholUFqJ̢,m]_yb_AAeg|#+.76L$UZ!6tqgzf3"09,q/4n\$1wIu+(b;'biT:3 >%1*#R.)&0$t DLLRgQ}/eoJOzvSEe^$vkYe0B)v`ky -J5T}(I}OXB,nih?2Q]&?Z9v}s(nEV|0{h -qoalL":9haZybصKEr4WOmh*_1߇ ՏZ O2O)~ii΍55ZPEJbP|a3 [ZXK{$U9N`I WSk7Ī\uA0\:WYSiʖtCdPb!~MdE l> Ǻڠ+bw3M4.Kbyo6sx%>/y7gXw+m5kc'[*f-mSUVO$~Yxqm_i 3lڃYCG! 8o}eH7`(T*A_Goz=Q wsgnFT`l'E%fܕxmpaYqC:[%ю3O[n`MTO\u:NB]"@o*K}-`ze*4#¸w|#UǶt8GWA%WV0KYx|n hs^gD; 5)!AGxW|{rawG@hlٲ8|^6&>^0ݯ@ BD`~Yߊ R'NĄg7Uk(S"6AOhwyb۪NaK\Zt:ߒ(A gXڃٽ|#kAĂik97k? 4f[A90v&S2XfNtIH?,~j`6lm~}[ywC;/.?)~*~9Fpx:/M#$f 17)jb5crQbCq~#vCA KmSuKOg몜5afV L^t{o(*iS(A6BD]ʵ]]3үR#J0LwcrFy,LO\A$!{iHJpHj^l&0k݈-saj.R'fٳ6Zv\ɩx:V%I֮;sVkG1Y,m^ -~ ⟣4nq#{8 xXu_++Ivj06ZJb9 NIUQXp;PN#;wfI @S SSCHXAP_"Y-V1MF:!@$uhKtm 4'zWU XH54B v.^Q':s299Gd/(W@W+_S\YrkSPCkj.xswx5rvr_N(mC|u{HG1;fjQIHg#|suMc&bg=흪JYZuyUHwm"I&ܶX'lPfv۳9ʯM4|#.X H i]L&K^q)Xd-D J_U[}lrDB+].:$?=UhSX7vn6i2Fy4(;Bsm$ x/Q7RZXyZQ>jF\&ggc T{S|. Ë}2OdQ+5_(Kizp٣YDjr( i|xwZqzج_}F C)~2/XM:mjbϾEΫTYMY*qBCC7L<8<ְl'cWgoZ) ^kRHI$ dIFD('TVT[ .^-v>'Cy%8⡻?=,|w˵,ha}$IxYb1'"&mRM LCMZCD6KwC3:S_W8_+P5Dׯp\;L|n9xyj}P[>m{迧ZZ@7DD_1I5?1řb5Efk*6<'TzH.m E-(,?4_nWWak Wc0`o]6BsvHdNDOnc _^2R(yŐq.}:"l7\TϬ'sgIk]#dn"ax.,t[IF ϊN"vwhVhNOpf*wLVXMlO'$oj%0 s-ItXmm RKw 3bfS@4NsI(Nd1]@쇍4]l } ?HS7jR\}T-,u僝0d@n/**e UλLgt)H;#$tXy1+{85Ƈ")o}"ޡgg˳KIYJOJ+ JH~4Εǜ=Rx̏dcA&ΗXҘȮM}ӡg $>5E@_g$ad0GgZ!GkvGP9}-GYI]D k!rpz'.puseo1,P0sex~n/OR)7UJUOcQ~ Wn/sIlFDE1PQLT RHUGV-)$@ AFB )Pok!F_6A-RM H{, bdVL  uJp1&1$%ff7}B!ryevEY5~%l}idnl{uzv%8=!lynrs:oah cu:*hB3e{2:NYE;J^;+C'm`&}.70|c 1RqYc$J-()&[ti V*n[+(ocgv !lk?0+d 9 {f-Zcj{smyilhh.95a5 TQ]TJ la!? SMhea\_`B`e'rl=-v pF-weT7~9cb6!3d'ei)aF 4"F|nIz*7 A! P\"W1~LARd9'ONg9z^4t_>qV}/oilc LJwl~=1a(9/w:VWuLFD"f~i8)?|q'>X&9 >U$%S> )5,T6Zio}Z%'; B$ ' g>nCo 7sf{" #J&iU :6m̡Wh=UjwN1} hxyCwRvh)M_FHK)Q";z2^xKS m[d3vNXco|q91h!dC"q@<~4qJ$[1f*.Ld5 s +IaD[,XT..Z _b|5 "([q;b"HeIba-ua+Hcw"Ԇ5~xnbJ%L @n%Y ,O&sV}En=1Fz~F`8/ %"" oQb9ce&HWXD 2*x!#*) B`fy6/5p`Dz 6Y9< ?B=A|`#]pyk/B]Rc-t\&!UY MK J*~g'SS_fJRJ!%f=c"64eQT@cZ#!7hc EUdBWzOjpp~TQ.D%c>1vg){j#5aZ<0n(d Qd?n R6DFSB_CnHKTD+"ER|2`n TIP^KN kfgJA:hlq{el,*a?\mW+q=T5)p'JS_EZ 9~u1yR!YBZOyle>;pL\HYc<1/ s{$ [Q>` T_DZ WIYFNPH?of-=P@.7gP"[Xi CC UJ TN^02maNYO[QWras? *IF|hpPr_ tIS0oNYWN I1YI@@zD !~shO 3Y :+xPeTE=CU&GN]GUNXNXP_FYFHF'65#s3# |%y!PQ5CeO2`pIP*bQPYzk \-Pe-<%[,5\I ;N1 H~my:IW^*MK7?4ydvO<sO+QZ"QnQITb%D$rA-s$- iUT RAsCG8D;d L4 (c]R^[x < ^W^2|rA0(xw)wa{nY dOVuhSKVKRIqaD+r2@z?yy`ai(6)0*Atr20,?WW1`9]=EI?d9l}|/+]_U55Ko+)=30(  OBX)piW7tqtDAyg [$}P"/!A*(A T0xEbWV!d?3|ruy _@@ lhey-e|RWGjMQ Hai~re3WFG]aeYVU i{m!^uS)cy(#lv O%(w^D=y7S)7D`)0D&{8[O7c] Q7x /n/"j _Y&,VJ3 AS!Bh!5rxEtAdvSHlH QkCF7 id_RgnrsY=,*.yYe.S7IaM;`ZiQU:UV:YicyevG%U@0Rk|Og~ceZ ZW_> j#`HI4Ifew+UL}^JC\? xYmWa4C4'5o=7CN-C',)X(jm (U15rji[Dq)9$f|2g({Gzc,K) 2ADrZmCccF 69G7&1:ZR g0*2c A7(RJ6,:=*`^KO 1K^ddrj^Vv"!Hm*{SnpUNHu*aP{V:Jlh"<(o*A(mhaxm,LjSR UXcd I],'ep Rlx{1J`6]hilRS;?[Jqhn.!7!(-_ZOu#2o1yM HZ,\w'rS2IC"^twJu0uJw.4$|:cQr4m21rPd{|A$$3y@`zS@rIC_ >0eTA\iskD&n\DCWO U ^Oi<)a}IgX 1j<4o5 Da8)Q 0c}2 6t4D.,I[)i HcAZ547,#\Yr' ,BO,(.QQnd;N/y-XDVhSW2_" @Sd"}4on-lIhOZ8T+Vu 85hFMK]T@:[\{@Cmiso; ^X6r ~kkiX*zj%rd6@7t ~@=p?TaZ]oft)1t$&+9QGY{,pHE rONKyH5fjp^1deGJ0#%C ^@V4`c=DLZ%4r^s?o^-KdOzb12{|u&`'Urڂj2n$P9Xyi8r0gq6J ;_8Iysh|qxX bnZ([O-|y+m:XPHb1?j{A85H<3I 0RU v'QRi|A_P7oK@`2HA\Bw(;ibvg[}&B" |2(gf*3ha!zIzrINl 7sm{XXHE?y O&FR[K]i,9WBre~u%0 r MXLJ 2\dbv\.|B tA aT3IlSCM -$+;7yjAymE]GFrS]H #]J0@ j#$oxRIpK e 1PM [SFaLUFEMWZ_  K>/1~ (6V7\{))~vwW-232,*Ntqbe=۹.qg n)OvYRb ~d{9X,WF :7$-Q 'Ac6h=D$(^%!0;sO1)ALx iQE$}`MJWY#]bk0=;Mk$tdhmy0G}bGclR"fhos9uu>8=`|bzPJ@npJ$v0;C%"&$'kG8UMPqAOXcsq@@Z 6O+>ywc"1?!FU TC!N u;q]=Y6o60wN= lH1BDЬ\/B*%qږ]/6-ۈƔc|-E16 dvy@i[63474g{ܕRQ떮 H pZ^TX.ְDJ`9ƬIoQ_QT0&3/љP!Wv ;EH>`|ZD׮62C,#8>u?s/&-M'Flqw)% ,~& lv)l Rs;|&'TtG,$aZsVMܚ6 |[ rv u[Xd?o)pW\EBg_')*i =B1jU (H^N^HZ Xoo|EI Td;UE].RW}/+!d(II9󚇅/V;Z0`M+3:>rJA.]HZrI:im1Yf<YbvwmahOf.*"q<,3idqlq8(t( #ȗ,+Wea02)r 8Ef"ur"}b!n+!ctgoMtY;oh,jc&glg|e7^vg usGmMv*Z t M4 fZt_ cN5['?o {'"~/q)Tz3 h+00W-?1p'$dC0]#:3Sby"),%(a;K(Lc1ZNX^]!mc7z\P5C=i/x}$ {@HVhUQ"&}9R#] 1YW\OXPEG <p%C '[MP|Yl7ea ]bi?.jABTwyiau.-KQN)`;%98et7n]R+p'z.) @uc%3l~bv#}d= twGV7`x/+}]|hb,g2KdsrDisENS`+ g^&>vx,ud m6p Ixmj&gVe/+`ueRY{5- ?5 IZAG`)$< 8;l7htGmjh /RcWW `NwUqx GƗr!+٥ &|B2  ,dc0Hsg碗ꄎG%h~=zjkl_3?3! BX==B9Ԡ nQ[x9I/ZiCIBچ-Գ[oⷣǿ0=ܬ]bdgb1:%ش%|qd/QR5 #T:=5Xp\NItV2P Oro>z$g aQ]BI wdK[@S0k> [ '˵ RDYNMfC*P 7r-.˼)8~/ocǐK&H}#,$,Ba≎XP [V e9\?Оa73YZNƝnjp½O[SL iGb(_'W61;s¼+ ԀVN+2|F;'rm6֋ W*|Z}:uwv=6w:"1Q(m)0_V 'Ad|h; C]1I^.P{Re7bחp/95jE4zIU4$j.pr /H,2ݝHʽ]<3Y.#)iriXN"W~dh9=2U iw18I8CmG=c`DOyfP/pd+wM&|1xPruMFU6䣑)TK!FI'J)R +_l, -$-`h摪c]F 0#QKH~UETK>E~,8c5lbYRzWZYZXu0C_(wO)*7>eŃEYPԧ|v0 iS:%rfj4](+_"Tn35]"k]G2eu['p AO*.tO&1BQ BnR(1z 9zp)6*O),/9-$8ז8|;⼤_ ;z#ox% M>17|W[DgHwsqˠf?&u-e ' ; 7 66ZE]ɱ]GgOSV-wc#=NQ\KU/)S(4آHbwBU &lރī5}!fxA&:PnNOuVTAPO3Wci):'R\m)5JJ3]8a_?Y{H{N@D If%FIvqU^2X0I>蠅׹T71-7TDީHܿ63 ,j_A{žeI65ͼpny4OD !DqNFWNZAYyzB[HP c W롏PrpD,ky W&wMvZ 2d{vXht퀇E6?}qvyT!oY:s|f(IFX`QwQf QTCņ_uR![AB^\ab̆t;gjY&@~zb 4M S[Dq+eSH8o=.i!i,iƚnh0ԤVo@yD-dz;@$R&.ojN0e)݉ p ك%`Q2! ;2z;fWϗVy& ltdWEeFE9ݤ$BJ- ڻApa꺧ax,JT Qz2QS̞f#9h+}py"S"h AѕVg *o$Q}e.=_")f T$6 |)r|xaF0z&d)3 #ϤM H BL^!xxmn*-D{:nR]\ Qdޣ~_8tHr/j^i9JB˃K¯Iå&a/$ɷ;ӠerX#vIƶ& yt=s=^Z5 dctdBBl>Z(ɡ.[_fV&n? ,$m]A ck`{v]$stJLz\eB$QbK$ku`fwW _5DxJaw\Ko0QMT{Ht ÈJcåb"(C5Ȟ.sW2# %Of6'5h/coP/W i=ߐ/~sA+VYI( z_吉,w( KE$5g hBf-!1seRp[E/&kY !N i  =$a ɸO\U$ vh|u`0IOI3׌( 2$Y$D:Z?F a@h:#Zth~5tl4]۽~rN9=F)I-[ UWRj6k TY" fx6sIan;F,"GYLS6RyWҵužPw:qM_wgmS^ܮ'ī VQ~*UbմL-<-]ֺ)µ*p,~9 BKE{E3XW[J9SқFP@gVޣoK}< 082e Z40iF*0 K3A 26[S8S^RFރ1GHK[Բ^w9Vk3MQvM+`E Ss]0s;KxzeXcg yDyn)s{]ˌi:M}H1V39K~![I?ѳc9oH ߄]:719k X_%H9$pFs Ayh7k^T[RXs;S::!X;tѤfκ& ^]PKcpgG6&n3s{/A=村SntF:!bJ  CATC-cd^SEo%`Gϗn93ދy]N0!FdeM#x9/m͈nލ {rHN &،>g:Ih '(o%tH-yn.s\:] &Yen.)߂w 0٠845L@+CM2Gb,mB<DYobx;fLC]>:_}6-//*C<~e9W70<5~ y2!@c%>ʀ\)c߳IzH7\iR5b罹޴!<⚑.MQqѩ=|Un+RgIDu4<(̮-H ?d|P%5]=Ǖ؄ l-ũ;T2d -qSCf&pM9;SLp$}uU1.s).X(odDNBTCۓCR<? FwUˮi Kp8=PKޔZɻA#\}9MgzpQ^DP.Q_ā1:zZ{,D? BSu }z.̔5~7f B牻`u ?XX ͺ _^q:9*"Dؠ*VAiGLxQ4O=y(S o"!OR|i&#񼊺 $[P~[~CSff/U9:EQg\ɃxroWa5HDeQ"QD?9'[\h*9snªp3љlրn_'م<(q,Snv&y.Owy{U11L/yeG /|Nq q )<3XUuGo|lpQ|3AlE_v#IJ)fJMUx1-  Ef  ȜPxK^7g>X&?ZP8 P㷙  &$qR8;RP6\ERJy1:N Y([z6]\P}6;Ưtf@蚠Z.neO {[_:Wgi1GkNzU_ip^.Q,r4ٓXR+u=*m)aOvlUf S18j6) B\[><֌CWʪs-qwΕ.61v6 "rNU$³H%DRlwo鷋*A|O߆E2 h^{k|ky-w;-S2x1ц% +?-\fEh1p(" CBΝ  "C{uU^l(hdsh u5gȥ[QEvHV-?R[> ڭ\|OPlSk)*'Udb~?RAST[kY[LHB_KWGF G%6rnJ<TIPLIROpgoYo*PKHfMrut{[C33A^^:tcxt38$STDON,㏰˱2)24׭"AT U 6lSFvd1#*"waRTIGS[H\DT_IPU/ZG^@q\ MzWQM^NX\NRBK.FOVK7SO@, |D@TY+UANLKB~TKIAH#5 JZw OHFIWJoi=sR)Fu]UPZlBcihMM-`BBOyBC8@U_VT*FNz J_S 8sPaKQPxM4E6\5 z+0eP=A!G;ݛHLF, T]RroNLHWSTRUORYTG,tfll4`2&i)f"q՗3tgcCA Pt|inet|/0u.%nfhbc 3n)t4!"9)kmi&e:c3=)847:n!>1;n0;4 o-iJ ,cU~e}` GGRn [ZYOK^ ә=7\RדY;8K=Bz *\puIM/|fK}dV8>FXYD:\DFEHKU"\='OVI'~GYzL^ B1 M>+">%$2-a6UsL? ^\i tBqAbcdRDo4}p+-;<NCL ^TwiL  YOELcB1 wsVZlu )EB$ e  \r fF9,lie4C75V6lf14/[ 1n8 u'yefd5``)i]CE|Y x8f!y=9?.saD9 Nt#;aSLS&;2mot?61|SIz/gzByfk iLX LOftv`:6Z}3.*>q2szyf99_>)n>96/k+1&tt*`a", ]dVN0#% )w(Co1t.Lh $%C9)_* , IF' G DFVF2% [7=abCRYcIG+:A]PGECIR#T*|)A3JBlmRaFK{_A%f {GqjiV=-1iAPI' W`@,03h)s<~EEEWVJD.|[IP5Du$E'A~{o4/RMH`kKH#S?C@k0"t:.""9@pFWn+}$})jzs&z{A:E VDew &okA:-t>%b2o(1,-R]R&"k2WʡSO&LrdL Hady\5re; pIX"$fNGs~97,}I5odk~d4Qsni6t~{'N5fr7+yRvk";6ErLI1oNg)_'^Cl1pf 2bt$5jg50K%+e6h*O'd7rTJO7 )4izeBJ< 2"(*O&z'|,`qIOKo|$?"23ogQ1$! M.9iYCi\37&>v+!uh0Vf_ZJm&o%I$,4p!%./ oLMd- -xqh~?g44Lmbo>*'GM?_z1 H(GnQSojdyU.k HdFKS^W37^B8f\OH8)c*OOMTI V,;3j0'v90aMHGp*Ce`E@ܝ#Uw.n3Nmuy]P (ȗl4G7]fu7ȇ15Q-B ΥLZ䰛 {oM CMTURnO"fgAon)(l8+: CC I.}H4e_MQC?"9!-AA8*59#>Am*Y1^Zx|1#:^evj7vUdn=0I j%fd)gy;YpbE &l::݂kna,gcӈza=ӛbW,rd,rgZ,cH(@kpmnZ?cprGqTJE<1k#( #,@D/RX(BtWUsSWc0ߠNwaA`^] %nl%rbp}oqpȤqrVof"K9_$m|,!2  pnb "8N'%0 "-V45+b[`1|}.2= Pgl9-;3@-R/`%1FXY:R0?,L"O.4RHP1iC,_ўZzZERpca5=;:&+0p|fzm.:+I8 @\V+y EwBԆ@P'f7yHh*2هh‡&=$3?^-^GR}jkw\!cgq?87> Jnpy*^UXXq@^J[OJ,k)Iwc3f+5xq?|`elin`LfϪloshdv~bsH~{!&ڨy#no.ck@S`buCl pgmo0)cl+[BoC_-@1tpo ^_MFK#;iOBYef33xpd( N1vflal+m.0vh|"Lj*!=]wܮ,[b?''(_5 n|0OhpUYI"hFf9.g>'nc !paŽZyrspr..a+8prG=>oE%o0/fp,B!T|T/%(6{146qh? 2KS_}WT5TEv2-tV1;LB=> t\)ct|=w LCi}3- -L;*ík`s'h5e=|i>^=/8% s TO$s6$;0$K"'s QMPPA 2&i*W,;3gb){TT4p_xmitVAX))2>e059SQ   [l6 k/ +t 4Y'rIWiE7 &YO5BثSEU^}FR]oA]}z2 OpQn{c"VPLOWZ5cljW&:%#n$y;WAadWkpt cI* ]`rkd1"0C.l @|1?KX\pX065?XE'=uMY{rigتluTg؂g kp7r۟%od+,Ah|esK8eL%: nN F*@M xSbFukh2 ):3RP>YCe(K;g5vaoJ&$ ap&K$oAQdtPncamj(h"kNn#=%p}xeN? e9.X cDFeGlqAq/%D8To\tex}44>l^c?d2arftgv)luĞr< ИfWlder_crea|e], selecte`;i% lhcrhmns:ea[255],meildirZ255],foder[255];@ long mailspec_len, i, j, ulen, mlen, sts, plen, size, totsize;. ItemList null_list, in_list[7],