Annotation of sbbs/sbbs2/fido/sbbsfido.c, revision 1.1

1.1     ! root        1: /* SBBSFIDO.C */
        !             2: 
        !             3: /* Synchronet FidoNet EchoMail Scanning/Tossing and NetMail Tossing Utility */
        !             4: 
        !             5: #define VER "2.24"
        !             6: 
        !             7: #include "sbbs.h"
        !             8: #include "crc32.h"
        !             9: #include "lzh.h"
        !            10: #include "post.h"
        !            11: #include "scfglib.h"
        !            12: 
        !            13: #define IMPORT_NETMAIL (1L<<0)
        !            14: #define IMPORT_ECHOMAIL (1L<<1)
        !            15: #define EXPORT_ECHOMAIL (1L<<2)
        !            16: #define DELETE_NETMAIL (1L<<3)
        !            17: #define DELETE_ECHOMAIL (1L<<4)
        !            18: #define IGNORE_POINT   (1L<<5)
        !            19: #define IGNORE_ZONE    (1L<<6)
        !            20: #define IGNORE_MSGPTRS (1L<<7)
        !            21: #define UPDATE_MSGPTRS (1L<<8)
        !            22: #define LEAVE_MSGPTRS  (1L<<9)
        !            23: #define KILL_ECHOMAIL  (1L<<10)
        !            24: #define ASCII_ONLY             (1L<<11)
        !            25: #define LOGFILE                (1L<<12)
        !            26: #define REPORT                 (1L<<13)
        !            27: #define EXPORT_ALL             (1L<<14)
        !            28: #define PURGE_ECHOMAIL (1L<<15)
        !            29: #define UNKNOWN_NETMAIL (1L<<16)
        !            30: #define IGNORE_ADDRESS (1L<<17)
        !            31: #define IMPORT_LOCAL   (1L<<18)
        !            32: #define IMPORT_NEW_ONLY (1L<<19)
        !            33: #define DONT_SET_RECV  (1L<<20)
        !            34: #define IGNORE_RECV    (1L<<21)
        !            35: #define CONVERT_TEAR   (1L<<22)
        !            36: #define IMPORT_PRIVATE (1L<<23)
        !            37: #define LOCAL_NETMAIL  (1L<<24)
        !            38: #define NOTIFY_RECEIPT (1L<<25)
        !            39: 
        !            40: char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
        !            41: char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
        !            42:             ,"Jul","Aug","Sep","Oct","Nov","Dec"};
        !            43: 
        !            44: long misc=(IMPORT_NETMAIL|IMPORT_ECHOMAIL|EXPORT_ECHOMAIL
        !            45:                        |DELETE_NETMAIL|DELETE_ECHOMAIL|KILL_ECHOMAIL);
        !            46: char tmp[256];
        !            47: 
        !            48: FILE *fidologfile=NULL;
        !            49: #ifdef __TURBOC__
        !            50:        unsigned _stklen=20000;
        !            51: #endif
        !            52: int startmsg=1;
        !            53: int nodefile;
        !            54: 
        !            55: #ifdef __WATCOMC__
        !            56:        #define O_DENYNONE SH_DENYNO
        !            57: #endif
        !            58: 
        !            59: long lputs(char FAR16 *str)
        !            60: {
        !            61:     char tmp[256];
        !            62:     int i,j,k;
        !            63: 
        !            64: if(misc&LOGFILE && fidologfile!=NULL)
        !            65:     fputs(str,fidologfile);
        !            66: j=strlen(str);
        !            67: for(i=k=0;i<j;i++)      /* remove CRs */
        !            68:     if(str[i]==CR && str[i+1]==LF)
        !            69:         continue;
        !            70:     else
        !            71:         tmp[k++]=str[i];
        !            72: tmp[k]=0;
        !            73: return(fputs(tmp,stdout));
        !            74: }
        !            75: 
        !            76: /******************************************/
        !            77: /* CRC-16 routines required for SMB index */
        !            78: /******************************************/
        !            79: 
        !            80: /****************************************************************************/
        !            81: /* Updates 16-bit "rcrc" with character 'ch'                                */
        !            82: /****************************************************************************/
        !            83: void ucrc16(uchar ch, ushort *rcrc) {
        !            84:        ushort i, cy;
        !            85:     uchar nch=ch;
        !            86:  
        !            87: for (i=0; i<8; i++) {
        !            88:     cy=*rcrc & 0x8000;
        !            89:     *rcrc<<=1;
        !            90:     if (nch & 0x80) *rcrc |= 1;
        !            91:     nch<<=1;
        !            92:     if (cy) *rcrc ^= 0x1021; }
        !            93: }
        !            94: 
        !            95: /****************************************************************************/
        !            96: /* Returns 16-crc of string (not counting terminating NULL)                            */
        !            97: /****************************************************************************/
        !            98: ushort crc16(char *str)
        !            99: {
        !           100:        int     i=0;
        !           101:        ushort  crc=0;
        !           102: 
        !           103: ucrc16(0,&crc);
        !           104: while(str[i])
        !           105:        ucrc16(str[i++],&crc);
        !           106: ucrc16(0,&crc);
        !           107: ucrc16(0,&crc);
        !           108: return(crc);
        !           109: }
        !           110: 
        !           111: /****************************************************************************/
        !           112: /* Returns 32-crc of string (not counting terminating NULL)                            */
        !           113: /****************************************************************************/
        !           114: ulong crc32(char *str)
        !           115: {
        !           116:        int i=0;
        !           117:        ulong crc=0xffffffffUL;
        !           118: 
        !           119:        while(str[i])
        !           120:                crc=ucrc32(str[i++],crc);
        !           121:        crc=~crc;
        !           122:        return(crc);
        !           123: }
        !           124: 
        !           125: 
        !           126: 
        !           127: /****************************************************************************/
        !           128: /* Performs printf() through local assembly routines                        */
        !           129: /* Called from everywhere                                                   */
        !           130: /****************************************************************************/
        !           131: int lprintf(char *fmat, ...)
        !           132: {
        !           133:        va_list argptr;
        !           134:        char sbuf[256];
        !           135:        int chcount;
        !           136: 
        !           137: va_start(argptr,fmat);
        !           138: chcount=vsprintf(sbuf,fmat,argptr);
        !           139: va_end(argptr);
        !           140: lputs(sbuf);
        !           141: return(chcount);
        !           142: }
        !           143: 
        !           144: /****************************************************************************/
        !           145: /* Reads the data for node number 'number' into the structure 'node'        */
        !           146: /* from NODE.DAB                                                                                                                       */
        !           147: /* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */
        !           148: /****************************************************************************/
        !           149: void getnodedat(uint number, node_t *node, char lockit)
        !           150: {
        !           151:        char str[256];
        !           152:        int count=0;
        !           153: 
        !           154: number--;      /* make zero based */
        !           155: while(count<LOOP_NODEDAB) {
        !           156:        lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET);
        !           157:        if(lockit
        !           158:                && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) {
        !           159:                count++;
        !           160:                continue; }
        !           161:        if(read(nodefile,node,sizeof(node_t))==sizeof(node_t))
        !           162:                break;
        !           163:        count++; }
        !           164: if(count==LOOP_NODEDAB)
        !           165:        lprintf("\7Error unlocking and reading NODE.DAB\r\n");
        !           166: }
        !           167: 
        !           168: /****************************************************************************/
        !           169: /* Write the data from the structure 'node' into NODE.DAB                                      */
        !           170: /* getnodedat(num,&node,1); must have been called before calling this func  */
        !           171: /*          NOTE: ------^   the indicates the node record has been locked   */
        !           172: /****************************************************************************/
        !           173: void putnodedat(uint number, node_t node)
        !           174: {
        !           175:        char str[256];
        !           176:        int count;
        !           177: 
        !           178: number--;      /* make zero based */
        !           179: lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET);
        !           180: if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) {
        !           181:        unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t));
        !           182:        lprintf("\7Error writing NODE.DAB for node %u\r\n",number+1);
        !           183:        return; }
        !           184: unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t));
        !           185: }
        !           186: 
        !           187: 
        !           188: /****************************************************************************/
        !           189: /* Creates a short message for 'usernumber' than contains 'strin'                      */
        !           190: /****************************************************************************/
        !           191: void putsmsg(int usernumber, char *strin)
        !           192: {
        !           193:        char str[256];
        !           194:        int file,i;
        !           195:     node_t node;
        !           196: 
        !           197: sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,usernumber);
        !           198: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
        !           199:        lprintf("\7Error opening/creating %s for creat/append access\r\n",str);
        !           200:        return; }
        !           201: i=strlen(strin);
        !           202: if(write(file,strin,i)!=i) {
        !           203:        close(file);
        !           204:        lprintf("\7Error writing %u bytes to %s\r\n",i,str);
        !           205:        return; }
        !           206: close(file);
        !           207: for(i=1;i<=sys_nodes;i++) {            /* flag node if user on that msg waiting */
        !           208:        getnodedat(i,&node,0);
        !           209:        if(node.useron==usernumber
        !           210:                && (node.status==NODE_INUSE || node.status==NODE_QUIET)
        !           211:                && !(node.misc&NODE_MSGW)) {
        !           212:                getnodedat(i,&node,1);
        !           213:                node.misc|=NODE_MSGW;
        !           214:         putnodedat(i,node); } }
        !           215: }
        !           216: 
        !           217: 
        !           218: /****************************************************************************/
        !           219: /* Converts an ASCII Hex string into an ulong                       */
        !           220: /****************************************************************************/
        !           221: ulong ahtoul(char *str)
        !           222: {
        !           223:        ulong l,val=0;
        !           224: 
        !           225: while((l=(*str++)|0x20)!=0x20)
        !           226:        val=(l&0xf)+(l>>6&1)*9+val*16;
        !           227: return(val);
        !           228: }
        !           229: 
        !           230: /****************************************************************************/
        !           231: /* Truncates white-space chars off end of 'str' and terminates at first tab */
        !           232: /****************************************************************************/
        !           233: void truncsp(char *str)
        !           234: {
        !           235:        char c;
        !           236: 
        !           237: str[strcspn(str,"\t")]=0;
        !           238: c=strlen(str);
        !           239: while(c && str[c-1]<=SP) c--;
        !           240: str[c]=0;
        !           241: }
        !           242: 
        !           243: /****************************************************************************/
        !           244: /* Puts a backslash on path strings                                                                            */
        !           245: /****************************************************************************/
        !           246: void backslash(char *str)
        !           247: {
        !           248:     int i;
        !           249: 
        !           250: i=strlen(str);
        !           251: if(i && str[i-1]!='\\') {
        !           252:     str[i]='\\'; str[i+1]=0; }
        !           253: }
        !           254: 
        !           255: void remove_re(char *str)
        !           256: {
        !           257: while(!strnicmp(str,"RE:",3)) {
        !           258:        strcpy(str,str+3);
        !           259:        while(str[0]==SP)
        !           260:                strcpy(str,str+1); }
        !           261: }
        !           262: 
        !           263: /****************************************************************************/
        !           264: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN    */
        !           265: /* number of times if the attempted file is already open or denying access     */
        !           266: /* for some other reason.      All files are opened in BINARY mode.                    */
        !           267: /****************************************************************************/
        !           268: int nopen(char *str, int access)
        !           269: {
        !           270:        char logstr[256];
        !           271:        int file,share,count=0;
        !           272: 
        !           273: if(access&O_DENYNONE) {
        !           274:        share=SH_DENYNO;
        !           275:        access&=~O_DENYNONE; }
        !           276: else if(access==O_RDONLY) share=SH_DENYWR;
        !           277: else share=SH_DENYRW;
        !           278: while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1)
        !           279:        && errno==EACCES && count++<LOOP_NOPEN);
        !           280: if(file==-1 && errno==EACCES)
        !           281:        lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7");
        !           282: return(file);
        !           283: }
        !           284: 
        !           285: /****************************************************************************/
        !           286: /* This function performs an nopen, but returns a file stream with a buffer */
        !           287: /* allocated.                                                                                                                          */
        !           288: /****************************************************************************/
        !           289: FILE *fnopen(int *file, char *str, int access)
        !           290: {
        !           291:        char mode[128];
        !           292:        FILE *stream;
        !           293: 
        !           294: if(((*file)=nopen(str,access))==-1)
        !           295:        return(NULL);
        !           296: 
        !           297: if(access&O_APPEND) {
        !           298:        if(access&O_RDONLY)
        !           299:                strcpy(mode,"a+");
        !           300:        else
        !           301:                strcpy(mode,"a"); }
        !           302: else {
        !           303:        if(access&O_WRONLY)
        !           304:                strcpy(mode,"r+");
        !           305:        else
        !           306:                strcpy(mode,"r"); }
        !           307: stream=fdopen((*file),mode);
        !           308: if(stream==NULL) {
        !           309:        close(*file);
        !           310:        return(NULL); }
        !           311: setvbuf(stream,NULL,_IOFBF,16*1024);
        !           312: return(stream);
        !           313: }
        !           314: 
        !           315: 
        !           316: /****************************************************************************/
        !           317: /* Moves or copies a file from one dir to another                           */
        !           318: /* both 'src' and 'dest' must contain full path and filename                */
        !           319: /* returns 0 if successful, -1 if error                                     */
        !           320: /****************************************************************************/
        !           321: int mv(char *src, char *dest, char copy)
        !           322: {
        !           323:        char buf[4096],str[256];
        !           324:        int  ind,outd;
        !           325:        long length,chunk=4096,l;
        !           326:        ushort ftime,fdate;
        !           327:     FILE *inp,*outp;
        !           328: 
        !           329: if(!strcmp(src,dest))  /* source and destination are the same! */
        !           330:        return(0);
        !           331: if(!fexist(src)) {
        !           332:        lprintf("\r\nMV ERROR: Source doesn't exist\r\n'%s'\r\n"
        !           333:                ,src);
        !           334:        return(-1); }
        !           335: if(!copy && fexist(dest)) {
        !           336:        lprintf("\r\nMV ERROR: Destination already exists\r\n'%s'\r\n"
        !           337:                ,dest);
        !           338:        return(-1); }
        !           339: if(!copy && ((src[1]!=':' && dest[1]!=':')
        !           340:        || (src[1]==':' && dest[1]==':' && toupper(src[0])==toupper(dest[0])))) {
        !           341:        if(rename(src,dest)) {                                          /* same drive, so move */
        !           342:                lprintf("\r\nMV ERROR: Error renaming '%s'"
        !           343:                                "\r\n                      to '%s'\r\n",src,dest);
        !           344:                return(-1); }
        !           345:        return(0); }
        !           346: if((ind=nopen(src,O_RDONLY))==-1) {
        !           347:        lprintf("\r\nMV ERROR: ERR_OPEN %s\r\n",src);
        !           348:        return(-1); }
        !           349: if((inp=fdopen(ind,"rb"))==NULL) {
        !           350:        close(ind);
        !           351:        lprintf("\r\nMV ERROR: ERR_FDOPEN %s\r\n",str);
        !           352:        return(-1); }
        !           353: setvbuf(inp,NULL,_IOFBF,8*1024);
        !           354: if((outd=nopen(dest,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
        !           355:        fclose(inp);
        !           356:        lprintf("\r\nMV ERROR: ERR_OPEN %s\r\n",dest);
        !           357:        return(-1); }
        !           358: if((outp=fdopen(outd,"wb"))==NULL) {
        !           359:        close(outd);
        !           360:        fclose(inp);
        !           361:        lprintf("\r\nMV ERROR: ERR_FDOPEN %s\r\n",str);
        !           362:        return(-1); }
        !           363: setvbuf(outp,NULL,_IOFBF,8*1024);
        !           364: length=filelength(ind);
        !           365: l=0L;
        !           366: while(l<length) {
        !           367:        if(l+chunk>length)
        !           368:                chunk=length-l;
        !           369:        fread(buf,chunk,1,inp);
        !           370:        fwrite(buf,chunk,1,outp);
        !           371:        l+=chunk; }
        !           372: _dos_getftime(ind,&fdate,&ftime);
        !           373: _dos_setftime(outd,fdate,ftime);
        !           374: fclose(inp);
        !           375: fclose(outp);
        !           376: if(!copy && remove(src)) {
        !           377:        lprintf("MV ERROR: ERR_REMOVE %s\r\n",src);
        !           378:        return(-1); }
        !           379: return(0);
        !           380: }
        !           381: 
        !           382: /****************************************************************************/
        !           383: /* Returns the total number of msgs in the sub-board and sets 'ptr' to the  */
        !           384: /* date of the last message in the sub (0) if no messages.                                     */
        !           385: /****************************************************************************/
        !           386: ulong getlastmsg(uint subnum, ulong *ptr, time_t *t)
        !           387: {
        !           388:        char str[256];
        !           389:        int i;
        !           390:        smbstatus_t status;
        !           391: 
        !           392: sprintf(smb_file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code);
        !           393: if((i=smb_open(10))!=0) {
        !           394:        lprintf("ERR_OPEN %s %d\r\n",smb_file,i);
        !           395:        return(0); }
        !           396: 
        !           397: if(!filelength(fileno(shd_fp))) {                      /* Empty base */
        !           398:        if(ptr) (*ptr)=0;
        !           399:        smb_close();
        !           400:        return(0); }
        !           401: if((i=smb_locksmbhdr(10))!=0) {
        !           402:        smb_close();
        !           403:        lprintf("ERR_LOCK %s %d\r\n",smb_file,i);
        !           404:        return(0); }
        !           405: if((i=smb_getstatus(&status))!=0) {
        !           406:        smb_unlocksmbhdr();
        !           407:        smb_close();
        !           408:        lprintf("ERR_READ %s %d\r\n",smb_file,i);
        !           409:        return(0); }
        !           410: smb_unlocksmbhdr();
        !           411: smb_close();
        !           412: if(ptr) (*ptr)=status.last_msg;
        !           413: return(status.total_msgs);
        !           414: }
        !           415: 
        !           416: 
        !           417: ulong loadmsgs(post_t HUGE16 **post, ulong ptr)
        !           418: {
        !           419:        int i;
        !           420:        long l=0;
        !           421:        idxrec_t idx;
        !           422: 
        !           423: 
        !           424: if((i=smb_locksmbhdr(10))!=0) {                                /* Be sure noone deletes or */
        !           425:        lprintf("ERR_LOCK %s %d\r\n",smb_file,i);   /* adds while we're reading */
        !           426:        return(0L); }
        !           427: 
        !           428: fseek(sid_fp,0L,SEEK_SET);
        !           429: while(!feof(sid_fp)) {
        !           430:     if(!fread(&idx,sizeof(idxrec_t),1,sid_fp))
        !           431:         break;
        !           432: 
        !           433:        if(idx.number<=ptr || idx.attr&MSG_DELETE)
        !           434:                continue;
        !           435: 
        !           436:        if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED))
        !           437:                break;
        !           438: 
        !           439:        if(((*post)=(post_t HUGE16 *)REALLOC((*post),sizeof(post_t)*(l+1)))
        !           440:         ==NULL) {
        !           441:                smb_unlocksmbhdr();
        !           442:                lprintf("ERR_ALLOC %s %lu\r\n",smb_file,sizeof(post_t *)*(l+1));
        !           443:                return(l); }
        !           444:        (*post)[l].offset=idx.offset;
        !           445:        (*post)[l].number=idx.number;
        !           446:        l++; }
        !           447: smb_unlocksmbhdr();
        !           448: return(l);
        !           449: }
        !           450: 
        !           451: 
        !           452: void allocfail(uint size)
        !           453: {
        !           454: lprintf("\7Error allocating %u bytes of memory.\r\n",size);
        !           455: bail(1);
        !           456: }
        !           457: 
        !           458: void bail(int code)
        !           459: {
        !           460: exit(code);
        !           461: }
        !           462: 
        !           463: /****************************************************************************/
        !           464: /* Returns the length of the file in 'filespec'                             */
        !           465: /****************************************************************************/
        !           466: long flength(char *filespec)
        !           467: {
        !           468:        struct find_t f;
        !           469: 
        !           470: if(!findfirst(filespec,&f,0))
        !           471:        return(f.size);
        !           472: return(-1L);
        !           473: }
        !           474: 
        !           475: /****************************************************************************/
        !           476: /* Checks the disk drive for the existence of a file. Returns 1 if it       */
        !           477: /* exists, 0 if it doesn't.                                                 */
        !           478: /* Called from upload                                                       */
        !           479: /****************************************************************************/
        !           480: char fexist(char *filespec)
        !           481: {
        !           482:        struct find_t f;
        !           483: 
        !           484: if(!findfirst(filespec,&f,0))
        !           485:     return(1);
        !           486: return(0);
        !           487: }
        !           488: 
        !           489: typedef struct {
        !           490:        ulong   alias,
        !           491:                        real;
        !           492:                        } username_t;
        !           493: 
        !           494: /****************************************************************************/
        !           495: /* Note: Wrote another version of this function that read all userdata into */
        !           496: /****************************************************************************/
        !           497: /* Looks for a perfect match amoung all usernames (not deleted users)          */
        !           498: /* Returns the number of the perfect matched username or 0 if no match         */
        !           499: /* Called from functions waitforcall and newuser                                                       */
        !           500: /* memory then scanned it from memory... took longer - always.              */
        !           501: /****************************************************************************/
        !           502: ulong matchname(char *inname)
        !           503: {
        !           504:        static ulong total_users;
        !           505:        static username_t *username;
        !           506:        int userdat,file,i;
        !           507:        char str[256],c;
        !           508:        ulong l,crc;
        !           509:        FILE *namedat;
        !           510: 
        !           511: if(!total_users) {             /* Load CRCs */
        !           512:        fprintf(stderr,"%-25s","Loading user names...");
        !           513:        sprintf(str,"%sUSER\\NAME.DAT",data_dir);
        !           514:        if((namedat=fnopen(&file,str,O_RDONLY))==NULL)
        !           515:                return(0);
        !           516:        sprintf(str,"%sUSER\\USER.DAT",data_dir);
        !           517:        if((userdat=nopen(str,O_RDONLY|O_DENYNONE))==-1) {
        !           518:                fclose(namedat);
        !           519:                return(0); }
        !           520:        while(!feof(namedat) && !eof(userdat)) {
        !           521:                if(!fread(str,LEN_ALIAS+2,1,namedat))
        !           522:                        break;
        !           523:                if((username=(username_t *)REALLOC(username
        !           524:                        ,(total_users+1)*sizeof(username_t)))==NULL)
        !           525:                        break;
        !           526: 
        !           527:                for(c=0;c<LEN_ALIAS;c++)
        !           528:                        if(str[c]==ETX) break;
        !           529:                str[c]=0;
        !           530:                strlwr(str);
        !           531:                username[total_users].alias=crc32(str);
        !           532:                i=0;
        !           533:                while(i<LOOP_NODEDAB
        !           534:                        && lock(userdat,(long)((long)(total_users)*U_LEN)+U_NAME
        !           535:                                ,LEN_NAME)==-1) {
        !           536:                        i++; }
        !           537:                if(i>=LOOP_NODEDAB)        /* Couldn't lock USER.DAT record */
        !           538:                        continue;
        !           539:                lseek(userdat,(long)((long)(total_users)*U_LEN)+U_NAME,SEEK_SET);
        !           540:                read(userdat,str,LEN_NAME);
        !           541:                unlock(userdat,(long)((long)(total_users)*U_LEN)+U_NAME,LEN_NAME);
        !           542:                for(c=0;c<LEN_NAME;c++)
        !           543:                        if(str[c]==ETX || str[c]==CR) break;
        !           544:                str[c]=0;
        !           545:                strlwr(str);
        !           546:                username[total_users].real=crc32(str);
        !           547:                total_users++; }
        !           548:        fclose(namedat);
        !           549:        close(userdat);
        !           550:        fprintf(stderr,
        !           551:                "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
        !           552:                "%25s"
        !           553:                "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"
        !           554:                ,""); }
        !           555: 
        !           556: strcpy(str,inname);
        !           557: strlwr(str);
        !           558: crc=crc32(str);
        !           559: for(l=0;l<total_users;l++)
        !           560:        if(crc==username[l].alias || crc==username[l].real)
        !           561:                return(l+1);
        !           562: return(0);
        !           563: }
        !           564: 
        !           565: /****************************************************************************/
        !           566: /* Converts goofy FidoNet time format into Unix format                                         */
        !           567: /****************************************************************************/
        !           568: time_t fmsgtime(char *str)
        !           569: {
        !           570:        char month[4];
        !           571:        struct tm tm;
        !           572: 
        !           573: memset(&tm,0,sizeof(tm));
        !           574: if(isdigit(str[1])) {  /* Regular format: "01 Jan 86  02:34:56" */
        !           575:        tm.tm_mday=atoi(str);
        !           576:        sprintf(month,"%3.3s",str+3);
        !           577:        if(!stricmp(month,"jan"))
        !           578:                tm.tm_mon=0;
        !           579:        else if(!stricmp(month,"feb"))
        !           580:                tm.tm_mon=1;
        !           581:        else if(!stricmp(month,"mar"))
        !           582:                tm.tm_mon=2;
        !           583:        else if(!stricmp(month,"apr"))
        !           584:                tm.tm_mon=3;
        !           585:        else if(!stricmp(month,"may"))
        !           586:                tm.tm_mon=4;
        !           587:        else if(!stricmp(month,"jun"))
        !           588:                tm.tm_mon=5;
        !           589:        else if(!stricmp(month,"jul"))
        !           590:                tm.tm_mon=6;
        !           591:        else if(!stricmp(month,"aug"))
        !           592:                tm.tm_mon=7;
        !           593:        else if(!stricmp(month,"sep"))
        !           594:                tm.tm_mon=8;
        !           595:        else if(!stricmp(month,"oct"))
        !           596:                tm.tm_mon=9;
        !           597:        else if(!stricmp(month,"nov"))
        !           598:                tm.tm_mon=10;
        !           599:        else
        !           600:                tm.tm_mon=11;
        !           601:        tm.tm_year=atoi(str+7);
        !           602:        tm.tm_hour=atoi(str+11);
        !           603:        tm.tm_min=atoi(str+14);
        !           604:        tm.tm_sec=atoi(str+17); }
        !           605: 
        !           606: else {                                 /* SEAdog  format: "Mon  1 Jan 86 02:34" */
        !           607:        tm.tm_mday=atoi(str+4);
        !           608:        sprintf(month,"%3.3s",str+7);
        !           609:        if(!stricmp(month,"jan"))
        !           610:                tm.tm_mon=0;
        !           611:        else if(!stricmp(month,"feb"))
        !           612:                tm.tm_mon=1;
        !           613:        else if(!stricmp(month,"mar"))
        !           614:                tm.tm_mon=2;
        !           615:        else if(!stricmp(month,"apr"))
        !           616:                tm.tm_mon=3;
        !           617:        else if(!stricmp(month,"may"))
        !           618:                tm.tm_mon=4;
        !           619:        else if(!stricmp(month,"jun"))
        !           620:                tm.tm_mon=5;
        !           621:        else if(!stricmp(month,"jul"))
        !           622:                tm.tm_mon=6;
        !           623:        else if(!stricmp(month,"aug"))
        !           624:                tm.tm_mon=7;
        !           625:        else if(!stricmp(month,"sep"))
        !           626:                tm.tm_mon=8;
        !           627:        else if(!stricmp(month,"oct"))
        !           628:                tm.tm_mon=9;
        !           629:        else if(!stricmp(month,"nov"))
        !           630:                tm.tm_mon=10;
        !           631:        else
        !           632:                tm.tm_mon=11;
        !           633:        tm.tm_year=atoi(str+11);
        !           634:        tm.tm_hour=atoi(str+14);
        !           635:        tm.tm_min=atoi(str+17);
        !           636:        tm.tm_sec=0; }
        !           637: 
        !           638: if(tm.tm_year<70)
        !           639:        tm.tm_year+=100;
        !           640: 
        !           641: return(mktime(&tm));
        !           642: }
        !           643: 
        !           644: /****************************************************************************/
        !           645: /* Returns the FidoNet address kept in str as ASCII.                        */
        !           646: /****************************************************************************/
        !           647: faddr_t atofaddr(char *str)
        !           648: {
        !           649:     char *p;
        !           650:     faddr_t addr;
        !           651: 
        !           652: addr.zone=addr.net=addr.node=addr.point=0;
        !           653: if((p=strchr(str,':'))!=NULL) {
        !           654:     addr.zone=atoi(str);
        !           655:     addr.net=atoi(p+1); }
        !           656: else {
        !           657:     if(total_faddrs)
        !           658:                addr.zone=faddr[0].zone;
        !           659:     else
        !           660:         addr.zone=1;
        !           661:     addr.net=atoi(str); }
        !           662: if(!addr.zone)              /* no such thing as zone 0 */
        !           663:     addr.zone=1;
        !           664: if((p=strchr(str,'/'))!=NULL)
        !           665:     addr.node=atoi(p+1);
        !           666: else {
        !           667:     if(total_faddrs)
        !           668:                addr.net=faddr[0].net;
        !           669:     else
        !           670:         addr.net=1;
        !           671:     addr.node=atoi(str); }
        !           672: if((p=strchr(str,'.'))!=NULL)
        !           673:     addr.point=atoi(p+1);
        !           674: return(addr);
        !           675: }
        !           676: 
        !           677: /****************************************************************************/
        !           678: /* Returns an ASCII string for FidoNet address 'addr'                       */
        !           679: /****************************************************************************/
        !           680: char *faddrtoa(faddr_t addr)
        !           681: {
        !           682:     static char str[25];
        !           683:     char point[25];
        !           684: 
        !           685: sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node);
        !           686: if(addr.point) {
        !           687:     sprintf(point,".%u",addr.point);
        !           688:     strcat(str,point); }
        !           689: return(str);
        !           690: }
        !           691: 
        !           692: #ifndef __OS2__
        !           693: /****************************************************************************/
        !           694: /* This function reads files that are potentially larger than 32k.             */
        !           695: /* Up to one megabyte of data can be read with each call.                   */
        !           696: /****************************************************************************/
        !           697: long lread(int file, char HUGE16 *buf,long bytes)
        !           698: {
        !           699:        long count;
        !           700: 
        !           701: for(count=bytes;count>32767;count-=32767,buf+=32767)
        !           702:        if(read(file,(char *)buf,32767)!=32767)
        !           703:                return(-1L);
        !           704: if(read(file,(char *)buf,(int)count)!=count)
        !           705:        return(-1L);
        !           706: return(bytes);
        !           707: }
        !           708: #endif
        !           709: 
        !           710: /****************************************************************************/
        !           711: /* Coverts a FidoNet message into a Synchronet message                                         */
        !           712: /****************************************************************************/
        !           713: void fmsgtosmsg(int file, fmsghdr_t fmsghdr, smbstatus_t status, uint user
        !           714:        ,uint subnum)
        !           715: {
        !           716:        uchar   ch,HUGE16 *fbuf,HUGE16 *sbody,HUGE16 *stail,HUGE16 *outbuf
        !           717:                        ,done,col,esc,cr,*p,str[128];
        !           718:        int     i,chunk,lzh=0,storage;
        !           719:        ushort  xlat,net;
        !           720:        ulong   l,m,length,lzhlen,bodylen,taillen,crc;
        !           721:        faddr_t faddr,origaddr,destaddr;
        !           722:        smbmsg_t        msg;
        !           723: 
        !           724: memset(&msg,0,sizeof(smbmsg_t));
        !           725: memcpy(msg.hdr.id,"SHD\x1a",4);
        !           726: msg.hdr.version=SMB_VERSION;
        !           727: if(fmsghdr.attr&FIDO_PRIVATE)
        !           728:        msg.idx.attr|=MSG_PRIVATE;
        !           729: msg.hdr.attr=msg.idx.attr;
        !           730: 
        !           731: if(fmsghdr.attr&FIDO_FILE)
        !           732:        msg.hdr.auxattr|=MSG_FILEATTACH;
        !           733: 
        !           734: msg.hdr.when_imported.time=time(NULL);
        !           735: msg.hdr.when_imported.zone=sys_timezone;
        !           736: msg.hdr.when_written.time=fmsgtime(fmsghdr.time);
        !           737: 
        !           738: origaddr.zone=fmsghdr.origzone;        /* only valid if NetMail */
        !           739: origaddr.net=fmsghdr.orignet;
        !           740: origaddr.node=fmsghdr.orignode;
        !           741: origaddr.point=fmsghdr.origpoint;
        !           742: 
        !           743: destaddr.zone=fmsghdr.destzone;        /* only valid if NetMail */
        !           744: destaddr.net=fmsghdr.destnet;
        !           745: destaddr.node=fmsghdr.destnode;
        !           746: destaddr.point=fmsghdr.destpoint;
        !           747: 
        !           748: smb_hfield(&msg,SENDER,strlen(fmsghdr.from),fmsghdr.from);
        !           749: strlwr(fmsghdr.from);
        !           750: msg.idx.from=crc16(fmsghdr.from);
        !           751: 
        !           752: smb_hfield(&msg,RECIPIENT,strlen(fmsghdr.to),fmsghdr.to);
        !           753: strlwr(fmsghdr.to);
        !           754: msg.idx.to=crc16(fmsghdr.to);
        !           755: 
        !           756: if(user) {
        !           757:        sprintf(str,"%u",user);
        !           758:        smb_hfield(&msg,RECIPIENTEXT,strlen(str),str);
        !           759:        msg.idx.to=user;
        !           760:        msg.idx.from=0; }
        !           761: 
        !           762: smb_hfield(&msg,SUBJECT,strlen(fmsghdr.subj),fmsghdr.subj);
        !           763: remove_re(fmsghdr.subj);
        !           764: strlwr(fmsghdr.subj);
        !           765: msg.idx.subj=crc16(fmsghdr.subj);
        !           766: 
        !           767: length=filelength(file)-sizeof(fmsghdr_t);
        !           768: if((fbuf=(char *)LMALLOC(length+1))==NULL) {
        !           769:        printf("alloc error\r\n");
        !           770:        smb_freemsgmem(msg);
        !           771:        return; }
        !           772: if((sbody=(char *)LMALLOC((length+1)*2L))==NULL) {
        !           773:        printf("alloc error\n");
        !           774:        LFREE((char *)fbuf);
        !           775:        smb_freemsgmem(msg);
        !           776:        return; }
        !           777: if((stail=(char *)LMALLOC((length+1)*2L))==NULL) {
        !           778:        printf("alloc error\n");
        !           779:        LFREE((char *)fbuf);
        !           780:        LFREE((char *)sbody);
        !           781:        smb_freemsgmem(msg);
        !           782:        return; }
        !           783: lread(file,fbuf,length);
        !           784: 
        !           785: for(col=l=esc=done=bodylen=taillen=0,cr=1;l<length;l++) {
        !           786:        ch=fbuf[l];
        !           787:        if(ch==1 && cr) {       /* kludge line */
        !           788: 
        !           789:                if(!strncmp((char *)fbuf+l+1,"TOPT ",5))
        !           790:                        destaddr.point=atoi((char *)fbuf+l+6);
        !           791: 
        !           792:                else if(!strncmp((char *)fbuf+l+1,"FMPT ",5))
        !           793:                        origaddr.point=atoi((char *)fbuf+l+6);
        !           794: 
        !           795:                else if(!strncmp((char *)fbuf+l+1,"INTL ",5)) {
        !           796:                        faddr=atofaddr((char *)fbuf+l+6);
        !           797:                        destaddr.zone=faddr.zone;
        !           798:                        destaddr.net=faddr.net;
        !           799:                        destaddr.node=faddr.node;
        !           800:                        l+=6;
        !           801:                        while(l<length && fbuf[l]!=SP) l++;
        !           802:                        faddr=atofaddr((char *)fbuf+l+1);
        !           803:                        origaddr.zone=faddr.zone;
        !           804:                        origaddr.net=faddr.net;
        !           805:                        origaddr.node=faddr.node; }
        !           806: 
        !           807:                else if(!strncmp((char *)fbuf+l+1,"MSGID:",6)) {
        !           808:                        l+=7;
        !           809:                        while(l<length && fbuf[l]<=SP) l++;
        !           810:                        m=l;
        !           811:                        while(m<length && fbuf[m]!=CR) m++;
        !           812:                        while(m && fbuf[m-1]<=SP) m--;
        !           813:                        if(m>l)
        !           814:                                smb_hfield(&msg,FIDOMSGID,m-l,fbuf+l); }
        !           815: 
        !           816:                else if(!strncmp((char *)fbuf+l+1,"REPLY:",6)) {
        !           817:                        l+=7;
        !           818:                        while(l<length && fbuf[l]<=SP) l++;
        !           819:                        m=l;
        !           820:                        while(m<length && fbuf[m]!=CR) m++;
        !           821:                        while(m && fbuf[m-1]<=SP) m--;
        !           822:                        if(m>l)
        !           823:                                smb_hfield(&msg,FIDOREPLYID,m-l,fbuf+l); }
        !           824: 
        !           825:                else if(!strncmp((char *)fbuf+l+1,"FLAGS:",6)) {
        !           826:                        l+=7;
        !           827:                        while(l<length && fbuf[l]<=SP) l++;
        !           828:                        m=l;
        !           829:                        while(m<length && fbuf[m]!=CR) m++;
        !           830:                        while(m && fbuf[m-1]<=SP) m--;
        !           831:                        if(m>l)
        !           832:                                smb_hfield(&msg,FIDOFLAGS,m-l,fbuf+l); }
        !           833: 
        !           834:                else if(!strncmp((char *)fbuf+l+1,"PATH:",5)) {
        !           835:                        l+=6;
        !           836:                        while(l<length && fbuf[l]<=SP) l++;
        !           837:                        m=l;
        !           838:                        while(m<length && fbuf[m]!=CR) m++;
        !           839:                        while(m && fbuf[m-1]<=SP) m--;
        !           840:                        if(m>l)
        !           841:                                smb_hfield(&msg,FIDOPATH,m-l,fbuf+l); }
        !           842: 
        !           843:                else if(!strncmp((char *)fbuf+l+1,"PID:",4)) {
        !           844:                        l+=5;
        !           845:                        while(l<length && fbuf[l]<=SP) l++;
        !           846:                        m=l;
        !           847:                        while(m<length && fbuf[m]!=CR) m++;
        !           848:                        while(m && fbuf[m-1]<=SP) m--;
        !           849:                        if(m>l)
        !           850:                                smb_hfield(&msg,FIDOPID,m-l,fbuf+l); }
        !           851: 
        !           852:                else {          /* Unknown kludge line */
        !           853:                        while(l<length && fbuf[l]<=SP) l++;
        !           854:                        m=l;
        !           855:                        while(m<length && fbuf[m]!=CR) m++;
        !           856:                        while(m && fbuf[m-1]<=SP) m--;
        !           857:                        if(m>l)
        !           858:                                smb_hfield(&msg,FIDOCTRL,m-l,fbuf+l); }
        !           859: 
        !           860:                while(l<length && fbuf[l]!=CR) l++;
        !           861:                continue; }
        !           862: 
        !           863:        if(ch!=LF && ch!=0x8d) {        /* ignore LF and soft CRs */
        !           864:                if(cr && (!strncmp((char *)fbuf+l,"--- ",4)
        !           865:                        || !strncmp((char *)fbuf+l,"---\r",4)))
        !           866:                        done=1;                         /* tear line and down go into tail */
        !           867:                if(done && cr && !strncmp((char *)fbuf+l,"SEEN-BY:",8)) {
        !           868:                        l+=8;
        !           869:                        while(l<length && fbuf[l]<=SP) l++;
        !           870:                        m=l;
        !           871:                        while(m<length && fbuf[m]!=CR) m++;
        !           872:                        while(m && fbuf[m-1]<=SP) m--;
        !           873:                        if(m>l)
        !           874:                                smb_hfield(&msg,FIDOSEENBY,m-l,fbuf+l);
        !           875:                        while(l<length && fbuf[l]!=CR) l++;
        !           876:                        continue; }
        !           877:                if(done)
        !           878:                        stail[taillen++]=ch;
        !           879:                else
        !           880:                        sbody[bodylen++]=ch;
        !           881:                col++;
        !           882:                if(ch==CR) {
        !           883:                        cr=1;
        !           884:                        col=0;
        !           885:                        if(done)
        !           886:                                stail[taillen++]=LF;
        !           887:                        else
        !           888:                                sbody[bodylen++]=LF; }
        !           889:                else {
        !           890:                        cr=0;
        !           891:                        if(col==1 && !strncmp((char *)fbuf+l," * Origin: ",11)) {
        !           892:                                p=strchr((char *)fbuf+l+11,CR);          /* find carriage return */
        !           893:                                while(p && *p!='(') p--;     /* rewind to '(' */
        !           894:                                if(p)
        !           895:                                        origaddr=atofaddr(p+1);         /* get orig address */
        !           896:                                done=1; }
        !           897:                        if(done)
        !           898:                                continue;
        !           899: 
        !           900:                        if(ch==ESC) esc=1;              /* ANSI codes */
        !           901:                        if(ch==SP && col>40 && !esc) {  /* word wrap */
        !           902:                                for(m=l+1;m<length;m++)         /* find next space */
        !           903:                                        if(fbuf[m]<=SP)
        !           904:                                                break;
        !           905:                                if(m<length && m-l>80-col) {  /* if it's beyond the eol */
        !           906:                                        sbody[bodylen++]=CR;
        !           907:                                        sbody[bodylen++]=LF;
        !           908:                                        col=0; } }
        !           909:                        } } }
        !           910: 
        !           911: LFREE(fbuf);
        !           912: 
        !           913: if(bodylen>=2 && sbody[bodylen-2]==CR && sbody[bodylen-1]==LF)
        !           914:        bodylen-=2;                                             /* remove last CRLF if present */
        !           915: 
        !           916: if(status.max_crcs) {
        !           917:        for(l=0,crc=0xffffffff;l<bodylen;l++)
        !           918:                crc=ucrc32(sbody[l],crc);
        !           919:        crc=~crc;
        !           920: 
        !           921:        i=smb_addcrc(status.max_crcs,crc,10);
        !           922:        if(i) {
        !           923:                if(i==1)
        !           924:                        lprintf("Duplicate message\r\n");
        !           925:                else
        !           926:                        lprintf("smb_addcrc returned %d\r\n",i);
        !           927:                smb_freemsgmem(msg);
        !           928:                LFREE(sbody);
        !           929:                LFREE(stail);
        !           930:                return; } }
        !           931: 
        !           932: while(taillen && stail[taillen-1]<=SP) /* trim all garbage off the tail */
        !           933:        taillen--;
        !           934: 
        !           935: net=NET_FIDO;  /* Record origin address */
        !           936: smb_hfield(&msg,SENDERNETTYPE,sizeof(ushort),&net);
        !           937: smb_hfield(&msg,SENDERNETADDR,sizeof(fidoaddr_t),&origaddr);
        !           938: 
        !           939: if(subnum==INVALID_SUB) { /* No origin line means NetMail, so add dest addr */
        !           940:        smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(ushort),&net);
        !           941:        smb_hfield(&msg,RECIPIENTNETADDR,sizeof(fidoaddr_t),&destaddr); }
        !           942: 
        !           943: if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_LZH
        !           944:        && bodylen+2+taillen+2>=SDT_BLOCK_LEN && bodylen) {
        !           945:        if((outbuf=(char *)LMALLOC(bodylen*2))==NULL) {
        !           946:                printf("alloc error for lzh: %lu\n",bodylen*2);
        !           947:                smb_freemsgmem(msg);
        !           948:                LFREE(sbody);
        !           949:                LFREE(stail);
        !           950:                return; }
        !           951:        lzhlen=lzh_encode((uchar *)sbody,bodylen,(uchar *)outbuf);
        !           952:        if(lzhlen>1 &&
        !           953:                smb_datblocks(lzhlen+4+taillen+2)<smb_datblocks(bodylen+2+taillen+2)) {
        !           954:                bodylen=lzhlen;         /* Compressable */
        !           955:                l=bodylen+4;
        !           956:                LFREE(sbody);
        !           957:                lzh=1;
        !           958:                sbody=outbuf; }
        !           959:        else {                                  /* Uncompressable */
        !           960:                l=bodylen+2;
        !           961:                LFREE(outbuf); } }
        !           962: else
        !           963:        l=bodylen+2;
        !           964: 
        !           965: if(taillen)
        !           966:        l+=(taillen+2);
        !           967: 
        !           968: 
        !           969: if(status.attr&SMB_HYPERALLOC) {
        !           970:        if((i=smb_locksmbhdr(10))!=0) {
        !           971:                printf("smb_locksmbhdr returned %d\n",i);
        !           972:                smb_freemsgmem(msg);
        !           973:                LFREE(sbody);
        !           974:                LFREE(stail);
        !           975:                return; }
        !           976:        msg.hdr.offset=smb_hallocdat();
        !           977:        storage=SMB_HYPERALLOC; }
        !           978: else {
        !           979:        if(smb_open_da(10)) {
        !           980:                smb_freemsgmem(msg);
        !           981:                printf("error opening %s.SDA\r\n",smb_file);
        !           982:                LFREE(sbody);
        !           983:                LFREE(stail);
        !           984:                return; }
        !           985:        if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_FAST) {
        !           986:                msg.hdr.offset=smb_fallocdat(l,1);
        !           987:                storage=SMB_FASTALLOC; }
        !           988:        else {
        !           989:                msg.hdr.offset=smb_allocdat(l,1);
        !           990:                storage=SMB_SELFPACK; }
        !           991:        fclose(sda_fp); }
        !           992: 
        !           993: if(msg.hdr.offset && msg.hdr.offset<1L) {
        !           994:        smb_unlocksmbhdr();
        !           995:        smb_freemsgmem(msg);
        !           996:        LFREE(sbody);
        !           997:        LFREE(stail);
        !           998:        printf("error %ld allocating records\r\n",msg.hdr.offset);
        !           999:        return; }
        !          1000: fseek(sdt_fp,msg.hdr.offset,SEEK_SET);
        !          1001: if(lzh) {
        !          1002:        xlat=XLAT_LZH;
        !          1003:        fwrite(&xlat,2,1,sdt_fp); }
        !          1004: xlat=XLAT_NONE;
        !          1005: fwrite(&xlat,2,1,sdt_fp);
        !          1006: chunk=30000;
        !          1007: for(l=0;l<bodylen;l+=chunk) {
        !          1008:        if(l+chunk>bodylen)
        !          1009:                chunk=bodylen-l;
        !          1010:        fwrite(sbody+l,1,chunk,sdt_fp); }
        !          1011: if(taillen) {
        !          1012:        fwrite(&xlat,2,1,sdt_fp);
        !          1013:        fwrite(stail,1,taillen,sdt_fp); }
        !          1014: fflush(sdt_fp);
        !          1015: LFREE(sbody);
        !          1016: LFREE(stail);
        !          1017: 
        !          1018: if(status.attr&SMB_HYPERALLOC)
        !          1019:        smb_unlocksmbhdr();
        !          1020: 
        !          1021: if(lzh)
        !          1022:        bodylen+=2;
        !          1023: bodylen+=2;
        !          1024: smb_dfield(&msg,TEXT_BODY,bodylen);
        !          1025: if(taillen)
        !          1026:        smb_dfield(&msg,TEXT_TAIL,taillen+2);
        !          1027: 
        !          1028: smb_addmsghdr(&msg,&status,storage,10);
        !          1029: smb_freemsgmem(msg);
        !          1030: }
        !          1031: 
        !          1032: /****************************************************************/
        !          1033: /* Get zone and point from kludge lines in 'file' if they exist */
        !          1034: /****************************************************************/
        !          1035: void getzpt(int file, fmsghdr_t *hdr)
        !          1036: {
        !          1037:        char buf[0x1000];
        !          1038:        int i,len,cr=0;
        !          1039:        faddr_t faddr;
        !          1040: 
        !          1041: len=read(file,buf,0x1000);
        !          1042: for(i=0;i<len;i++) {
        !          1043:        if((!i || cr) && buf[i]==1) {   /* kludge */
        !          1044:                if(!strncmp(buf+i+1,"TOPT ",5))
        !          1045:                        hdr->destpoint=atoi(buf+i+6);
        !          1046:                else if(!strncmp(buf+i+1,"FMPT ",5))
        !          1047:                        hdr->origpoint=atoi(buf+i+6);
        !          1048:                else if(!strncmp(buf+i+1,"INTL ",5)) {
        !          1049:                        faddr=atofaddr(buf+i+6);
        !          1050:                        hdr->destzone=faddr.zone;
        !          1051:                        hdr->destnet=faddr.net;
        !          1052:                        hdr->destnode=faddr.node;
        !          1053:                        i+=6;
        !          1054:                        while(buf[i] && buf[i]!=SP) i++;
        !          1055:                        faddr=atofaddr(buf+i+1);
        !          1056:                        hdr->origzone=faddr.zone;
        !          1057:                        hdr->orignet=faddr.net;
        !          1058:                        hdr->orignode=faddr.node; }
        !          1059:                while(i<len && buf[i]!=CR) i++;
        !          1060:                cr=1;
        !          1061:                continue; }
        !          1062:        if(buf[i]==CR)
        !          1063:                cr=1;
        !          1064:        else
        !          1065:                cr=0; }
        !          1066: lseek(file,sizeof(fmsghdr_t),SEEK_SET);
        !          1067: }
        !          1068: 
        !          1069: /***********************************/
        !          1070: /* Synchronet/FidoNet Message util */
        !          1071: /***********************************/
        !          1072: int main(int argc, char **argv)
        !          1073: {
        !          1074:        char    ch,str[512],fname[256],touser[512],subj[512],path[512],sub_code[9]
        !          1075:                        ,*p,*tp,*sp,*buf,*outbuf,cr,tear,lzh;
        !          1076:        ushort  xlat;
        !          1077:        int     i,j,k,n,x,last,file,fmsg,nextmsg,g;
        !          1078:        ulong   files,msgfiles,echomail=0,netmail=0,exported=0,crc,
        !          1079:                        l,m,length,lastmsg,posts,msgs,exp;
        !          1080:        time_t  ptr,now,start,lastimport;
        !          1081:        read_cfg_text_t txt;
        !          1082:        struct  find_t ff;
        !          1083:        struct  tm tm,*tm_p;
        !          1084:        fmsghdr_t hdr;
        !          1085:        faddr_t addr,sys_faddr;
        !          1086:        post_t  HUGE16 *post;
        !          1087:        FILE    *stream,*fstream;
        !          1088:        smbstatus_t status;
        !          1089:        smbmsg_t msg;
        !          1090: 
        !          1091: lprintf("\nSynchronet <=> FidoNet Utility  Version %s  "
        !          1092:        "Developed by Rob Swindell\n",VER);
        !          1093: 
        !          1094: putenv("TZ=UCT0");
        !          1095: _fmode=O_BINARY;
        !          1096: setvbuf(stdout,NULL,_IONBF,0);
        !          1097: 
        !          1098: txt.openerr="\7\r\nError opening %s for read.\r\n";
        !          1099: txt.reading="\r\nReading %s...";
        !          1100: txt.readit="\rRead %s       ";
        !          1101: txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n";
        !          1102: txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n";
        !          1103: 
        !          1104: node_dir[0]=sub_code[0]=0;
        !          1105: for(i=1;i<argc;i++) {
        !          1106:        if(argv[i][0]=='/') {
        !          1107:                j=1;
        !          1108:                while(argv[i][j]) {
        !          1109:                        switch(toupper(argv[i][j])) {
        !          1110:                                case 'A':
        !          1111:                     misc|=ASCII_ONLY;
        !          1112:                     break;
        !          1113:                                case 'B':
        !          1114:                                        misc|=LOCAL_NETMAIL;
        !          1115:                                        break;
        !          1116:                                case 'C':
        !          1117:                     misc|=PURGE_ECHOMAIL;
        !          1118:                     break;
        !          1119:                                case 'D':
        !          1120:                     misc&=~DELETE_NETMAIL;
        !          1121:                     break;
        !          1122:                                case 'E':
        !          1123:                     misc&=~EXPORT_ECHOMAIL;
        !          1124:                     break;
        !          1125:                                case 'F':
        !          1126:                     misc|=IMPORT_LOCAL;
        !          1127:                     break;
        !          1128:                                case 'G':
        !          1129:                     misc|=IMPORT_NEW_ONLY;
        !          1130:                     break;
        !          1131:                                case 'H':
        !          1132:                     misc|=EXPORT_ALL;
        !          1133:                     break;
        !          1134:                                case 'I':
        !          1135:                     misc&=~IMPORT_ECHOMAIL;
        !          1136:                     break;
        !          1137:                 case 'J':
        !          1138:                     misc|=IGNORE_RECV;
        !          1139:                     break;
        !          1140:                                case 'K':
        !          1141:                     misc&=~KILL_ECHOMAIL;
        !          1142:                     break;
        !          1143:                 case 'L':
        !          1144:                     misc|=LOGFILE;
        !          1145:                     break;
        !          1146:                                case 'M':
        !          1147:                     misc|=IGNORE_MSGPTRS;
        !          1148:                     break;
        !          1149:                                case 'N':
        !          1150:                                        misc&=~IMPORT_NETMAIL;
        !          1151:                                        break;
        !          1152:                                case 'O':
        !          1153:                     misc|=IGNORE_ADDRESS;
        !          1154:                     break;
        !          1155:                                case 'P':
        !          1156:                                        misc|=IGNORE_POINT;
        !          1157:                                        break;
        !          1158:                                case 'Q':
        !          1159:                                        misc|=DONT_SET_RECV;
        !          1160:                                        break;
        !          1161:                                case 'R':
        !          1162:                     misc|=REPORT;
        !          1163:                     break;
        !          1164:                                case 'S':
        !          1165:                     misc|=IMPORT_PRIVATE;
        !          1166:                     break;
        !          1167:                                case 'T':
        !          1168:                     misc|=LEAVE_MSGPTRS;
        !          1169:                     break;
        !          1170:                 case 'U':
        !          1171:                     misc|=UPDATE_MSGPTRS;
        !          1172:                     misc&=~EXPORT_ECHOMAIL;
        !          1173:                     break;
        !          1174:                                case 'X':
        !          1175:                     misc&=~DELETE_ECHOMAIL;
        !          1176:                     break;
        !          1177:                 case 'Y':
        !          1178:                     misc|=UNKNOWN_NETMAIL;
        !          1179:                     break;
        !          1180:                                case 'Z':
        !          1181:                     misc|=IGNORE_ZONE;
        !          1182:                     break;
        !          1183: 
        !          1184:                                case '=':
        !          1185:                                        misc|=CONVERT_TEAR;
        !          1186:                                        break;
        !          1187:                                case '!':
        !          1188:                                        misc|=NOTIFY_RECEIPT;
        !          1189:                                        break;
        !          1190:                                case '2':
        !          1191:                                        startmsg=2;
        !          1192:                                        break;
        !          1193:                                default:
        !          1194:                                        printf("\nusage: sbbsfido [sbbsnode] [/switches] "
        !          1195:                                                "[sub_code]");
        !          1196:                                        printf("\nwhere: sbbsnode is the path for your "
        !          1197:                                                "NODE1 directory (example: c:\\sbbs\\node1)\n");
        !          1198:                                        printf("       sub_code is the internal code for a "
        !          1199:                                                "sub-board (default is ALL subs)\n");
        !          1200:                                        printf("\nvalid switches:\n\n");
        !          1201:                                        printf("n:do not import netmail               "
        !          1202:                                                   "i:do not import echomail\n");
        !          1203:                                        printf("p:ignore point in netmail address     "
        !          1204:                                                   "e:do not export echomail\n");
        !          1205:                                        printf("z:ignore zone in netmail address      "
        !          1206:                                                   "h:export all echomail (hub rescan)\n");
        !          1207:                                        printf("o:ignore entire netmail address       "
        !          1208:                                                   "m:ignore message pointers (export all)\n");
        !          1209:                                        printf("y:import netmail for unknown users    "
        !          1210:                                                   "u:update message pointers (export none)\n");
        !          1211:                                        printf("d:do not delete netmail after import  "
        !          1212:                                                   "x:do not delete echomail after import\n");
        !          1213:                                        printf("l:output to SBBSFIDO.LOG (verbose)    "
        !          1214:                                                   "k:do not kill echomail after export\n");
        !          1215:                                        printf("r:create report of import totals      "
        !          1216:                                                   "t:do not update message pointers\n");
        !          1217:                                        printf("a:export ASCII characters only        "
        !          1218:                                                   "c:delete all messages (echomail purge)\n");
        !          1219:                                        printf("j:ignore recieved bit on import       "
        !          1220:                                                   "s:import private override (strip pvt)\n");
        !          1221:                                        printf("q:do not set received bit on import   "
        !          1222:                            "g:import new echomail only\n");
        !          1223:                                        printf("b:import locally created netmail too  "
        !          1224:                            "f:import locally created echomail too\n");
        !          1225:                                        printf("=:change existing tear lines to ===   "
        !          1226:                            "2:export/import/delete starting at 2.MSG\n");
        !          1227:                                        printf("!:notify users of received echomail\n");
        !          1228:                                        exit(0); }
        !          1229:                        j++; } }
        !          1230:        else {
        !          1231:                if(strchr(argv[i],'\\') || argv[i][1]==':')
        !          1232:                        sprintf(node_dir,"%.40s",argv[i]);
        !          1233:                else
        !          1234:                        sprintf(sub_code,"%.8s",argv[i]); }  }
        !          1235: 
        !          1236: if(!node_dir[0]) {
        !          1237:        p=getenv("SBBSNODE");
        !          1238:        if(p==NULL) {
        !          1239:                printf("\7\nSBBSNODE environment variable not set.\n");
        !          1240:                exit(1); }
        !          1241:        strcpy(node_dir,p); }
        !          1242: 
        !          1243: strupr(node_dir);
        !          1244: 
        !          1245: if(node_dir[strlen(node_dir)-1]!='\\')
        !          1246:        strcat(node_dir,"\\");
        !          1247: 
        !          1248: read_node_cfg(txt);
        !          1249: if(ctrl_dir[0]=='.') {   /* Relative path */
        !          1250:        strcpy(str,ctrl_dir);
        !          1251:        sprintf(ctrl_dir,"%s%s",node_dir,str);
        !          1252:        if(_fullpath(str,ctrl_dir,40))
        !          1253:                strcpy(ctrl_dir,str); }
        !          1254: backslash(ctrl_dir);
        !          1255: 
        !          1256: read_main_cfg(txt);
        !          1257: if(data_dir[0]=='.') {   /* Relative path */
        !          1258:        strcpy(str,data_dir);
        !          1259:        sprintf(data_dir,"%s%s",node_dir,str);
        !          1260:        if(_fullpath(str,data_dir,40))
        !          1261:                strcpy(data_dir,str); }
        !          1262: backslash(data_dir);
        !          1263: if(text_dir[0]=='.') {   /* Relative path */
        !          1264:        strcpy(str,text_dir);
        !          1265:        sprintf(text_dir,"%s%s",node_dir,str);
        !          1266:        if(_fullpath(str,text_dir,40))
        !          1267:                strcpy(text_dir,str); }
        !          1268: backslash(text_dir);
        !          1269: read_msgs_cfg(txt);
        !          1270: 
        !          1271: if(total_faddrs<1) {
        !          1272:        sys_faddr.zone=sys_faddr.net=sys_faddr.node=1;
        !          1273:        sys_faddr.point=0; }
        !          1274: else
        !          1275:        sys_faddr=faddr[0];
        !          1276: 
        !          1277: 
        !          1278: if(misc&LOGFILE)
        !          1279:        if((fidologfile=fnopen(&i,"SBBSFIDO.LOG"
        !          1280:                ,O_WRONLY|O_APPEND|O_CREAT))==NULL) {
        !          1281:                lprintf("\7ERROR opening SBBSFIDO.LOG\r\n");
        !          1282:                exit(1); }
        !          1283: 
        !          1284: sprintf(str,"%s%s",ctrl_dir,"NODE.DAB");
        !          1285: if((nodefile=sopen(str,O_BINARY|O_RDWR,SH_DENYNO))==-1) {
        !          1286:        lprintf("\r\n\7Error opening %s\r\n",str);
        !          1287:     exit(1); }
        !          1288: 
        !          1289: if(misc&IMPORT_NETMAIL) {
        !          1290: 
        !          1291: lputs("\r\n\r\nScanning for Inbound NetMail...\r\n");
        !          1292: 
        !          1293: sprintf(smb_file,"%sMAIL",data_dir);
        !          1294: if((i=smb_open(10))!=0) {
        !          1295:        lprintf("Error %d opening %s\r\n",i,smb_file);
        !          1296:        exit(1); }
        !          1297: 
        !          1298: if(!filelength(fileno(shd_fp)))
        !          1299:        if((i=smb_create(mail_maxcrcs,MAX_SYSMAIL,mail_maxage,SMB_EMAIL,10))!=0) {
        !          1300:                lprintf("Error %d creating %s\r\n",i,smb_file);
        !          1301:                exit(1); }
        !          1302: 
        !          1303: if((i=smb_locksmbhdr(10))!=0) {
        !          1304:        lprintf("Error %d locking %s\r\n",i,smb_file);
        !          1305:        exit(1); }
        !          1306: if((i=smb_getstatus(&status))!=0) {
        !          1307:        lprintf("Error %d reading %s status header\r\n",i,smb_file);
        !          1308:        exit(1); }
        !          1309: smb_unlocksmbhdr();
        !          1310: 
        !          1311: sprintf(str,"%s*.MSG",netmail_dir);
        !          1312: 
        !          1313: for(last=findfirst(str,&ff,0);!last;last=findnext(&ff)) {
        !          1314:        sprintf(path,"%s%s",netmail_dir,ff.name);
        !          1315:        strupr(path);
        !          1316:        lprintf("\r%s    ",path);
        !          1317:        if((fmsg=nopen(path,O_RDWR))==-1) {
        !          1318:                lprintf("\7ERROR opening");
        !          1319:                continue; }
        !          1320:        if(filelength(fmsg)<sizeof(fmsghdr_t)) {
        !          1321:                lprintf("\7Invalid length of %u bytes\r\n",filelength(fmsg));
        !          1322:                close(fmsg);
        !          1323:                continue; }
        !          1324:        if(read(fmsg,&hdr,sizeof(fmsghdr_t))!=sizeof(fmsghdr_t)) {
        !          1325:                close(fmsg);
        !          1326:                lprintf("\7ERROR reading %u bytes"
        !          1327:                        ,sizeof(fmsghdr_t));
        !          1328:                continue; }
        !          1329:        if(hdr.attr&FIDO_ORPHAN) {
        !          1330:                close(fmsg);
        !          1331:                lprintf("Orphan (%s).\r\n",hdr.to);
        !          1332:                continue; }
        !          1333:        if(misc&IGNORE_ZONE)                            /* default to system's zone */
        !          1334:                hdr.destzone=hdr.origzone=sys_faddr.zone;
        !          1335:        if(misc&IGNORE_POINT)                           /* default to no point */
        !          1336:                hdr.destpoint=hdr.origpoint=0;
        !          1337:        getzpt(fmsg,&hdr);                                      /* use kludge if found */
        !          1338:        for(i=0;i<total_faddrs;i++)
        !          1339:                if(hdr.destzone==faddr[i].zone
        !          1340:                        && hdr.destnet==faddr[i].net
        !          1341:                        && hdr.destnode==faddr[i].node
        !          1342:                        && hdr.destpoint==faddr[i].point)
        !          1343:                        break;
        !          1344:        lprintf("%u:%u/%u.%u  "
        !          1345:                ,hdr.destzone,hdr.destnet,hdr.destnode,hdr.destpoint);
        !          1346:        if(misc&IGNORE_ADDRESS || i<total_faddrs) {
        !          1347:                if(!(misc&IGNORE_RECV) && hdr.attr&FIDO_RECV) {
        !          1348:             close(fmsg);
        !          1349:                        lputs("Already received.\r\n");
        !          1350:             continue; }
        !          1351:                if(hdr.attr&FIDO_LOCAL && !(misc&LOCAL_NETMAIL)) {
        !          1352:                        close(fmsg);
        !          1353:                        lputs("Created locally.\r\n");
        !          1354:                        continue; }
        !          1355:                i=atoi(hdr.to);
        !          1356:                if(!stricmp(hdr.to,"SYSOP"))  /* NetMail to "sysop" goes to #1 */
        !          1357:                        i=1;
        !          1358:                if(!i)
        !          1359:                        i=matchname(hdr.to);
        !          1360:                if(!i) {
        !          1361:                        if(misc&UNKNOWN_NETMAIL)        /* receive unknown user mail to 1 */
        !          1362:                                i=1;
        !          1363:                        else {
        !          1364:                                lprintf("\7ERROR unknown user '%s'\r\n",hdr.to);
        !          1365:                                hdr.attr|=FIDO_ORPHAN;
        !          1366:                                lseek(fmsg,0L,SEEK_SET);
        !          1367:                                write(fmsg,&hdr,sizeof(fmsghdr_t));
        !          1368:                                close(fmsg);
        !          1369:                                continue; } }
        !          1370:                lprintf("%s\r\n",hdr.to);
        !          1371: 
        !          1372:                /*********************/
        !          1373:                /* Importing NetMail */
        !          1374:                /*********************/
        !          1375: 
        !          1376:                fmsgtosmsg(fmsg,hdr,status,i,INVALID_SUB);
        !          1377: 
        !          1378:                addr.zone=hdr.origzone;
        !          1379:                addr.net=hdr.orignet;
        !          1380:                addr.node=hdr.orignode;
        !          1381:                addr.point=hdr.origpoint;
        !          1382:                sprintf(str,"\7\1n\1hSBBSFIDO: \1m%.36s \1n\1msent you NetMail from "
        !          1383:                        "\1h%s\1n\r\n"
        !          1384:                        ,hdr.from,faddrtoa(addr));
        !          1385:                putsmsg(i,str);
        !          1386: 
        !          1387:                if(hdr.attr&FIDO_FILE) {        /* File attachment */
        !          1388:                        strcpy(subj,hdr.subj);
        !          1389:                        tp=subj;
        !          1390:                        while(1) {
        !          1391:                                p=strchr(tp,SP);
        !          1392:                                if(p) *p=0;
        !          1393:                                sp=strrchr(tp,'/');              /* sp is slash pointer */
        !          1394:                                if(!sp) sp=strrchr(tp,'\\');
        !          1395:                                if(sp) tp=sp+1;
        !          1396:                                sprintf(str,"%s%s",fidofile_dir,tp);
        !          1397:                                sprintf(tmp,"%sFILE\\%04u.IN",data_dir,i);
        !          1398:                                mkdir(tmp);
        !          1399:                                strcat(tmp,"\\");
        !          1400:                                strcat(tmp,tp);
        !          1401:                                mv(str,tmp,0);
        !          1402:                                if(!p)
        !          1403:                                        break;
        !          1404:                                tp=p+1; } }
        !          1405:                netmail++;
        !          1406: 
        !          1407:                /***************************/
        !          1408:                /* Updating message header */
        !          1409:                /***************************/
        !          1410:                if(!(misc&DONT_SET_RECV)) {
        !          1411:                        hdr.attr|=FIDO_RECV;
        !          1412:                        lseek(fmsg,0L,SEEK_SET);
        !          1413:                        write(fmsg,&hdr,sizeof(fmsghdr_t)); }
        !          1414: 
        !          1415:                /**************************************/
        !          1416:                /* Delete source netmail if specified */
        !          1417:                /**************************************/
        !          1418:                close(fmsg);
        !          1419:                if(misc&DELETE_NETMAIL)
        !          1420:                        remove(path); }
        !          1421:        else
        !          1422:                close(fmsg); }
        !          1423: smb_close(); }
        !          1424: 
        !          1425: 
        !          1426: if(misc&IMPORT_ECHOMAIL) {
        !          1427: 
        !          1428: start=time(NULL);
        !          1429: 
        !          1430: lputs("\r\n\r\nScanning for Inbound EchoMail...\r\n");
        !          1431: 
        !          1432: sprintf(path,"%sSBBSFIDO.DAB",data_dir);
        !          1433: if((file=nopen(path,O_RDWR|O_CREAT))==-1)
        !          1434:        lastimport=0L;
        !          1435: else {
        !          1436:        read(file,&lastimport,4);
        !          1437:        now=time(NULL);
        !          1438:        lseek(file,0L,SEEK_SET);
        !          1439:        write(file,&now,4);
        !          1440:        close(file); }
        !          1441: 
        !          1442: for(g=files=0;g<total_grps;g++)
        !          1443: for(i=0;i<total_subs;i++)
        !          1444:        if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) {
        !          1445:                if(sub_code[0] && stricmp(sub_code,sub[i]->code))
        !          1446:                        continue;
        !          1447:                if(!sub[i]->echopath[0])
        !          1448:                        sprintf(sub[i]->echopath,"%s%s\\",echomail_dir,sub[i]->code);
        !          1449:                if(files) {
        !          1450:                        lputs("\r\n");
        !          1451:                        files=0; }
        !          1452:                lprintf("\r\n%-15.15s %s\r\n"
        !          1453:                        ,grp[sub[i]->grp]->sname,sub[i]->lname);
        !          1454: 
        !          1455:                sprintf(path,"%s*.MSG",sub[i]->echopath);
        !          1456:                l=findfirst(path,&ff,0);
        !          1457:                if(startmsg==2 && !strcmp(ff.name,"1.MSG"))
        !          1458:                        l=findnext(&ff);
        !          1459:                if(l)
        !          1460:                        continue;
        !          1461:                lprintf("Counting %s",path);
        !          1462:                msgfiles=0;
        !          1463:                while(!l) {
        !          1464:                        memset(&tm,0,sizeof(tm));
        !          1465:                        tm.tm_mday=ff.wr_date&31;
        !          1466:                        tm.tm_mon=(ff.wr_date>>5)&15;
        !          1467:                        tm.tm_year=80+((ff.wr_date>>9)&127);
        !          1468:                        tm.tm_hour=(ff.wr_time>>11)&31;
        !          1469:                        tm.tm_min=(ff.wr_time>>5)&63;
        !          1470:                        tm.tm_sec=(ff.wr_time&0x1f)<<1;
        !          1471:                        if(isdigit(ff.name[0])
        !          1472:                                && !(startmsg==2 && !strcmp(ff.name,"1.MSG"))
        !          1473:                                && !(misc&IMPORT_NEW_ONLY && mktime(&tm)<=lastimport))
        !          1474:                                msgfiles++;             /* msgfiles= messages to import */
        !          1475:                        l=findnext(&ff); }
        !          1476: 
        !          1477:                lprintf("\r\n%u messages.\r\n",msgfiles);
        !          1478:                if(!msgfiles)                           /* no messages, so continue. */
        !          1479:                        continue;
        !          1480: 
        !          1481:                sprintf(smb_file,"%s%s",sub[i]->data_dir,sub[i]->code);
        !          1482:                if((j=smb_open(10))!=0) {
        !          1483:                        lprintf("Error %d opening %s\r\n",j,smb_file);
        !          1484:                        continue; }
        !          1485:                if(!filelength(fileno(shd_fp)))
        !          1486:                        if((j=smb_create(sub[i]->maxcrcs,sub[i]->maxmsgs
        !          1487:                                ,sub[i]->maxage
        !          1488:                                ,sub[i]->misc&SUB_HYPER ? SMB_HYPERALLOC:0
        !          1489:                                ,10))!=0) {
        !          1490:                                lprintf("Error %d creating %s\r\n",j,smb_file);
        !          1491:                                smb_close();
        !          1492:                                continue; }
        !          1493: 
        !          1494:                if((j=smb_locksmbhdr(10))!=0) {
        !          1495:                        lprintf("Error %d locking SMB header\r\n",j);
        !          1496:                        smb_close();
        !          1497:                        continue; }
        !          1498:                if((j=smb_getstatus(&status))!=0) {
        !          1499:                        lprintf("Error %d reading SMB header\r\n",j);
        !          1500:                        smb_close();
        !          1501:                        continue; }
        !          1502:                smb_unlocksmbhdr();
        !          1503: 
        !          1504:                for(l=startmsg;l<0x8000 && msgfiles;l++) {
        !          1505:                        sprintf(path,"%s%lu.MSG",sub[i]->echopath,l);
        !          1506:                        if(findfirst(path,&ff,0))       /* doesn't exist */
        !          1507:                                continue;                               /* was break */
        !          1508:                        tm.tm_mday=ff.wr_date&31;
        !          1509:                        tm.tm_mon=(ff.wr_date>>5)&15;
        !          1510:                        tm.tm_year=80+((ff.wr_date>>9)&127);
        !          1511:                        tm.tm_hour=(ff.wr_time>>11)&31;
        !          1512:                        tm.tm_min=(ff.wr_time>>5)&63;
        !          1513:                        tm.tm_sec=(ff.wr_time&0x1f)<<1;
        !          1514:                        if(misc&IMPORT_NEW_ONLY && mktime(&tm)<=lastimport)
        !          1515:                                continue;
        !          1516:                        if(startmsg==2 && !strcmp(ff.name,"1.MSG"))
        !          1517:                                continue;
        !          1518:                        msgfiles--;             /* so we only look for as many as are there */
        !          1519:                        strupr(path);
        !          1520:                        lprintf("\r%s    ",path);
        !          1521:                        files++;
        !          1522:                        if((fmsg=nopen(path,O_RDWR))==-1) {
        !          1523:                                lprintf("\7ERROR opening\r\n");
        !          1524:                                continue; }
        !          1525:                        if(filelength(fmsg)<sizeof(fmsghdr_t)) {
        !          1526:                                lprintf("\7Invalid length of %u bytes\r\n",filelength(fmsg));
        !          1527:                                close(fmsg);
        !          1528:                                continue; }
        !          1529:                        if(read(fmsg,&hdr,sizeof(fmsghdr_t))!=sizeof(fmsghdr_t)) {
        !          1530:                                close(fmsg);
        !          1531:                                lprintf("\7ERROR reading %u bytes\r\n"
        !          1532:                                        ,sizeof(fmsghdr_t));
        !          1533:                                continue; }
        !          1534:                        if(misc&IMPORT_LOCAL || !(hdr.attr&FIDO_LOCAL)) {
        !          1535: 
        !          1536:                                if(!(misc&IGNORE_RECV) && hdr.attr&FIDO_RECV) {
        !          1537:                                        close(fmsg);
        !          1538:                                        lputs("Already received.\r\n");
        !          1539:                                        continue; }
        !          1540: 
        !          1541:                                if(hdr.attr&FIDO_SENT) {
        !          1542:                                        close(fmsg);
        !          1543:                                        lputs("Sent.");
        !          1544:                                        if(hdr.attr&FIDO_KILLSENT)
        !          1545:                                                if(!remove(path))
        !          1546:                                                        lputs(" Killed.");
        !          1547:                                        lputs("\r\n");
        !          1548:                                        continue; }
        !          1549: 
        !          1550:                                if(hdr.attr&FIDO_PRIVATE && !(sub[i]->misc&SUB_PRIV)) {
        !          1551:                                        if(misc&IMPORT_PRIVATE)
        !          1552:                                                hdr.attr&=~FIDO_PRIVATE;
        !          1553:                                        else {
        !          1554:                                                close(fmsg);
        !          1555:                                                lputs("Private posts disallowed.\r\n");
        !          1556:                                                continue; } }
        !          1557: 
        !          1558:                                if(!(hdr.attr&FIDO_PRIVATE) && sub[i]->misc&SUB_PONLY)
        !          1559:                                        hdr.attr|=MSG_PRIVATE;
        !          1560: 
        !          1561:                                /**********************/
        !          1562:                                /* Importing EchoMail */
        !          1563:                                /**********************/
        !          1564: 
        !          1565:                                fmsgtosmsg(fmsg,hdr,status,0,i);
        !          1566: 
        !          1567:                                echomail++;
        !          1568: 
        !          1569:                                /* Updating message header */
        !          1570:                                if(!(misc&DONT_SET_RECV)) {
        !          1571:                                        hdr.attr|=FIDO_RECV;
        !          1572:                                        lseek(fmsg,0L,SEEK_SET);
        !          1573:                                        write(fmsg,&hdr,sizeof(fmsghdr_t)); }
        !          1574: 
        !          1575:                                close(fmsg);
        !          1576:                                if(misc&NOTIFY_RECEIPT && (m=matchname(hdr.to))!=0) {
        !          1577:                                        sprintf(str
        !          1578:                                        ,"\7\1n\1hSBBSFIDO: \1m%.36s \1n\1msent you EchoMail on "
        !          1579:                                                "\1h%s \1n\1m%s\1n\r\n"
        !          1580:                                                ,hdr.from,grp[sub[i]->grp]->sname,sub[i]->sname);
        !          1581:                                        putsmsg(m,str); }
        !          1582: 
        !          1583:                                /* Delete source EchoMail if specified */
        !          1584:                                if(misc&DELETE_ECHOMAIL)
        !          1585:                                        remove(path); }
        !          1586:                        else
        !          1587:                                close(fmsg); }
        !          1588:                smb_close();
        !          1589:                }
        !          1590: 
        !          1591: now=time(NULL);
        !          1592: if(now-start)
        !          1593:        lprintf("\r\nImported %lu EchoMail messages in %lu seconds "
        !          1594:                "(%lu messages/second).\r\n"
        !          1595:                ,echomail,now-start,echomail/(now-start));
        !          1596: }
        !          1597: 
        !          1598: if(misc&EXPORT_ECHOMAIL) {
        !          1599: 
        !          1600: start=time(NULL);
        !          1601: 
        !          1602: lputs("\r\n\r\nScanning for Outbound EchoMail...\r\n");
        !          1603: 
        !          1604: for(g=files=0;g<total_grps;g++)
        !          1605: for(i=0;i<total_subs;i++)
        !          1606:        if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) {
        !          1607:                if(sub_code[0] && stricmp(sub_code,sub[i]->code))
        !          1608:             continue;
        !          1609:                if(!sub[i]->echopath[0])
        !          1610:             sprintf(sub[i]->echopath,"%s%s\\",echomail_dir,sub[i]->code);
        !          1611:                if(files) {
        !          1612:                        lputs("\r\n");
        !          1613:                        files=0; }
        !          1614:                lprintf("\r\n%-15.15s %s\r\n"
        !          1615:                        ,grp[sub[i]->grp]->sname,sub[i]->lname);
        !          1616:                ptr=0;
        !          1617:                if(!(misc&IGNORE_MSGPTRS)) {
        !          1618:                        sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code);
        !          1619:                        if((file=nopen(str,O_RDONLY))!=-1) {
        !          1620:                                read(file,&ptr,sizeof(time_t));
        !          1621:                                close(file); } }
        !          1622: 
        !          1623:                msgs=getlastmsg(i,&lastmsg,0);
        !          1624:                if(!msgs || (!(misc&IGNORE_MSGPTRS) && ptr>=lastmsg)) {
        !          1625:                        if(ptr>lastmsg && !(misc&LEAVE_MSGPTRS)) {      /* fix ptr */
        !          1626:                 sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code);
        !          1627:                                if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
        !          1628:                                        lprintf("\7ERROR opening/creating %s",str);
        !          1629:                                else {
        !          1630:                                        write(file,&lastmsg,4);
        !          1631:                                        close(file); } }
        !          1632:                        continue; }
        !          1633:                nextmsg=startmsg;
        !          1634: 
        !          1635:                sprintf(smb_file,"%s%s"
        !          1636:                        ,sub[i]->data_dir,sub[i]->code);
        !          1637:                if((j=smb_open(10))!=0) {
        !          1638:                        lprintf("Error %d opening %s\r\n",j,smb_file);
        !          1639:                        continue; }
        !          1640: 
        !          1641:                post=NULL;
        !          1642:                posts=loadmsgs(&post,ptr);
        !          1643: 
        !          1644:                if(!posts)      { /* no new messages */
        !          1645:                        smb_close();
        !          1646:                        if(post)
        !          1647:                                FREE(post);
        !          1648:                        continue; }
        !          1649: 
        !          1650:                for(m=exp=0;m<posts;m++) {
        !          1651:                        printf("\rScanning: %lu of %lu     "
        !          1652:                                ,m+1,posts);
        !          1653: 
        !          1654:                        msg.idx.offset=post[m].offset;
        !          1655:                        if((k=smb_lockmsghdr(msg,10))!=0) {
        !          1656:                                lprintf("ERR_LOCK %s %d\r\n",smb_file,k);
        !          1657:                                continue; }
        !          1658:                        k=smb_getmsghdr(&msg);
        !          1659:                        if(k || msg.hdr.number!=post[m].number) {
        !          1660:                                smb_unlockmsghdr(msg);
        !          1661:                                smb_freemsgmem(msg);
        !          1662: 
        !          1663:                                msg.hdr.number=post[m].number;
        !          1664:                                if((k=smb_getmsgidx(&msg))!=0) {
        !          1665:                                        lprintf("ERR_READ %s %d\r\n",smb_file,k);
        !          1666:                                        continue; }
        !          1667:                                if((k=smb_lockmsghdr(msg,10))!=0) {
        !          1668:                                        lprintf("ERR_LOCK %s %d\r\n",smb_file,k);
        !          1669:                                        continue; }
        !          1670:                                if((k=smb_getmsghdr(&msg))!=0) {
        !          1671:                                        smb_unlockmsghdr(msg);
        !          1672:                                        lprintf("ERR_READ %s %d\r\n",smb_file,k);
        !          1673:                                        continue; } }
        !          1674: 
        !          1675:                        if((!(misc&EXPORT_ALL) && msg.from_net.type==NET_FIDO)
        !          1676:                                || !strnicmp(msg.subj,"NE:",3)) {   /* no echo */
        !          1677:                                smb_unlockmsghdr(msg);
        !          1678:                                smb_freemsgmem(msg);
        !          1679:                                continue; }  /* From a Fido node, ignore it */
        !          1680: 
        !          1681:                        if(msg.from_net.type && msg.from_net.type!=NET_FIDO
        !          1682:                                && !(sub[i]->misc&SUB_GATE)) {
        !          1683:                                smb_unlockmsghdr(msg);
        !          1684:                                smb_freemsgmem(msg);
        !          1685:                                continue; }
        !          1686: 
        !          1687:                        for(j=nextmsg;j;j++) {
        !          1688:                                sprintf(fname,"%s%u.MSG",sub[i]->echopath,j);
        !          1689:                                if(!fexist(fname))
        !          1690:                                        break; }
        !          1691:                        if(!j) {
        !          1692:                                lputs("\7EchoMail dir full!");
        !          1693:                                smb_unlockmsghdr(msg);
        !          1694:                                smb_freemsgmem(msg);
        !          1695:                                continue; }
        !          1696:                        nextmsg=j+1;
        !          1697:                        strupr(fname);
        !          1698:                        if((fmsg=nopen(fname,O_WRONLY|O_CREAT))==-1) {
        !          1699:                                smb_unlockmsghdr(msg);
        !          1700:                                smb_freemsgmem(msg);
        !          1701:                                lprintf("\7ERROR creating %s\r\n",fname);
        !          1702:                                continue; }
        !          1703:                        if((fstream=fdopen(fmsg,"wb"))==NULL) {
        !          1704:                                close(fmsg);
        !          1705:                                smb_unlockmsghdr(msg);
        !          1706:                 smb_freemsgmem(msg);
        !          1707:                                lprintf("\7ERROR fdopen %s\r\n",fname);
        !          1708:                                continue; }
        !          1709:                        setvbuf(fstream,NULL,_IOFBF,2048);
        !          1710: 
        !          1711:                        files++;
        !          1712: 
        !          1713:                        memset(&hdr,0,sizeof(fmsghdr_t));        /* Zero the header */
        !          1714:                        hdr.origzone=sub[i]->faddr.zone;
        !          1715:                        hdr.orignet=sub[i]->faddr.net;
        !          1716:                        hdr.orignode=sub[i]->faddr.node;
        !          1717:                        hdr.origpoint=sub[i]->faddr.point;
        !          1718: 
        !          1719:                        hdr.attr=FIDO_LOCAL;
        !          1720:                        if(misc&KILL_ECHOMAIL)
        !          1721:                                hdr.attr|=FIDO_KILLSENT;
        !          1722:                        if(msg.hdr.attr&MSG_PRIVATE)
        !          1723:                                hdr.attr|=FIDO_PRIVATE;
        !          1724: 
        !          1725:                        sprintf(hdr.from,"%.35s",msg.from);
        !          1726: 
        !          1727:                        tm_p=gmtime((time_t *)&msg.hdr.when_written.time);
        !          1728:                        sprintf(hdr.time,"%02u %3.3s %02u  %02u:%02u:%02u"
        !          1729:                                ,tm_p->tm_mday,mon[tm_p->tm_mon],tm_p->tm_year%100
        !          1730:                                ,tm_p->tm_hour,tm_p->tm_min,tm_p->tm_sec);
        !          1731: 
        !          1732:                        sprintf(hdr.to,"%.35s",msg.to);
        !          1733: 
        !          1734:                        sprintf(hdr.subj,"%.71s",msg.subj);
        !          1735: 
        !          1736:                        fwrite(&hdr,sizeof(fmsghdr_t),1,fstream);
        !          1737: 
        !          1738:                        for(j=0;j<msg.hdr.total_dfields;j++) {
        !          1739: 
        !          1740:                                if(msg.dfield[j].type!=TEXT_BODY
        !          1741:                                        && msg.dfield[j].type!=TEXT_TAIL)
        !          1742:                                        continue;                                       /* skip non-text data fields */
        !          1743: 
        !          1744:                                if(msg.dfield[j].length<3)              /* need at least 3 bytes */
        !          1745:                                        continue;
        !          1746: 
        !          1747:                                fseek(sdt_fp,msg.hdr.offset+msg.dfield[j].offset,SEEK_SET);
        !          1748: 
        !          1749:                                lzh=0;
        !          1750:                                fread(&xlat,2,1,sdt_fp);
        !          1751:                                if(xlat==XLAT_LZH) {
        !          1752:                                        lzh=1;
        !          1753:                                        fread(&xlat,2,1,sdt_fp); }
        !          1754:                                if(xlat!=XLAT_NONE)     /* no other translations supported */
        !          1755:                                        continue;
        !          1756: 
        !          1757:                                length=msg.dfield[j].length-2;
        !          1758:                                if(lzh)
        !          1759:                                        length-=2;
        !          1760: 
        !          1761:                                if((buf=LMALLOC(length))==NULL) {
        !          1762:                                        lprintf("Error allocating %lu bytes\r\n",length);
        !          1763:                                        continue; }
        !          1764: 
        !          1765:                                fread(buf,length,1,sdt_fp);
        !          1766: 
        !          1767:                                if(lzh) {
        !          1768:                                        l=*(long *)buf;
        !          1769:                                        if((outbuf=LMALLOC(l))==NULL) {
        !          1770:                                                lprintf("Error allocationg %lu for lzh\r\n",l);
        !          1771:                                                LFREE(buf);
        !          1772:                                                continue; }
        !          1773:                                        length=lzh_decode(buf,length,outbuf);
        !          1774:                                        LFREE(buf);
        !          1775:                                        buf=outbuf; }
        !          1776: 
        !          1777:                                tear=0;
        !          1778:                                for(l=0,cr=1;l<length;l++) {
        !          1779:                                        if(buf[l]==1) { /* Ctrl-A, so skip it and the next char */
        !          1780:                         l++;
        !          1781:                                                continue; }
        !          1782:                                        if(buf[l]==LF || buf[l]==0)  /* Ignore line feeds */
        !          1783:                                                continue;
        !          1784:                                        if(cr) {
        !          1785:                                                if(l+3<length && buf[l]=='-' && buf[l+1]=='-'
        !          1786:                                                        && buf[l+2]=='-'
        !          1787:                                                        && (buf[l+3]==SP || buf[l+3]==CR)) {
        !          1788:                                                        if(misc&CONVERT_TEAR)   /* Convert to === */
        !          1789:                                                                buf[l]=buf[l+1]=buf[l+2]='=';
        !          1790:                                                        else
        !          1791:                                                                tear=1; }
        !          1792:                                                else if(l+10<length
        !          1793:                                                        && !strncmp(buf+l," * Origin: ",11))
        !          1794:                                                        buf[l+1]='#'; } /* Convert * Origin into # Origin */
        !          1795: 
        !          1796:                                        if(buf[l]==CR)
        !          1797:                                                cr=1;
        !          1798:                                        else
        !          1799:                                                cr=0;
        !          1800:                                        if(sub[i]->misc&SUB_ASCII || misc&ASCII_ONLY) {
        !          1801:                                                if(buf[l]<SP && buf[l]!=CR) /* Ctrl ascii */
        !          1802:                                                        buf[l]='.';             /* converted to '.' */
        !          1803:                                                if((uchar)buf[l]>0x7f)          /* extended ASCII */
        !          1804:                                                        buf[l]='*'; }           /* converted to '*' */
        !          1805:                                        fputc(buf[l],fstream); }
        !          1806:                                fprintf(fstream,"\r\n");
        !          1807:                                LFREE(buf); }
        !          1808: 
        !          1809:                        if(!(sub[i]->misc&SUB_NOTAG)) {
        !          1810:                                if(!tear)       /* No previous tear line */
        !          1811:                                        fprintf(fstream,"--- Synchronet+SBBSfido v%s\r\n"
        !          1812:                                                ,VER);  /* so add ours */
        !          1813:                                fprintf(fstream," * Origin: %s (%s)\r\n"
        !          1814:                                        ,sub[i]->origline[0] ? sub[i]->origline : origline
        !          1815:                                        ,faddrtoa(sub[i]->faddr)); }
        !          1816: 
        !          1817:                        fputc(0,fstream);       /* Null terminator */
        !          1818:                        fclose(fstream);
        !          1819:                        exported++;
        !          1820:                        exp++;
        !          1821:                        printf("Exported: %lu of %lu",exp,exported);
        !          1822:                        smb_unlockmsghdr(msg);
        !          1823:                        smb_freemsgmem(msg); }
        !          1824: 
        !          1825:                smb_close();
        !          1826:                FREE(post);
        !          1827: 
        !          1828:                /***********************/
        !          1829:                /* Update FIDO_PTR.DAB */
        !          1830:                /***********************/
        !          1831:                if(!(misc&LEAVE_MSGPTRS) && lastmsg>ptr) {
        !          1832:                        sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code);
        !          1833:                        if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
        !          1834:                                lprintf("\7ERROR opening/creating %s",str);
        !          1835:                        else {
        !          1836:                                write(file,&lastmsg,4);
        !          1837:                                close(file); } } }
        !          1838: 
        !          1839: now=time(NULL);
        !          1840: if(now-start)
        !          1841:        lprintf("\r\nExported %lu EchoMail messages in %lu seconds "
        !          1842:                "(%lu messages/second).\r\n"
        !          1843:                ,exported,now-start,exported/(now-start));
        !          1844: 
        !          1845: }
        !          1846: 
        !          1847: if(misc&UPDATE_MSGPTRS) {
        !          1848: 
        !          1849: lputs("\r\n\r\nUpdating Message Pointers to Last Posted Message...\r\n");
        !          1850: 
        !          1851: for(g=0;g<total_grps;g++)
        !          1852: for(i=0;i<total_subs;i++)
        !          1853:        if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) {
        !          1854:                lprintf("\r\n%-15.15s %s\r\n"
        !          1855:                        ,grp[sub[i]->grp]->sname,sub[i]->lname);
        !          1856:                getlastmsg(i,&l,0);
        !          1857:                sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code);
        !          1858:                if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
        !          1859:                        lprintf("\7ERROR opening/creating %s",str);
        !          1860:                else {
        !          1861:                        write(file,&l,sizeof(time_t));
        !          1862:                        close(file); } } }
        !          1863: 
        !          1864: if(misc&PURGE_ECHOMAIL) {
        !          1865: 
        !          1866: lputs("\r\n\r\nPurging EchoMail...\r\n");
        !          1867: 
        !          1868: for(g=0;g<total_grps;g++)
        !          1869: for(i=0;i<total_subs;i++)
        !          1870:        if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) {
        !          1871:                if(sub_code[0] && stricmp(sub_code,sub[i]->code))
        !          1872:             continue;
        !          1873:                if(!sub[i]->echopath[0])
        !          1874:             sprintf(sub[i]->echopath,"%s%s\\",echomail_dir,sub[i]->code);
        !          1875:                sprintf(str,"%s*.MSG",sub[i]->echopath);
        !          1876:                last=findfirst(str,&ff,0);
        !          1877:                while(!last) {
        !          1878:                        sprintf(str,"%s%s",sub[i]->echopath,ff.name);
        !          1879:                        if(startmsg!=2 || strcmp(ff.name,"1.MSG")) {
        !          1880:                                lprintf("\r\nDeleting %s",str);
        !          1881:                                remove(str); }
        !          1882:                        last=findnext(&ff); } } }
        !          1883: 
        !          1884: 
        !          1885: if(misc&(IMPORT_NETMAIL|IMPORT_ECHOMAIL) && misc&REPORT) {
        !          1886:        sprintf(str,"%sSBBSFIDO.MSG",text_dir);
        !          1887:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
        !          1888:                lprintf("Error opening %s\r\n",str);
        !          1889:                exit(1); }
        !          1890:        sprintf(fname,"\1c\1h               "
        !          1891:                "���������������������������������������������������\r\n");
        !          1892:        sprintf(path,"\1c\1h               "
        !          1893:                "���������������������������������������������������\r\n");
        !          1894:        write(file,fname,strlen(fname));
        !          1895:        sprintf(str,"               \1n\1k\0016"
        !          1896:                " Last FidoNet Transfer on %.24s \1n\r\n",ctime(&start));
        !          1897:        write(file,str,strlen(str));
        !          1898:        write(file,path,strlen(path));
        !          1899:        write(file,fname,strlen(fname));
        !          1900:        sprintf(subj,"Imported %lu EchoMail and %lu NetMail Messages"
        !          1901:                ,echomail,netmail);
        !          1902:        sprintf(str,"               \1n\1k\0016 %-50.50s\1n\r\n",subj);
        !          1903:        write(file,str,strlen(str));
        !          1904:        write(file,path,strlen(path));
        !          1905:        close(file); }
        !          1906: 
        !          1907: return(0);
        !          1908: }
        !          1909: 

unix.superglobalmegacorp.com

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