Annotation of researchv10no/cmd/upas/smtp/smtpsched.i, revision 1.1

1.1     ! root        1: 
        !             2: 
        !             3: 
        !             4: 
        !             5: 
        !             6: 
        !             7: 
        !             8: 
        !             9: 
        !            10: 
        !            11: 
        !            12: 
        !            13: 
        !            14: 
        !            15: 
        !            16: 
        !            17: 
        !            18: 
        !            19: 
        !            20: 
        !            21: 
        !            22: 
        !            23: 
        !            24: 
        !            25: 
        !            26: 
        !            27: 
        !            28: 
        !            29: 
        !            30: 
        !            31: 
        !            32: 
        !            33: 
        !            34: 
        !            35: 
        !            36: 
        !            37: 
        !            38: 
        !            39: 
        !            40: 
        !            41: 
        !            42: 
        !            43: 
        !            44: 
        !            45: 
        !            46: 
        !            47: 
        !            48: 
        !            49: 
        !            50: typedef        unsigned char    u_char;
        !            51: typedef        unsigned short   u_short;
        !            52: typedef        unsigned int     u_int;
        !            53: typedef        unsigned long    u_long;
        !            54: typedef        unsigned short   ushort;                
        !            55: 
        !            56: 
        !            57: 
        !            58: typedef        struct   _physadr { int  r[1]; } * physadr;
        !            59: 
        !            60: 
        !            61: 
        !            62: 
        !            63: typedef        struct   label_t        {
        !            64:        int     val[12];
        !            65: }  label_t;
        !            66: 
        !            67: typedef        struct   _quad { long val[2]; }  quad;
        !            68: typedef        long     daddr_t;
        !            69: typedef        char *   caddr_t;
        !            70: typedef         u_long  ino_t;
        !            71: typedef        long     swblk_t;
        !            72: typedef        long     size_t;
        !            73: typedef        long     time_t;
        !            74: typedef        short    dev_t;
        !            75: typedef        long     off_t;
        !            76: typedef         u_short         uid_t;
        !            77: typedef         u_short         gid_t;
        !            78: 
        !            79: 
        !            80: 
        !            81: 
        !            82: 
        !            83: 
        !            84: 
        !            85: 
        !            86: 
        !            87: 
        !            88: 
        !            89: 
        !            90: typedef long    fd_mask;
        !            91: 
        !            92: 
        !            93: 
        !            94: 
        !            95: 
        !            96: typedef        struct  fd_set {
        !            97:         fd_mask        fds_bits[       (((256)+(( (sizeof( fd_mask) * 8                )       )-1))/( (sizeof( fd_mask) * 8           )       ))];
        !            98: }  fd_set;
        !            99: 
        !           100: 
        !           101: 
        !           102: 
        !           103: 
        !           104: 
        !           105: 
        !           106: 
        !           107: 
        !           108: 
        !           109: 
        !           110: 
        !           111: 
        !           112: 
        !           113: 
        !           114: 
        !           115: 
        !           116: 
        !           117: 
        !           118: 
        !           119: 
        !           120: 
        !           121: 
        !           122: 
        !           123: 
        !           124: 
        !           125: 
        !           126: 
        !           127: 
        !           128: 
        !           129: 
        !           130: 
        !           131: 
        !           132: 
        !           133: 
        !           134: 
        !           135: 
        !           136: 
        !           137: 
        !           138: 
        !           139: 
        !           140: 
        !           141: 
        !           142: 
        !           143: extern struct   _iobuf {
        !           144:        int     _cnt;
        !           145: 
        !           146:        unsigned char   *_ptr;
        !           147:        unsigned char   *_base;
        !           148: 
        !           149:        int     _bufsiz;
        !           150:        short   _flag;
        !           151:        char    _file;          
        !           152: 
        !           153:        char    *_name;         
        !           154: 
        !           155: }  _iob[];
        !           156: 
        !           157: 
        !           158: 
        !           159: 
        !           160: 
        !           161: 
        !           162: 
        !           163: 
        !           164: 
        !           165: 
        !           166: 
        !           167: 
        !           168: 
        !           169: 
        !           170: 
        !           171: 
        !           172: 
        !           173: 
        !           174: 
        !           175: 
        !           176: 
        !           177: 
        !           178: 
        !           179: 
        !           180: 
        !           181: 
        !           182: 
        !           183: 
        !           184: 
        !           185: 
        !           186: 
        !           187: 
        !           188: 
        !           189: 
        !           190: 
        !           191: 
        !           192: 
        !           193: 
        !           194: struct  _iobuf * fopen();
        !           195: struct  _iobuf * fdopen();
        !           196: struct  _iobuf * freopen();
        !           197: long            ftell();
        !           198: char           * fgets();
        !           199: 
        !           200: struct  _iobuf * popen();
        !           201: char           * gets();
        !           202: 
        !           203: 
        !           204: 
        !           205: 
        !           206: 
        !           207: 
        !           208: 
        !           209: 
        !           210: 
        !           211: 
        !           212: 
        !           213: 
        !           214: 
        !           215: 
        !           216: 
        !           217: 
        !           218: 
        !           219: 
        !           220: 
        !           221: 
        !           222: 
        !           223: 
        !           224: 
        !           225: 
        !           226: 
        !           227: 
        !           228: 
        !           229: 
        !           230: 
        !           231: 
        !           232: 
        !           233: 
        !           234: 
        !           235: 
        !           236: 
        !           237: 
        !           238: 
        !           239: 
        !           240: 
        !           241: 
        !           242: 
        !           243: 
        !           244: 
        !           245: 
        !           246: 
        !           247: 
        !           248: 
        !           249: 
        !           250: 
        !           251: 
        !           252: 
        !           253: 
        !           254: 
        !           255: 
        !           256: 
        !           257: 
        !           258: 
        !           259: extern char     _ctype_[];
        !           260: 
        !           261: 
        !           262: 
        !           263: 
        !           264: 
        !           265: 
        !           266: 
        !           267: 
        !           268: 
        !           269: 
        !           270: 
        !           271: 
        !           272: 
        !           273: 
        !           274: 
        !           275: 
        !           276: 
        !           277: 
        !           278: 
        !           279: 
        !           280: 
        !           281: 
        !           282: 
        !           283: 
        !           284: 
        !           285: 
        !           286: 
        !           287: 
        !           288: 
        !           289: 
        !           290: 
        !           291: 
        !           292: 
        !           293: 
        !           294: 
        !           295: 
        !           296: 
        !           297: 
        !           298: 
        !           299: 
        !           300: 
        !           301: 
        !           302: 
        !           303: 
        !           304: 
        !           305: 
        !           306: 
        !           307: 
        !           308: 
        !           309: 
        !           310: 
        !           311: 
        !           312: 
        !           313: 
        !           314: 
        !           315: 
        !           316: 
        !           317: 
        !           318: 
        !           319: 
        !           320: 
        !           321: 
        !           322: 
        !           323: 
        !           324: 
        !           325: 
        !           326: 
        !           327: 
        !           328: 
        !           329: 
        !           330: 
        !           331: 
        !           332: 
        !           333: 
        !           334: 
        !           335: 
        !           336: 
        !           337: 
        !           338: 
        !           339: 
        !           340: 
        !           341: 
        !           342: 
        !           343: 
        !           344: 
        !           345: 
        !           346: 
        !           347: 
        !           348: 
        !           349: 
        !           350: 
        !           351: 
        !           352: 
        !           353: 
        !           354: 
        !           355: 
        !           356: 
        !           357: 
        !           358: 
        !           359: 
        !           360: 
        !           361: 
        !           362: 
        !           363: 
        !           364:        
        !           365: 
        !           366: 
        !           367: 
        !           368: 
        !           369: 
        !           370: 
        !           371: 
        !           372: 
        !           373: 
        !           374: 
        !           375: 
        !           376: 
        !           377: 
        !           378: 
        !           379: 
        !           380: 
        !           381: 
        !           382: 
        !           383: 
        !           384: 
        !           385: 
        !           386: 
        !           387: 
        !           388: 
        !           389: 
        !           390: 
        !           391: 
        !           392: 
        !           393: int    (* signal())();
        !           394: 
        !           395: 
        !           396: 
        !           397: 
        !           398: 
        !           399: struct  sigvec {
        !           400:        int     (*sv_handler)();        
        !           401:        int     sv_mask;                
        !           402:        int     sv_flags;               
        !           403: };
        !           404: 
        !           405: 
        !           406: 
        !           407: 
        !           408: 
        !           409: 
        !           410: 
        !           411: struct  sigstack {
        !           412:        char    *ss_sp;                 
        !           413:        int     ss_onstack;             
        !           414: };
        !           415: 
        !           416: 
        !           417: 
        !           418: 
        !           419: 
        !           420: 
        !           421: 
        !           422: 
        !           423: 
        !           424: 
        !           425: 
        !           426: struct  sigcontext {
        !           427:        
        !           428: 
        !           429: 
        !           430: 
        !           431:        int     sc_onstack;             
        !           432:        int     sc_mask;                
        !           433:        int     sc_pc;                  
        !           434:        
        !           435: 
        !           436: 
        !           437:        int     sc_regs[32];    
        !           438:        int     sc_mdlo;        
        !           439:        int     sc_mdhi;        
        !           440:        
        !           441: 
        !           442: 
        !           443:        int     sc_ownedfp;     
        !           444:        int     sc_fpregs[32];  
        !           445:        int     sc_fpc_csr;     
        !           446:        int     sc_fpc_eir;     
        !           447:        
        !           448: 
        !           449: 
        !           450: 
        !           451:        
        !           452: 
        !           453: 
        !           454:        int     sc_cause;       
        !           455:        int     sc_badvaddr;    
        !           456:        int     sc_badpaddr;    
        !           457: };
        !           458: 
        !           459: 
        !           460: 
        !           461: 
        !           462: 
        !           463: 
        !           464: 
        !           465: 
        !           466: 
        !           467: 
        !           468: 
        !           469: 
        !           470: 
        !           471: 
        !           472: 
        !           473: 
        !           474: 
        !           475: 
        !           476: 
        !           477: 
        !           478: 
        !           479: 
        !           480: 
        !           481: 
        !           482: 
        !           483: 
        !           484: 
        !           485: 
        !           486: 
        !           487: 
        !           488: 
        !           489: 
        !           490: 
        !           491: 
        !           492: 
        !           493: 
        !           494: 
        !           495: 
        !           496: 
        !           497: 
        !           498: 
        !           499: 
        !           500: 
        !           501: 
        !           502: 
        !           503: 
        !           504: 
        !           505: 
        !           506: 
        !           507: 
        !           508: 
        !           509: 
        !           510: 
        !           511: 
        !           512: 
        !           513: 
        !           514: 
        !           515: 
        !           516: 
        !           517: 
        !           518: 
        !           519: 
        !           520: 
        !           521: 
        !           522: 
        !           523: 
        !           524: 
        !           525: 
        !           526: 
        !           527: 
        !           528: 
        !           529: 
        !           530: 
        !           531: 
        !           532: 
        !           533: 
        !           534: 
        !           535: 
        !           536: 
        !           537: 
        !           538: 
        !           539: 
        !           540: 
        !           541: 
        !           542: 
        !           543: 
        !           544: 
        !           545: 
        !           546: 
        !           547: 
        !           548: 
        !           549: 
        !           550: 
        !           551: 
        !           552: 
        !           553: 
        !           554: 
        !           555: 
        !           556: struct  stat
        !           557: {
        !           558:         dev_t  st_dev;
        !           559:         ino_t  st_ino;
        !           560:        unsigned        short st_mode;
        !           561:        short           st_nlink;
        !           562:         uid_t  st_uid;
        !           563:         gid_t  st_gid;
        !           564:         dev_t  st_rdev;
        !           565:         off_t  st_size;
        !           566:         time_t st_atime;
        !           567:        int             st_spare1;
        !           568:         time_t st_mtime;
        !           569:        int             st_spare2;
        !           570:         time_t st_ctime;
        !           571:        int             st_spare3;
        !           572:        long            st_blksize;
        !           573:        long            st_blocks;
        !           574:        long            st_spare4[2];
        !           575: };
        !           576: 
        !           577: 
        !           578: 
        !           579: 
        !           580: 
        !           581: 
        !           582: 
        !           583: 
        !           584: 
        !           585: 
        !           586: 
        !           587: 
        !           588: 
        !           589: 
        !           590: 
        !           591: 
        !           592: 
        !           593: 
        !           594: 
        !           595: 
        !           596: 
        !           597: 
        !           598: 
        !           599: 
        !           600: 
        !           601: 
        !           602: 
        !           603: 
        !           604: 
        !           605: 
        !           606: 
        !           607: 
        !           608: 
        !           609: 
        !           610: 
        !           611: 
        !           612: 
        !           613: 
        !           614: 
        !           615: 
        !           616: 
        !           617: 
        !           618: 
        !           619: 
        !           620: 
        !           621: 
        !           622: 
        !           623: 
        !           624: 
        !           625: 
        !           626: 
        !           627: 
        !           628: 
        !           629: 
        !           630: 
        !           631: 
        !           632: 
        !           633: 
        !           634: 
        !           635: 
        !           636: 
        !           637: 
        !           638: 
        !           639: 
        !           640: 
        !           641: 
        !           642: 
        !           643: 
        !           644: 
        !           645: 
        !           646: 
        !           647: 
        !           648: 
        !           649: 
        !           650: 
        !           651: 
        !           652: 
        !           653: 
        !           654: 
        !           655: 
        !           656: 
        !           657: 
        !           658: 
        !           659: 
        !           660: 
        !           661: 
        !           662: 
        !           663: 
        !           664: 
        !           665: 
        !           666: 
        !           667: 
        !           668: 
        !           669: 
        !           670: 
        !           671: 
        !           672: 
        !           673: 
        !           674: 
        !           675: 
        !           676: 
        !           677: 
        !           678: 
        !           679: 
        !           680: 
        !           681: 
        !           682: 
        !           683: 
        !           684: 
        !           685: 
        !           686: 
        !           687: 
        !           688: 
        !           689: 
        !           690: 
        !           691: 
        !           692: 
        !           693: 
        !           694: 
        !           695: 
        !           696: 
        !           697: 
        !           698: 
        !           699: 
        !           700: 
        !           701: 
        !           702: 
        !           703: 
        !           704: 
        !           705: 
        !           706: 
        !           707: 
        !           708: 
        !           709: 
        !           710: 
        !           711: 
        !           712: 
        !           713: 
        !           714: 
        !           715: 
        !           716: 
        !           717: 
        !           718: 
        !           719: 
        !           720: 
        !           721: 
        !           722: 
        !           723: 
        !           724: 
        !           725: 
        !           726: 
        !           727: 
        !           728: 
        !           729: 
        !           730: 
        !           731: 
        !           732: 
        !           733: 
        !           734: 
        !           735: 
        !           736: 
        !           737: 
        !           738: 
        !           739: 
        !           740: 
        !           741: 
        !           742: extern char *strcat();
        !           743: extern char *strncat();
        !           744: extern char *strcpy();
        !           745: extern char *strncpy();
        !           746: extern int strlen();
        !           747: extern int strcmp();
        !           748: extern int strncmp();
        !           749: extern char *strchr();
        !           750: extern char *strrchr();
        !           751: 
        !           752: 
        !           753: typedef struct string {
        !           754:        char *base;     
        !           755:        char *end;      
        !           756:        char *ptr;      
        !           757: } string;
        !           758: 
        !           759: 
        !           760: 
        !           761: 
        !           762: 
        !           763: 
        !           764: 
        !           765: 
        !           766: 
        !           767: 
        !           768: extern string *s_new();
        !           769: extern void s_free();
        !           770: extern string *s_append();
        !           771: extern string *s_nappend();
        !           772: extern string *s_array();
        !           773: extern string *s_copy();
        !           774: extern string *s_seq_read();
        !           775: extern char *s_read_line();
        !           776: extern int s_read_to_eof();
        !           777: extern string *s_parse();
        !           778: 
        !           779: 
        !           780: 
        !           781: 
        !           782: 
        !           783: 
        !           784: 
        !           785: 
        !           786: 
        !           787: 
        !           788: 
        !           789: 
        !           790: 
        !           791: 
        !           792: 
        !           793: typedef struct namelist namelist;
        !           794: struct namelist {
        !           795:        namelist *next;
        !           796:        char *name;
        !           797: };
        !           798: 
        !           799: 
        !           800: 
        !           801: 
        !           802: 
        !           803: 
        !           804: 
        !           805: 
        !           806: 
        !           807: 
        !           808: 
        !           809: 
        !           810: 
        !           811: 
        !           812: 
        !           813: 
        !           814: 
        !           815: 
        !           816: 
        !           817: 
        !           818: 
        !           819: 
        !           820: 
        !           821: 
        !           822: 
        !           823: 
        !           824: 
        !           825: 
        !           826: 
        !           827: 
        !           828: 
        !           829: 
        !           830: 
        !           831: 
        !           832: 
        !           833: 
        !           834: 
        !           835: 
        !           836: 
        !           837: 
        !           838: 
        !           839: 
        !           840: 
        !           841: 
        !           842: 
        !           843: 
        !           844: 
        !           845: 
        !           846: 
        !           847: 
        !           848: 
        !           849: 
        !           850: 
        !           851: 
        !           852: 
        !           853: 
        !           854: 
        !           855: 
        !           856: 
        !           857: 
        !           858: 
        !           859: 
        !           860: 
        !           861: 
        !           862: 
        !           863: 
        !           864: 
        !           865: 
        !           866: 
        !           867: 
        !           868: 
        !           869: 
        !           870: 
        !           871: 
        !           872: 
        !           873: 
        !           874: 
        !           875: 
        !           876: 
        !           877: 
        !           878: 
        !           879: 
        !           880: 
        !           881: 
        !           882: 
        !           883: 
        !           884: 
        !           885: 
        !           886: 
        !           887: 
        !           888: 
        !           889: 
        !           890: 
        !           891: 
        !           892: 
        !           893: 
        !           894: 
        !           895: 
        !           896: 
        !           897: 
        !           898: 
        !           899: 
        !           900: 
        !           901: 
        !           902: 
        !           903: 
        !           904: 
        !           905: 
        !           906: 
        !           907: 
        !           908: 
        !           909: 
        !           910: 
        !           911: 
        !           912: 
        !           913: 
        !           914: 
        !           915: 
        !           916: 
        !           917: 
        !           918: 
        !           919: 
        !           920: 
        !           921: 
        !           922: 
        !           923: 
        !           924: 
        !           925: 
        !           926: 
        !           927: 
        !           928: 
        !           929: 
        !           930: 
        !           931: 
        !           932: 
        !           933: 
        !           934: 
        !           935: 
        !           936: 
        !           937: 
        !           938: 
        !           939: 
        !           940: 
        !           941: 
        !           942: 
        !           943: 
        !           944: 
        !           945: 
        !           946: 
        !           947: 
        !           948: 
        !           949: 
        !           950: 
        !           951: 
        !           952: 
        !           953: 
        !           954: 
        !           955: 
        !           956: 
        !           957: 
        !           958: 
        !           959: 
        !           960: 
        !           961: 
        !           962: 
        !           963: 
        !           964: 
        !           965: 
        !           966: 
        !           967: 
        !           968: 
        !           969: 
        !           970: 
        !           971: 
        !           972: 
        !           973: 
        !           974: 
        !           975: 
        !           976: 
        !           977: 
        !           978: 
        !           979: 
        !           980: 
        !           981: 
        !           982: 
        !           983: 
        !           984: 
        !           985: 
        !           986: 
        !           987: 
        !           988: 
        !           989: 
        !           990: 
        !           991: 
        !           992: 
        !           993: 
        !           994: 
        !           995: 
        !           996: 
        !           997: 
        !           998: 
        !           999: 
        !          1000: 
        !          1001: 
        !          1002: 
        !          1003: 
        !          1004: 
        !          1005: 
        !          1006: 
        !          1007: 
        !          1008: 
        !          1009: 
        !          1010: 
        !          1011: 
        !          1012: 
        !          1013: 
        !          1014: 
        !          1015: 
        !          1016: 
        !          1017: 
        !          1018: 
        !          1019: 
        !          1020: 
        !          1021: 
        !          1022: 
        !          1023: 
        !          1024: 
        !          1025: 
        !          1026: 
        !          1027: 
        !          1028: 
        !          1029: 
        !          1030: 
        !          1031: 
        !          1032: 
        !          1033: 
        !          1034: 
        !          1035: 
        !          1036: 
        !          1037: 
        !          1038: 
        !          1039: 
        !          1040: 
        !          1041: 
        !          1042: 
        !          1043: 
        !          1044: 
        !          1045: 
        !          1046: 
        !          1047: 
        !          1048: 
        !          1049: 
        !          1050: 
        !          1051: 
        !          1052: 
        !          1053: 
        !          1054: 
        !          1055: 
        !          1056: 
        !          1057: 
        !          1058: 
        !          1059: 
        !          1060: 
        !          1061: 
        !          1062: 
        !          1063: 
        !          1064: 
        !          1065: 
        !          1066: 
        !          1067: 
        !          1068: 
        !          1069: 
        !          1070: 
        !          1071: 
        !          1072: 
        !          1073: 
        !          1074: 
        !          1075: 
        !          1076: 
        !          1077: 
        !          1078: 
        !          1079: 
        !          1080: 
        !          1081: 
        !          1082: 
        !          1083: 
        !          1084: 
        !          1085: 
        !          1086: 
        !          1087: 
        !          1088: 
        !          1089: 
        !          1090: 
        !          1091: 
        !          1092: 
        !          1093: 
        !          1094: 
        !          1095: 
        !          1096: 
        !          1097: 
        !          1098: 
        !          1099: 
        !          1100: 
        !          1101: 
        !          1102: 
        !          1103: 
        !          1104: 
        !          1105: 
        !          1106: 
        !          1107: 
        !          1108: 
        !          1109: 
        !          1110: 
        !          1111: 
        !          1112: 
        !          1113: 
        !          1114: 
        !          1115: 
        !          1116: 
        !          1117: 
        !          1118: 
        !          1119: 
        !          1120: 
        !          1121: 
        !          1122: 
        !          1123: 
        !          1124: 
        !          1125: 
        !          1126: 
        !          1127: 
        !          1128: 
        !          1129: 
        !          1130: 
        !          1131: 
        !          1132: 
        !          1133: 
        !          1134: 
        !          1135: 
        !          1136: 
        !          1137: 
        !          1138: 
        !          1139: 
        !          1140: 
        !          1141: 
        !          1142: 
        !          1143: 
        !          1144: 
        !          1145: 
        !          1146: 
        !          1147: 
        !          1148: 
        !          1149: 
        !          1150: 
        !          1151: 
        !          1152: 
        !          1153: 
        !          1154: 
        !          1155: 
        !          1156: 
        !          1157: 
        !          1158: 
        !          1159: 
        !          1160: 
        !          1161: 
        !          1162: 
        !          1163: 
        !          1164: 
        !          1165: 
        !          1166: 
        !          1167: 
        !          1168: 
        !          1169: 
        !          1170: 
        !          1171: 
        !          1172: 
        !          1173: 
        !          1174: 
        !          1175: 
        !          1176: 
        !          1177: 
        !          1178: 
        !          1179: 
        !          1180: 
        !          1181: 
        !          1182: 
        !          1183: 
        !          1184: 
        !          1185: 
        !          1186: 
        !          1187: 
        !          1188: 
        !          1189: 
        !          1190: 
        !          1191: 
        !          1192: 
        !          1193: 
        !          1194: 
        !          1195: 
        !          1196: 
        !          1197: 
        !          1198: 
        !          1199: 
        !          1200: 
        !          1201: 
        !          1202: 
        !          1203: 
        !          1204: 
        !          1205: 
        !          1206: 
        !          1207: 
        !          1208: 
        !          1209: 
        !          1210: 
        !          1211: 
        !          1212: 
        !          1213: 
        !          1214: 
        !          1215: 
        !          1216: 
        !          1217: 
        !          1218: 
        !          1219: 
        !          1220: 
        !          1221: 
        !          1222: 
        !          1223: 
        !          1224: 
        !          1225: 
        !          1226: 
        !          1227: 
        !          1228: 
        !          1229: 
        !          1230: 
        !          1231: 
        !          1232: 
        !          1233: 
        !          1234: 
        !          1235: 
        !          1236: 
        !          1237: 
        !          1238: 
        !          1239: 
        !          1240: 
        !          1241: 
        !          1242: 
        !          1243: 
        !          1244: 
        !          1245: 
        !          1246: 
        !          1247: 
        !          1248: 
        !          1249: 
        !          1250: 
        !          1251: 
        !          1252: 
        !          1253: 
        !          1254: 
        !          1255: 
        !          1256: 
        !          1257: 
        !          1258: 
        !          1259: 
        !          1260: 
        !          1261: 
        !          1262: 
        !          1263: 
        !          1264: 
        !          1265: 
        !          1266: 
        !          1267: 
        !          1268: 
        !          1269: 
        !          1270: 
        !          1271: 
        !          1272: 
        !          1273: 
        !          1274: 
        !          1275: 
        !          1276: 
        !          1277: 
        !          1278: 
        !          1279: 
        !          1280: 
        !          1281: 
        !          1282: 
        !          1283: 
        !          1284: 
        !          1285: 
        !          1286: 
        !          1287: 
        !          1288: 
        !          1289: 
        !          1290: 
        !          1291: 
        !          1292: 
        !          1293: 
        !          1294: 
        !          1295: 
        !          1296: 
        !          1297: 
        !          1298: 
        !          1299: 
        !          1300: 
        !          1301: 
        !          1302: 
        !          1303: 
        !          1304: 
        !          1305: 
        !          1306: 
        !          1307: 
        !          1308: 
        !          1309: 
        !          1310: 
        !          1311: 
        !          1312: struct  direct {
        !          1313:         u_long d_fileno;               
        !          1314:         u_short        d_reclen;               
        !          1315:         u_short        d_namlen;               
        !          1316:        char    d_name[255 + 1];        
        !          1317: };
        !          1318: 
        !          1319: 
        !          1320: 
        !          1321: 
        !          1322: 
        !          1323: 
        !          1324: 
        !          1325: 
        !          1326: 
        !          1327: 
        !          1328: 
        !          1329: 
        !          1330: 
        !          1331: 
        !          1332: 
        !          1333: 
        !          1334: 
        !          1335: typedef struct  _dirdesc {
        !          1336:        int     dd_fd;
        !          1337:        long    dd_loc;
        !          1338:        long    dd_size;
        !          1339:        long    dd_bbase;
        !          1340:        long    dd_entno;
        !          1341:        long    dd_bsize;
        !          1342:        char    *dd_buf;
        !          1343: }  DIR;
        !          1344: 
        !          1345: 
        !          1346: extern  DIR * opendir();
        !          1347: extern struct  direct * readdir();
        !          1348: extern long  telldir();
        !          1349: extern void  seekdir();
        !          1350: 
        !          1351: extern void  closedir();
        !          1352: 
        !          1353: 
        !          1354: 
        !          1355: 
        !          1356: 
        !          1357: 
        !          1358: 
        !          1359: 
        !          1360: 
        !          1361: 
        !          1362: 
        !          1363: 
        !          1364: 
        !          1365: 
        !          1366: 
        !          1367: 
        !          1368: 
        !          1369: 
        !          1370: 
        !          1371: 
        !          1372: 
        !          1373: 
        !          1374: 
        !          1375: 
        !          1376: 
        !          1377: 
        !          1378: 
        !          1379: 
        !          1380: 
        !          1381: typedef int (*SIG_TYP)();
        !          1382: 
        !          1383: 
        !          1384: 
        !          1385: 
        !          1386: 
        !          1387: 
        !          1388: 
        !          1389: 
        !          1390: 
        !          1391: 
        !          1392: 
        !          1393: 
        !          1394: 
        !          1395: 
        !          1396: 
        !          1397: extern char *UPASROOT;
        !          1398: int warn = -1;
        !          1399: int remove = -1;
        !          1400: int cleanup;
        !          1401: int verbose;
        !          1402: int testmode;
        !          1403: int Xonly;
        !          1404: int Conly;
        !          1405: string *replyaddr;
        !          1406: string *dest;
        !          1407: int mypid;
        !          1408: char **getcmd();
        !          1409: 
        !          1410: 
        !          1411: 
        !          1412: struct {
        !          1413:        string  *dest;
        !          1414:        time_t  time;
        !          1415: } destlist[50          ];              
        !          1416: int    ndest = 0;
        !          1417: 
        !          1418: int    debug;
        !          1419: 
        !          1420: 
        !          1421: 
        !          1422: 
        !          1423: 
        !          1424: 
        !          1425: 
        !          1426: 
        !          1427: 
        !          1428: 
        !          1429: 
        !          1430: 
        !          1431: 
        !          1432: 
        !          1433: 
        !          1434: 
        !          1435: 
        !          1436: 
        !          1437: 
        !          1438: 
        !          1439: 
        !          1440: usage()
        !          1441: {
        !          1442:        fprintf((& _iob[2]), "smtpsched [-cvt] [-w #days] [-r #days] [-s #scheds] [dir]\n");
        !          1443:        exit(1);
        !          1444: }
        !          1445: 
        !          1446: main(ac, av)
        !          1447:        int ac;
        !          1448:        char *av[];
        !          1449: {
        !          1450:        direct *dirp;
        !          1451:        direct d;
        !          1452:        direct *dp;
        !          1453:        int max=0;
        !          1454:        int c;
        !          1455:        extern int optind;
        !          1456:        extern char *optarg;
        !          1457: 
        !          1458:        mypid = getpid();
        !          1459: 
        !          1460:        
        !          1461: 
        !          1462: 
        !          1463:        signal(13       , (int (*)())1);
        !          1464:        signal(1        , (int (*)())1);
        !          1465: 
        !          1466:        while ((c = getopt(ac, av, "XCcvtr:w:s:d")) != (-1))
        !          1467:                switch (c) {
        !          1468:                case 'X':
        !          1469:                        Xonly = 1;
        !          1470:                        break;
        !          1471:                case 'C':
        !          1472:                        Conly = 1;
        !          1473:                        break;
        !          1474:                case 't':
        !          1475:                        testmode = 1;
        !          1476:                        break;
        !          1477:                case 'v':
        !          1478:                        verbose = 1;
        !          1479:                        break;
        !          1480:                case 'c':
        !          1481:                        cleanup = 1;
        !          1482:                        break;
        !          1483:                case 'r':
        !          1484:                        remove = atoi(optarg);
        !          1485:                        break;
        !          1486:                case 's':
        !          1487:                        max = atoi(optarg);
        !          1488:                        break;
        !          1489:                case 'w':
        !          1490:                        warn = atoi(optarg);
        !          1491:                        break;
        !          1492:                case 'd':
        !          1493:                        debug = 1;
        !          1494:                        break;
        !          1495:                default:
        !          1496:                        usage();
        !          1497:                }
        !          1498:        openlog();
        !          1499: 
        !          1500:        
        !          1501: 
        !          1502: 
        !          1503:        if(chdir("/usr/spool/smtpq")<0){
        !          1504:                log("can't chdir to %s\n", "/usr/spool/smtpq");
        !          1505:                exit(1);
        !          1506:        }
        !          1507: 
        !          1508:        
        !          1509: 
        !          1510: 
        !          1511:        if(max && toomany(max)<0)
        !          1512:                exit(0);
        !          1513: 
        !          1514:        
        !          1515: 
        !          1516: 
        !          1517: 
        !          1518:        if(optind!=ac){
        !          1519:                for(; optind<ac; optind++)
        !          1520:                        while(dodir(av[optind], 1               ) && !warn && !remove)
        !          1521:                                ;
        !          1522:                return 0;
        !          1523:        }
        !          1524: 
        !          1525:        
        !          1526: 
        !          1527: 
        !          1528: 
        !          1529: 
        !          1530: 
        !          1531:        dirp = opendir(".");
        !          1532:        if(dirp<0){
        !          1533:                log("couldn't read %s\n", "/usr/spool/smtpq");
        !          1534:                exit(1);
        !          1535:        }
        !          1536:        while(dp = readdir(dirp)){
        !          1537:                d = *dp;        
        !          1538:                if(strcmp(d.d_name, ".")!=0 && strcmp(d.d_name, "..")!=0)
        !          1539:                        dodir(d.d_name, (warn>=0 || remove>=0) ? 2       : 1            );
        !          1540:        }
        !          1541:        closedir(dirp);
        !          1542:        return 0;
        !          1543: }
        !          1544: 
        !          1545: 
        !          1546: 
        !          1547: 
        !          1548: dodir(dname, action)
        !          1549:        char *dname;
        !          1550: {
        !          1551:        int i;
        !          1552: 
        !          1553:        i = dodirdir(dname, action, "X.");
        !          1554:        i += dodirdir(dname, action, "C.");
        !          1555:        return i;
        !          1556: }
        !          1557: 
        !          1558: 
        !          1559: 
        !          1560: 
        !          1561: 
        !          1562: dodirdir(dname, action, direction)
        !          1563:        char *dname;
        !          1564:        char *direction;
        !          1565: {
        !          1566:        DIR *dirp;
        !          1567:        direct *dp;
        !          1568:        int i;
        !          1569:        int changed=0;
        !          1570:        int ents=0;
        !          1571:        static string *ds;
        !          1572:        static string *ls;
        !          1573:        extern int errno;
        !          1574: 
        !          1575:        ds =  (ds ? (*(ds->ptr = ds->base) = '\0' , ds) : s_new());
        !          1576:        s_append(ds, dname);
        !          1577:        ls =  (ls ? (*(ls->ptr = ls->base) = '\0' , ls) : s_new());
        !          1578:        s_append(ls, direction);
        !          1579:        s_append(ls, dname);
        !          1580: 
        !          1581:        
        !          1582: 
        !          1583: 
        !          1584:        switch(action){
        !          1585:        case 0          :
        !          1586:                for(i=0; i<3; i++){
        !          1587:                        if(lock( ls->base)==0)
        !          1588:                                break;
        !          1589:                        sleep(5);
        !          1590:                }
        !          1591:                if(i==3)
        !          1592:                        return changed;
        !          1593:                break;
        !          1594:        case 1          :
        !          1595:                if(lock( ls->base)<0){
        !          1596:                        log("couldn't lock %s\n", dname);
        !          1597:                        return changed;
        !          1598:                }
        !          1599:                break;
        !          1600:        case 2  :
        !          1601:                break;
        !          1602:        }
        !          1603: 
        !          1604:        
        !          1605: 
        !          1606: 
        !          1607: 
        !          1608:        if(chdir( ds->base)<0){
        !          1609:                if(action != 2  )
        !          1610:                        unlock( ls->base);
        !          1611:                return changed;
        !          1612:        }
        !          1613: 
        !          1614:        
        !          1615: 
        !          1616: 
        !          1617:        dirp = opendir(".");
        !          1618:        if(dirp<0){
        !          1619:                log("couldn't read directory %s\n", dname);
        !          1620:                if(chdir("..")<0){
        !          1621:                        log("can't chdir ..\n");
        !          1622:                        fflush((& _iob[1]));
        !          1623:                        exit(1);
        !          1624:                }
        !          1625:                if(action != 2  )
        !          1626:                        unlock( ls->base);
        !          1627:                return changed;
        !          1628:        }
        !          1629:        while(dp = readdir(dirp)){
        !          1630:                if(strcmp(dp->d_name, ".")!=0 && strcmp(dp->d_name, "..")!=0
        !          1631:                && dp->d_name[0] == *direction) {
        !          1632:                        switch(dofile(dname, dp->d_name)){
        !          1633:                        case 0:
        !          1634:                                
        !          1635:                                changed = 1;
        !          1636:                                break;
        !          1637:                        case 1:
        !          1638:                                
        !          1639:                                ents += 1;
        !          1640:                                break;
        !          1641:                        }
        !          1642:                }
        !          1643:        }
        !          1644:        closedir(dirp);
        !          1645: 
        !          1646:        
        !          1647: 
        !          1648: 
        !          1649:        if(chdir("..")<0){
        !          1650:                log("can't chdir ..\n");
        !          1651:                fflush((& _iob[1]));
        !          1652:                exit(1);
        !          1653:        }
        !          1654: 
        !          1655:        
        !          1656: 
        !          1657: 
        !          1658:        if(cleanup && ents==0){
        !          1659:                log("%s empty\n",  ds->base);
        !          1660:                if(rmdir( ds->base)<0)
        !          1661:                        log("can't unlink: %d\n", errno);
        !          1662:        }
        !          1663: 
        !          1664:        if(action != 2  )
        !          1665:                unlock( ls->base);
        !          1666:        return changed;
        !          1667: }
        !          1668: 
        !          1669: 
        !          1670: 
        !          1671: 
        !          1672: 
        !          1673: 
        !          1674: 
        !          1675: dofile(dname, name)
        !          1676:        char *dname;
        !          1677:        char *name;
        !          1678: {
        !          1679:        int rv;
        !          1680:        int fd, ofd;
        !          1681:        char *ef;
        !          1682:        extern char *fileoftype();
        !          1683:        struct stat sb;
        !          1684:        time_t now, Edate, Cdate;
        !          1685: 
        !          1686:        rv = -1;
        !          1687: 
        !          1688:        
        !          1689: 
        !          1690: 
        !          1691:        if(cleanup && inconsistent(name)){
        !          1692:                log("%s/%s inconsistent\n", dname, name);
        !          1693:                unlink(name);
        !          1694:                return 0;
        !          1695:        }
        !          1696: 
        !          1697:        
        !          1698: 
        !          1699: 
        !          1700:        if(name[1]!='.' || (name[0]!='C' && name[0]!='X'))
        !          1701:                return 1;
        !          1702: 
        !          1703:        
        !          1704: 
        !          1705: 
        !          1706: 
        !          1707:        if(warn>=0 || remove>=0) {
        !          1708:                if(checkage(name)==0) {
        !          1709:                        log("%s/%s too old\n", dname, name);
        !          1710:                        doremove(name);
        !          1711:                        return 0;
        !          1712:                }
        !          1713:                return 1;
        !          1714:        }
        !          1715: 
        !          1716:        
        !          1717: 
        !          1718: 
        !          1719:        if(cleanup)
        !          1720:                return 1;
        !          1721: 
        !          1722:        
        !          1723: 
        !          1724: 
        !          1725:        ef = fileoftype('E', name);
        !          1726:        if (name[0]=='C') {
        !          1727:                now = time((time_t *)0);
        !          1728:                Cdate = now;
        !          1729:                Edate = now-4*3600L             -1;
        !          1730:                if (stat(name, &sb)==0)
        !          1731:                        Cdate = sb.st_ctime;
        !          1732:                if (stat(ef, &sb)==0)
        !          1733:                        Edate = sb.st_mtime;
        !          1734:                if (now-Cdate>6*3600L            && now-Edate<4*3600L           
        !          1735:                 || now-Cdate>1*3600L             && now-Edate<1*3600L          ) {
        !          1736:                        if (verbose)
        !          1737:                                log("ignore %s/%s: not time yet\n", dname, name);
        !          1738:                        if (debug==0)
        !          1739:                                return 1;
        !          1740:                }
        !          1741:        }
        !          1742: 
        !          1743:        
        !          1744: 
        !          1745: 
        !          1746:        if (testmode) {
        !          1747:                log("would process %s/%s\n", dname, name);
        !          1748:                return 1;
        !          1749:        }
        !          1750:        
        !          1751: 
        !          1752: 
        !          1753:        ofd = dup(2);
        !          1754:        close(2);
        !          1755:        fd = open(ef, 1);
        !          1756:        if(fd<0)
        !          1757:                fd = creat(ef, 0666);
        !          1758:        if(fd>=0){
        !          1759:                lseek(fd, 0l, 2);
        !          1760:        
        !          1761:                
        !          1762: 
        !          1763: 
        !          1764:                if(name[0]=='C') {
        !          1765:                        rv = dosmtp(dname, name);
        !          1766:                } else if(name[0]=='X') {
        !          1767:                        rv = dormail(dname, name);
        !          1768:                }
        !          1769: 
        !          1770:                
        !          1771: 
        !          1772: 
        !          1773:                close(2);
        !          1774:                (void) dup(ofd);
        !          1775:                close(ofd);
        !          1776:        }
        !          1777: 
        !          1778:        
        !          1779: 
        !          1780: 
        !          1781:        if(rv==0) {
        !          1782:                doremove(name);
        !          1783:                return 0;
        !          1784:        }
        !          1785:        return 1;
        !          1786: }
        !          1787: 
        !          1788: 
        !          1789: 
        !          1790: 
        !          1791: doremove(ctl)
        !          1792:        char *ctl;
        !          1793: {
        !          1794:        fflush((& _iob[1]));
        !          1795:        unlink(fileoftype('E', ctl));
        !          1796:        unlink(ctl);
        !          1797:        unlink(fileoftype('D', ctl));
        !          1798: }
        !          1799: 
        !          1800: 
        !          1801: 
        !          1802: 
        !          1803: 
        !          1804: dormail(dname, ctl)
        !          1805:        char *dname;
        !          1806:        char *ctl;
        !          1807: {
        !          1808:        char **av;
        !          1809: 
        !          1810:        log("dormail %s/%s\n", dname, ctl);
        !          1811: 
        !          1812:        
        !          1813: 
        !          1814: 
        !          1815:        av = getcmd(ctl, "/bin/rmail");
        !          1816:        if(av && docmd(ctl, av)==0){
        !          1817:                log("success\n");
        !          1818:                return 0;
        !          1819:        } else {
        !          1820:                log("failure\n");
        !          1821:                return -1;
        !          1822:        }
        !          1823: }
        !          1824: 
        !          1825: 
        !          1826: 
        !          1827: 
        !          1828: 
        !          1829: dosmtp(dname, ctl)
        !          1830:        char *dname;
        !          1831:        char *ctl;
        !          1832: {
        !          1833:        static string *cmd;
        !          1834:        int status, i;
        !          1835:        char **av;
        !          1836:        time_t t0, t1;
        !          1837: 
        !          1838:        log("dosmtp %s/%s\n", dname, ctl);
        !          1839: 
        !          1840:        
        !          1841: 
        !          1842: 
        !          1843:        cmd =  (cmd ? (*(cmd->ptr = cmd->base) = '\0' , cmd) : s_new());
        !          1844:        s_append(cmd, UPASROOT);
        !          1845:        s_append(cmd, "/smtp");
        !          1846:        av = getcmd(ctl,  cmd->base);
        !          1847:        if (av==0) {
        !          1848:                log("cmdfail\n", 0);
        !          1849:                return -1;
        !          1850:        }
        !          1851:        
        !          1852: 
        !          1853: 
        !          1854: 
        !          1855:        for (i=0; i<ndest; i++) {
        !          1856:                if (strcmp( dest->base,  destlist[i].dest->base)==0) {
        !          1857:                        if (destlist[i].time > 5*60             ) {
        !          1858:                                log("passed %s (%d sec)\n",  dest->base, destlist[i].time);
        !          1859:                                fprintf((& _iob[2]), "can't contact destination\n");
        !          1860:                                return -1;
        !          1861:                        }
        !          1862:                        break;
        !          1863:                }
        !          1864:        }
        !          1865:        if (i==ndest) {
        !          1866:                if (ndest<50            )
        !          1867:                        ndest++;
        !          1868:                else
        !          1869:                        i = 0;          
        !          1870:                destlist[i].dest = s_copy( dest->base);
        !          1871:                destlist[i].time = 0;
        !          1872:        }
        !          1873:        if (debug)
        !          1874:                log("time %d for %s\n", destlist[i].time,  dest->base);
        !          1875:        time(&t0);
        !          1876:        switch(status=docmd(ctl, av)){
        !          1877:        case 0:         
        !          1878:                log("success\n");
        !          1879:                destlist[i].time = 0;
        !          1880:                return 0;
        !          1881: 
        !          1882:        case 69 :       
        !          1883:        case    77      :               
        !          1884:        case    67      :               
        !          1885:        case    68      :               
        !          1886:                log("fail %d\n", status);
        !          1887:                returnmail(ctl, 1);             
        !          1888:                destlist[i].time = 0;
        !          1889:                return 0;
        !          1890: 
        !          1891:        case 73 :       
        !          1892:        case    74      :               
        !          1893:        case    71      :               
        !          1894:        case    72      :               
        !          1895:        case 70 :       
        !          1896:        case    64      :               
        !          1897:        case    65      :       
        !          1898:        case    66      :       
        !          1899:        case 76 :       
        !          1900:        case 75 :       
        !          1901:                log("fail %d\n", status);
        !          1902:                time(&t1);                      
        !          1903:                destlist[i].time += t1-t0;
        !          1904:                return -1;
        !          1905: 
        !          1906:        default:        
        !          1907:                log("fail %d\n", status);
        !          1908:                time(&t1);
        !          1909:                destlist[i].time += t1-t0;
        !          1910:                return -1;
        !          1911:        }
        !          1912: }
        !          1913: 
        !          1914: 
        !          1915: 
        !          1916: 
        !          1917: 
        !          1918: 
        !          1919: 
        !          1920: struct  _iobuf *
        !          1921: parseline1(ctl)
        !          1922:        char *ctl;
        !          1923: {
        !          1924:        struct  _iobuf *fp;
        !          1925:        static string *line;
        !          1926: 
        !          1927:        fp = fopen(ctl, "r");
        !          1928:        if(fp==0)
        !          1929:                return 0;
        !          1930: 
        !          1931:        
        !          1932: 
        !          1933: 
        !          1934:        line =  (line ? (*(line->ptr = line->base) = '\0' , line) : s_new());
        !          1935:        if(s_read_line(fp, line)==0){
        !          1936:                fprintf((& _iob[2]), "smtpsched: error reading ctl file %s\n", ctl);
        !          1937:                fclose(fp);
        !          1938:                return 0;
        !          1939:        }
        !          1940:        replyaddr = s_parse( (line->ptr = line->base , line),  (replyaddr ? (*(replyaddr->ptr = replyaddr->base) = '\0' , replyaddr) : s_new()));
        !          1941:        dest = s_parse(line,  (dest ? (*(dest->ptr = dest->base) = '\0' , dest) : s_new()));
        !          1942:        return fp;
        !          1943: }
        !          1944: 
        !          1945: 
        !          1946: 
        !          1947: 
        !          1948: 
        !          1949: 
        !          1950: 
        !          1951: 
        !          1952: char **
        !          1953: getcmd(ctl, cmd)
        !          1954:        char *cmd;
        !          1955: {
        !          1956:        static string *args;
        !          1957:        struct  _iobuf *fp;
        !          1958:        static char *av[1024];
        !          1959:        int ac=0;
        !          1960:        char *cp;
        !          1961: 
        !          1962:        fp = parseline1(ctl);
        !          1963:        if (fp==0)
        !          1964:                return 0;
        !          1965: 
        !          1966:        
        !          1967: 
        !          1968: 
        !          1969:        av[ac++] = cmd;
        !          1970:        args =  (args ? (*(args->ptr = args->base) = '\0' , args) : s_new());
        !          1971:        if(s_read_line(fp, args)==0){
        !          1972:                fprintf((& _iob[2]), "smtpsched: error reading ctl file %s\n", ctl);
        !          1973:                fclose(fp);
        !          1974:                return 0;
        !          1975:        }
        !          1976:        fclose(fp);
        !          1977:        for(cp =  args->base; *cp && ac<1023;){
        !          1978:                av[ac++] = cp++;
        !          1979:                while(*cp && !  (( _ctype_+1)[*cp]&010))
        !          1980:                        cp++;
        !          1981:                while(  (( _ctype_+1)[*cp]&010))
        !          1982:                        *cp++ = 0;
        !          1983:        }
        !          1984:        av[ac] = 0;
        !          1985:        return av;
        !          1986: }
        !          1987: 
        !          1988: 
        !          1989: 
        !          1990: 
        !          1991: docmd(ctl, av)
        !          1992:        char *ctl;
        !          1993:        char **av;
        !          1994: {
        !          1995:        int fd;
        !          1996:        int pid, status;
        !          1997:        int n;
        !          1998: 
        !          1999:        
        !          2000: 
        !          2001: 
        !          2002:        switch(pid = fork()){
        !          2003:        case -1:
        !          2004:                return 1;
        !          2005:        case 0:
        !          2006:                
        !          2007: 
        !          2008: 
        !          2009:                close(0);
        !          2010:                fd = open(fileoftype('D', ctl), 0);
        !          2011:                if(fd<0){
        !          2012:                        perror("smtpsched: error reading data file:\n");
        !          2013:                        exit(1);
        !          2014:                }
        !          2015:        
        !          2016:                
        !          2017: 
        !          2018: 
        !          2019:                close(1);
        !          2020:                fd = dup(2);
        !          2021:        
        !          2022:                
        !          2023: 
        !          2024: 
        !          2025:                execvp(av[0], av);
        !          2026:                exit(1);
        !          2027:        default:
        !          2028:                
        !          2029: 
        !          2030: 
        !          2031:                while((n = wait(&status))>=0)
        !          2032:                        if(n == pid)
        !          2033:                                break;
        !          2034:                if(status&0xff)
        !          2035:                        return -1;
        !          2036:                else
        !          2037:                        return (status>>8)&0xff;
        !          2038:        }
        !          2039: 
        !          2040: }
        !          2041: 
        !          2042: 
        !          2043: 
        !          2044: 
        !          2045: 
        !          2046: 
        !          2047: 
        !          2048: toomany(max)
        !          2049:        int max;
        !          2050: {
        !          2051:        struct  _iobuf *ifp=0;
        !          2052:        struct  _iobuf *ofp=0;
        !          2053:        int cur=0;
        !          2054:        int pid;
        !          2055: 
        !          2056:        
        !          2057: 
        !          2058: 
        !          2059:        if(lock(".smtpscheds")<0)
        !          2060:                return -1;
        !          2061: 
        !          2062:        
        !          2063: 
        !          2064: 
        !          2065:        ofp = fopen(".nsmtpscheds", "w");
        !          2066:        if(ofp==0){
        !          2067:                fprintf((& _iob[2]), "can't open %s\n", ".nsmtpscheds");
        !          2068:                goto error;
        !          2069:        }
        !          2070:        ifp = fopen(".smtpscheds", "r");
        !          2071:        if(ifp!=0){
        !          2072:                
        !          2073: 
        !          2074: 
        !          2075:                while(fscanf(ifp, "%d", &pid)==1){
        !          2076:                        if(kill(pid, 0) == 0){
        !          2077:                                cur++;
        !          2078:                                if(fprintf(ofp, "%d\n", pid)<0){
        !          2079:                                        fprintf((& _iob[2]), "error writing %s\n", ".nsmtpscheds");
        !          2080:                                        goto error;
        !          2081:                                }
        !          2082:                        }
        !          2083:                }
        !          2084:                if(cur >= max)
        !          2085:                        goto error;
        !          2086:        }
        !          2087: 
        !          2088:        
        !          2089: 
        !          2090: 
        !          2091:        if(fprintf(ofp, "%d\n", getpid())<0){
        !          2092:                fprintf((& _iob[2]), "error writing %s\n", ".nsmtpscheds");
        !          2093:                goto error;
        !          2094:        }
        !          2095:        if(ifp!=0)
        !          2096:                fclose(ifp);
        !          2097:        if(fclose(ofp)==(-1))
        !          2098:                goto error;
        !          2099:        unlink(".smtpscheds");
        !          2100:        if(link(".nsmtpscheds", ".smtpscheds")<0)
        !          2101:                fprintf((& _iob[2]), "can't link %s to %s file\n", ".smtpscheds", ".nsmtpscheds");
        !          2102:        unlink(".nsmtpscheds");
        !          2103:        unlock(".smtpscheds");
        !          2104:        return 0;
        !          2105: error:
        !          2106:        
        !          2107: 
        !          2108: 
        !          2109:        if(ifp!=0)
        !          2110:                fclose(ifp);
        !          2111:        if(ofp!=0)
        !          2112:                fclose(ofp);
        !          2113:        unlink(".nsmtpscheds");
        !          2114:        unlock(".smtpscheds");
        !          2115:        return -1;
        !          2116: }
        !          2117: 
        !          2118: 
        !          2119: 
        !          2120: 
        !          2121: 
        !          2122: 
        !          2123: 
        !          2124: 
        !          2125: inconsistent(file)
        !          2126:        char *file;
        !          2127: {
        !          2128:        struct stat s;
        !          2129:        int days;
        !          2130: 
        !          2131:        
        !          2132: 
        !          2133: 
        !          2134:        switch(file[0]){
        !          2135:        case 'C':
        !          2136:        case 'X':
        !          2137:                
        !          2138: 
        !          2139: 
        !          2140:                if(stat(fileoftype('D', file), &s)<0)
        !          2141:                        return 1;
        !          2142:                break;
        !          2143:        case 'E':
        !          2144:                
        !          2145: 
        !          2146: 
        !          2147:                if(stat(fileoftype('X', file), &s)<0
        !          2148:                && stat(fileoftype('C', file), &s)<0)
        !          2149:                        return 1;
        !          2150: 
        !          2151:                
        !          2152: 
        !          2153: 
        !          2154:                if(stat(fileoftype('D', file), &s)<0)
        !          2155:                        return 1;
        !          2156:                break;
        !          2157:        case 'D':
        !          2158:                
        !          2159: 
        !          2160: 
        !          2161:                if(stat(fileoftype('X', file), &s)==0
        !          2162:                || stat(fileoftype('C', file), &s)==0)
        !          2163:                        break;
        !          2164: 
        !          2165:                
        !          2166: 
        !          2167: 
        !          2168:                if(stat(file, &s)<0)
        !          2169:                        return 0;
        !          2170:                days = (time((long *)0) - s.st_ctime)/(24*60*60);
        !          2171:                if(days>0)
        !          2172:                        return 1;
        !          2173:                break;
        !          2174:        default:
        !          2175:                break;
        !          2176:        }
        !          2177:        return 0;
        !          2178: }
        !          2179: 
        !          2180: 
        !          2181: 
        !          2182: 
        !          2183: 
        !          2184: checkage(ctl)
        !          2185:        char *ctl;
        !          2186: {
        !          2187:        struct stat s;
        !          2188:        int days;
        !          2189:        char buf[256];
        !          2190:        struct  _iobuf *fp;
        !          2191: 
        !          2192:        
        !          2193: 
        !          2194: 
        !          2195:        if(stat(ctl, &s)<0)
        !          2196:                return -1;
        !          2197:        days = (time((long *)0) - s.st_ctime)/(24*60*60);
        !          2198: 
        !          2199:        
        !          2200: 
        !          2201: 
        !          2202:        if(remove>=0 && days>=remove){
        !          2203:                fp = parseline1(ctl);
        !          2204:                if(fp==0)
        !          2205:                        return -1;
        !          2206:                fclose(fp);
        !          2207: 
        !          2208:                log("r %d %d\n", days, remove);
        !          2209:                return returnmail(ctl, 1);
        !          2210:        }
        !          2211: 
        !          2212:        
        !          2213: 
        !          2214: 
        !          2215:        if(warn>=0 && days>=warn){
        !          2216:                fp = parseline1(ctl);
        !          2217:                if(fp==0)
        !          2218:                        return -1;
        !          2219:                fclose(fp);
        !          2220: 
        !          2221:                log("w %d %d\n", days, warn);
        !          2222:                returnmail(ctl, 0);
        !          2223:        }
        !          2224: 
        !          2225:        return -1;
        !          2226: }
        !          2227: 
        !          2228: 
        !          2229: 
        !          2230: 
        !          2231: returnmail(ctl, warn)
        !          2232:        char *ctl;
        !          2233: {
        !          2234:        int pid, status;
        !          2235:        string *cmd;
        !          2236:        int pfd[2];
        !          2237:        char buf[132];
        !          2238:        int fd, n;
        !          2239:        int reads;
        !          2240:        struct  _iobuf *fp;
        !          2241:        struct  _iobuf *ifp;
        !          2242:        long now;
        !          2243:        char asct[27];
        !          2244: 
        !          2245:        log("returnmail %s to %s about %s\n", ctl,  replyaddr->base,
        !          2246:                 dest->base);
        !          2247: 
        !          2248:        if(pipe(pfd)<0)
        !          2249:                return -1;
        !          2250: 
        !          2251:        switch(pid=fork()){
        !          2252:        case -1:
        !          2253:                close(pfd[0]);
        !          2254:                close(pfd[1]);
        !          2255:                return -1;
        !          2256:        case 0:
        !          2257:                
        !          2258: 
        !          2259: 
        !          2260:                close(0);
        !          2261:                dup(pfd[0]);
        !          2262:                close(pfd[1]);
        !          2263:                execl("/bin/rmail", "/bin/rmail",   replyaddr->base, 0);
        !          2264:                exit(1);
        !          2265:        default:
        !          2266:                
        !          2267: 
        !          2268: 
        !          2269:                close(pfd[0]);
        !          2270:                fp = fdopen(pfd[1], "w");
        !          2271:                if(fp==0) {
        !          2272:                        close(pfd[1]);
        !          2273:                        break;
        !          2274:                }
        !          2275: 
        !          2276:                
        !          2277: 
        !          2278: 
        !          2279:                now = time((long *)0);
        !          2280:                strcpy(asct, ctime(&now));
        !          2281:                asct[24] = 0;
        !          2282:                fprintf(fp, "From postmaster %s remote from \n", asct);
        !          2283: 
        !          2284:                
        !          2285: 
        !          2286: 
        !          2287:                if(warn) {
        !          2288:                        fprintf(fp, "Subject: smtp mail failed\n\n");
        !          2289:                        fprintf(fp, "Your mail to %s is undeliverable.\n",
        !          2290:                                 dest->base);
        !          2291:                } else {
        !          2292:                        fprintf(fp, "Subject: smtp mail warning\n\n");
        !          2293:                        fprintf(fp, "Your mail to %s is not yet delivered.\n",
        !          2294:                                 dest->base);
        !          2295:                        fprintf(fp, "Delivery attempts continue.\n");
        !          2296:                }
        !          2297: 
        !          2298:                
        !          2299: 
        !          2300: 
        !          2301:                fprintf(fp, "---------- diagnosis ----------\n");
        !          2302:                ifp = fopen(fileoftype('E', ctl), "r");
        !          2303:                if(ifp!=0){
        !          2304:                        for(reads=0; reads<20; reads++) {
        !          2305:                                if(fgets(buf, sizeof(buf), ifp)==0)
        !          2306:                                        break;
        !          2307:                                fputs(buf, fp);
        !          2308:                        }
        !          2309:                        fclose(ifp);
        !          2310:                }
        !          2311: 
        !          2312:                
        !          2313: 
        !          2314: 
        !          2315:                fprintf(fp, "---------- unsent mail ----------\n");
        !          2316:                ifp = fopen(fileoftype('D', ctl), "r");
        !          2317:                if(ifp!=0){
        !          2318:                        for(reads=0; reads<50; reads++) {
        !          2319:                                if(fgets(buf, sizeof(buf), ifp)==0)
        !          2320:                                        break;
        !          2321:                                fputs(buf, fp);
        !          2322:                        }
        !          2323:                        fclose(ifp);
        !          2324:                }
        !          2325:                fclose(fp);
        !          2326: 
        !          2327:                
        !          2328: 
        !          2329: 
        !          2330:                while((n = wait(&status))>=0)
        !          2331:                        if(n == pid)
        !          2332:                                break;
        !          2333:                return status ? -1 : 0;
        !          2334:        }
        !          2335:        close(pfd[1]);
        !          2336:        return -1;
        !          2337: }
        !          2338: 
        !          2339: openlog()
        !          2340: {
        !          2341:        string *f;
        !          2342: 
        !          2343:        if (debug)
        !          2344:                return;
        !          2345:        f = s_new();
        !          2346:        s_append(f, "/usr/spool/smtpq");
        !          2347:        s_append(f, "/smtpsched.log");
        !          2348:        close(0);
        !          2349:        if(open("/dev/null", 0)==0){
        !          2350:                close(1);
        !          2351:                close(2);
        !          2352:                close(3);
        !          2353:                if(open( f->base, 2)==1
        !          2354:                || creat( f->base, 0666)==1){
        !          2355:                        lseek(1, 0L, 2);
        !          2356:                        dup(1);
        !          2357:                        dup(1);
        !          2358:                }
        !          2359:        }
        !          2360:        s_free(f);
        !          2361: }
        !          2362: 
        !          2363: log(f, a, b, c)
        !          2364:        char *f;
        !          2365: {
        !          2366:        char *dp;
        !          2367:        struct tm *bp;
        !          2368:        long thetime;
        !          2369:        extern struct tm *localtime();
        !          2370:        extern char *asctime();
        !          2371:        extern long time();
        !          2372: 
        !          2373:        thetime = time((long *)0);
        !          2374:        bp = localtime(&thetime);
        !          2375:        dp = asctime(bp);
        !          2376: 
        !          2377:        lseek(1, 0L, 2);
        !          2378:        printf("%d %.12s: ", mypid, dp+4);
        !          2379:        printf(f, a, b, c);
        !          2380:        fflush((& _iob[1]));
        !          2381: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.