Annotation of sbbs/sbbs2/addfiles/addfiles.c, revision 1.1.1.1

1.1       root        1: /* ADDFILES.C */
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: /* Program to add files to a Synchronet file database */
                      6: 
                      7: #include "sbbs.h"
                      8: 
                      9: #define ADDFILES_VER "2.23"
                     10: 
                     11: char tmp[256];
                     12: char *crlf="\r\n";
                     13: 
                     14: #ifdef __TURBOC__
                     15: unsigned _stklen=16000;
                     16: #else
                     17: unsigned _stacksize=16000;
                     18: #endif
                     19: 
                     20: int cur_altpath=0;
                     21: 
                     22: long files=0,removed=0,mode=0;
                     23: 
                     24: #define DEL_LIST       (1L<<0)
                     25: #define NO_EXTEND      (1L<<1)
                     26: #define FILE_DATE      (1L<<2)
                     27: #define TODAYS_DATE (1L<<3)
                     28: #define FILE_ID        (1L<<4)
                     29: #define NO_UPDATE      (1L<<5)
                     30: #define NO_NEWDATE     (1L<<6)
                     31: #define ASCII_ONLY     (1L<<7)
                     32: #define UL_STATS       (1L<<8)
                     33: #define ULDATE_ONLY (1L<<9)
                     34: #define KEEP_DESC      (1L<<10)
                     35: #define AUTO_ADD       (1L<<11)
                     36: #define SEARCH_DIR     (1L<<12)
                     37: #define SYNC_LIST      (1L<<13)
                     38: #define KEEP_SPACE     (1L<<14)
                     39: 
                     40: #ifndef __FLAT__
                     41: /****************************************************************************/
                     42: /* This function reads files that are potentially larger than 32k.             */
                     43: /* Up to one megabyte of data can be read with each call.                   */
                     44: /****************************************************************************/
                     45: long lread(int file, char HUGE16 *buf,long bytes)
                     46: {
                     47:        long count;
                     48: 
                     49: for(count=bytes;count>32767;count-=32767,buf+=32767)
                     50:        if(read(file,(char *)buf,32767)!=32767)
                     51:                return(-1L);
                     52: if(read(file,(char *)buf,(int)count)!=count)
                     53:        return(-1L);
                     54: return(bytes);
                     55: }
                     56: 
                     57: /****************************************************************************/
                     58: /* This function writes files that are potentially larger than 32767 bytes  */
                     59: /* Up to one megabytes of data can be written with each call.                          */
                     60: /****************************************************************************/
                     61: long lwrite(int file, char HUGE16 *buf, long bytes)
                     62: {
                     63: 
                     64:        long count;
                     65: 
                     66: for(count=bytes;count>32767;count-=32767,buf+=32767)
                     67:        if(write(file,(char *)buf,32767)!=32767)
                     68:                return(-1L);
                     69: if(write(file,(char *)buf,(int)count)!=count)
                     70:        return(-1L);
                     71: return(bytes);
                     72: }
                     73: #endif
                     74: 
                     75: long lputs(char FAR16 *str)
                     76: {
                     77:     char tmp[256];
                     78:     int i,j,k;
                     79: 
                     80: j=strlen(str);
                     81: for(i=k=0;i<j;i++)      /* remove CRs */
                     82:     if(str[i]==CR && str[i+1]==LF)
                     83:         continue;
                     84:     else
                     85:         tmp[k++]=str[i];
                     86: tmp[k]=0;
                     87: return(fputs(tmp,stdout));
                     88: }
                     89: 
                     90: /****************************************************************************/
                     91: /* Returns string for 2 digit hex+ numbers up to 575                                           */
                     92: /****************************************************************************/
                     93: char *hexplus(uint num, char *str)
                     94: {
                     95: sprintf(str,"%03x",num);
                     96: str[0]=num/0x100 ? 'f'+(num/0x10)-0xf : str[1];
                     97: str[1]=str[2];
                     98: str[2]=0;
                     99: return(str);
                    100: }
                    101: 
                    102: 
                    103: /****************************************************************************/
                    104: /* Places into 'strout', 'strin' starting at 'start' and ending at                     */
                    105: /* 'start'+'length'                                                                                                            */
                    106: /****************************************************************************/
                    107: void putrec(char *strout,int start,int length,char *strin)
                    108: {
                    109:        int i=0,j;
                    110: 
                    111: j=strlen(strin);
                    112: while(i<j && i<length)
                    113:        strout[start++]=strin[i++];
                    114: while(i++<length)
                    115:        strout[start++]=ETX;
                    116: }
                    117: 
                    118: /****************************************************************************/
                    119: /* Performs printf() through local assembly routines                        */
                    120: /* Called from everywhere                                                   */
                    121: /****************************************************************************/
                    122: int lprintf(char *fmat, ...)
                    123: {
                    124:        va_list argptr;
                    125:        char sbuf[256];
                    126:        int chcount;
                    127: 
                    128: va_start(argptr,fmat);
                    129: chcount=vsprintf(sbuf,fmat,argptr);
                    130: va_end(argptr);
                    131: lputs(sbuf);
                    132: return(chcount);
                    133: }
                    134: 
                    135: /****************************************************************************/
                    136: /* Truncates white-space chars off end of 'str' and terminates at first tab */
                    137: /****************************************************************************/
                    138: void truncsp(char *str)
                    139: {
                    140:        int c;
                    141: 
                    142: str[strcspn(str,"\t")]=0;
                    143: c=strlen(str);
                    144: while(c && (uchar)str[c-1]<=SP) c--;
                    145: str[c]=0;
                    146: }
                    147: 
                    148: /****************************************************************************/
                    149: /* Puts a backslash on path strings                                                                            */
                    150: /****************************************************************************/
                    151: void backslash(char *str)
                    152: {
                    153:     int i;
                    154: 
                    155: i=strlen(str);
                    156: if(i && str[i-1]!='\\') {
                    157:     str[i]='\\'; str[i+1]=0; }
                    158: }
                    159: 
                    160: /****************************************************************************/
                    161: /* Checks the disk drive for the existence of a file. Returns 1 if it       */
                    162: /* exists, 0 if it doesn't.                                                 */
                    163: /****************************************************************************/
                    164: char fexist(char *filespec)
                    165: {
                    166:        struct find_t f;
                    167:        uint i;
                    168: 
                    169: i=_dos_findfirst(filespec,_A_NORMAL,&f);
                    170: #ifdef __WATCOMC__
                    171: _dos_findclose(&f);
                    172: #endif
                    173: if(!i)
                    174:     return(1);
                    175: return(0);
                    176: }
                    177: 
                    178: /****************************************************************************/
                    179: /* Returns the time/date of the file in 'filespec' in time_t (unix) format  */
                    180: /****************************************************************************/
                    181: long fdate(char *filespec)
                    182: {
                    183:        int     file;
                    184:        ushort  fd,ft;
                    185:        struct  tm t;
                    186: 
                    187: if((file=nopen(filespec,O_RDONLY))==-1)
                    188:        return(0);
                    189: _dos_getftime(file,&fd,&ft);
                    190: close(file);
                    191: memset(&t,0,sizeof(t));
                    192: t.tm_year=((fd&0xfe00)>>9)+80;
                    193: t.tm_mon=((fd&0x01e0)>>5)-1;
                    194: t.tm_mday=fd&0x1f;
                    195: t.tm_hour=(ft&0xf800)>>11;
                    196: t.tm_min=(ft&0x07e0)>>5;
                    197: t.tm_sec=(ft&0x001f)<<1;
                    198: return(mktime(&t));
                    199: }
                    200: 
                    201: /*****************************************************************************/
                    202: /* Returns command line generated from instr with %c replacments             */
                    203: /*****************************************************************************/
                    204: char *cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
                    205: {
                    206:     static char cmd[128];
                    207:     char str[256];
                    208:     int i,j,len;
                    209: 
                    210: len=strlen(instr);
                    211: for(i=j=0;i<len && j<128;i++) {
                    212:     if(instr[i]=='%') {
                    213:         i++;
                    214:         cmd[j]=0;
                    215:         switch(toupper(instr[i])) {
                    216:             case 'F':   /* File path */
                    217:                 strcat(cmd,fpath);
                    218:                 break;
                    219:             case 'G':   /* Temp directory */
                    220:                 if(temp_dir[0]!='\\' && temp_dir[1]!=':')
                    221:                     strcat(cmd,node_dir);
                    222:                 strcat(cmd,temp_dir);
                    223:                 break;
                    224:             case 'N':   /* Node Directory (same as SBBSNODE environment var) */
                    225:                 strcat(cmd,node_dir);
                    226:                 break;
                    227:             case 'S':   /* File Spec */
                    228:                 strcat(cmd,fspec);
                    229:                 break;
                    230:             case '!':   /* EXEC Directory */
                    231:                 if(exec_dir[0]!='\\' && exec_dir[1]!=':')
                    232:                     strcat(cmd,node_dir);
                    233:                 strcat(cmd,exec_dir);
                    234:                 break;
                    235:             case '#':   /* Node number (same as SBBSNNUM environment var) */
                    236:                 sprintf(str,"%d",node_num);
                    237:                 strcat(cmd,str);
                    238:                 break;
                    239:             case '%':   /* %% for percent sign */
                    240:                 strcat(cmd,"%");
                    241:                 break;
                    242:             default:    /* unknown specification */
                    243:                 break; }
                    244:         j=strlen(cmd); }
                    245:     else
                    246:         cmd[j++]=instr[i]; }
                    247: cmd[j]=0;
                    248: 
                    249: return(cmd);
                    250: }
                    251: 
                    252: 
                    253: /****************************************************************************/
                    254: /* Converts unix time format (long - time_t) into a char str MM/DD/YY          */
                    255: /****************************************************************************/
                    256: char *unixtodstr(time_t unix, char *str)
                    257: {
                    258:        struct tm *t;
                    259: 
                    260: if(!unix)
                    261:        strcpy(str,"00/00/00");
                    262: else {
                    263:        t=gmtime(&unix);
                    264:        sprintf(str,"%02u/%02u/%02u",t->tm_mon+1,t->tm_mday
                    265:                ,t->tm_year); }
                    266: return(str);
                    267: }
                    268: 
                    269: /****************************************************************************/
                    270: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN    */
                    271: /* number of times if the attempted file is already open or denying access     */
                    272: /* for some other reason.      All files are opened in BINARY mode.                    */
                    273: /****************************************************************************/
                    274: int nopen(char *str, int access)
                    275: {
                    276:        char logstr[256];
                    277:        int file,share,count=0;
                    278: 
                    279: if(access==O_RDONLY) share=SH_DENYWR;
                    280:        else share=SH_DENYRW;
                    281: while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1)
                    282:        && errno==EACCES && count++<LOOP_NOPEN);
                    283: if(file==-1 && errno==EACCES)
                    284:        lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7");
                    285: return(file);
                    286: }
                    287: 
                    288: /****************************************************************************/
                    289: /* This function performs an nopen, but returns a file stream with a buffer */
                    290: /* allocated.                                                                                                                          */
                    291: /****************************************************************************/
                    292: FILE *fnopen(int *file, char *str, int access)
                    293: {
                    294:        char mode[128];
                    295:        FILE *stream;
                    296: 
                    297: if(access&O_WRONLY) access|=O_RDWR;    /* fdopen can't open WRONLY */
                    298: 
                    299: if(((*file)=nopen(str,access))==-1)
                    300:        return(NULL);
                    301: 
                    302: if(access&O_APPEND) {
                    303:        if(access&(O_RDONLY|O_RDWR))
                    304:                strcpy(mode,"a+");
                    305:        else
                    306:                strcpy(mode,"a"); }
                    307: else {
                    308:        if(access&(O_WRONLY|O_RDWR))
                    309:                strcpy(mode,"r+");
                    310:        else
                    311:                strcpy(mode,"r"); }
                    312: stream=fdopen((*file),mode);
                    313: if(stream==NULL) {
                    314:        close(*file);
                    315:        return(NULL); }
                    316: setvbuf(stream,NULL,_IOFBF,16*1024);
                    317: return(stream);
                    318: }
                    319: 
                    320: void allocfail(uint size)
                    321: {
                    322: lprintf("\7Error allocating %u bytes of memory.\r\n",size);
                    323: bail(1);
                    324: }
                    325: 
                    326: void bail(int code)
                    327: {
                    328: exit(code);
                    329: }
                    330: 
                    331: /****************************************************************************/
                    332: /* Returns the length of the file in 'filespec'                             */
                    333: /****************************************************************************/
                    334: long flength(char *filespec)
                    335: {
                    336:        struct find_t f;
                    337:        uint i;
                    338: 
                    339: i=_dos_findfirst(filespec,_A_NORMAL,&f);
                    340: #ifdef __WATCOMC__
                    341: _dos_findclose(&f);
                    342: #endif
                    343: if(!i)
                    344:        return(f.size);
                    345: return(-1L);
                    346: }
                    347: 
                    348: /****************************************************************************/
                    349: /* Turns FILE.EXT into FILE    .EXT                                         */
                    350: /* Called from upload                                                       */
                    351: /****************************************************************************/
                    352: char *padfname(char *filename, char *str)
                    353: {
                    354:     char c,d;
                    355: 
                    356: for(c=0;c<8;c++)
                    357:     if(filename[c]=='.' || !filename[c]) break;
                    358:     else str[c]=filename[c];
                    359: d=c;
                    360: if(filename[c]=='.') c++;
                    361: while(d<8)
                    362:     str[d++]=SP;
                    363: str[d++]='.';
                    364: while(d<12)
                    365:     if(!filename[c]) break;
                    366:     else str[d++]=filename[c++];
                    367: while(d<12)
                    368:     str[d++]=SP;
                    369: str[d]=0;
                    370: return(str);
                    371: }
                    372: 
                    373: /****************************************************************************/
                    374: /* Turns FILE    .EXT into FILE.EXT                                         */
                    375: /****************************************************************************/
                    376: char *unpadfname(char *filename, char *str)
                    377: {
                    378:     char c,d;
                    379: 
                    380: for(c=0,d=0;c<strlen(filename);c++)
                    381:     if(filename[c]!=SP) str[d++]=filename[c];
                    382: str[d]=0;
                    383: return(str);
                    384: }
                    385: 
                    386: /****************************************************************************/
                    387: /* Checks  directory data file for 'filename' (must be padded). If found,   */
                    388: /* it returns the 1, else returns 0.                                        */
                    389: /* Called from upload and bulkupload                                        */
                    390: /****************************************************************************/
                    391: char findfile(uint dirnum, char *filename)
                    392: {
                    393:        char str[256],c,fname[128],HUGE16 *ixbbuf;
                    394:     int file;
                    395:     ulong length,l;
                    396: 
                    397: strcpy(fname,filename);
                    398: for(c=8;c<12;c++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    399:     fname[c]=fname[c+1];
                    400: sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code);
                    401: if((file=nopen(str,O_RDONLY))==-1) return(0);
                    402: length=filelength(file);
                    403: if(!length) {
                    404:     close(file);
                    405:     return(0); }
                    406: if((ixbbuf=(char *)MALLOC(length))==NULL) {
                    407:     close(file);
                    408:        printf("ERR_ALLOC %s %lu\n",str,length);
                    409:     return(0); }
                    410: if(lread(file,ixbbuf,length)!=length) {
                    411:     close(file);
                    412:        FREE((char *)ixbbuf);
                    413:     return(0); }
                    414: close(file);
                    415: for(l=0;l<length;l+=F_IXBSIZE) {
                    416:     for(c=0;c<11;c++)
                    417:         if(fname[c]!=ixbbuf[l+c]) break;
                    418:     if(c==11) break; }
                    419: FREE((char *)ixbbuf);
                    420: if(l<length)
                    421:     return(1);
                    422: return(0);
                    423: }
                    424: 
                    425: 
                    426: /****************************************************************************/
                    427: /* Adds the data for struct filedat to the directory's data base.           */
                    428: /* changes the .datoffset field only                                        */
                    429: /****************************************************************************/
                    430: char addfiledat(file_t *f)
                    431: {
                    432:        char str[256],fdat[F_LEN+1],fname[128],idx[128],c,HUGE16 *ixbbuf;
                    433:     int i,file;
                    434:     ulong length,l,uldate;
                    435: 
                    436: /************************/
                    437: /* Add data to DAT File */
                    438: /************************/
                    439: sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code);
                    440: if((file=nopen(str,O_RDWR|O_CREAT))==-1) {
                    441:        printf("ERROR opening %s\n",str);
                    442:        return(0); }
                    443: length=filelength(file);
                    444: if(length==0L)
                    445:     l=0L;
                    446: else {
                    447:     if(length%F_LEN) {
                    448:         close(file);
                    449:                printf("ERR_LEN %s %lu\n",str,length);
                    450:                return(0); }
                    451:     for(l=0;l<length;l+=F_LEN) {    /* Find empty slot */
                    452:         lseek(file,l,SEEK_SET);
                    453:         read(file,&c,1);
                    454:         if(c==ETX) break; } }
                    455: putrec(fdat,F_CDT,7,ultoa(f->cdt,tmp,10));
                    456: putrec(fdat,F_CDT+7,2,crlf);
                    457: putrec(fdat,F_DESC,LEN_FDESC,f->desc);
                    458: putrec(fdat,F_DESC+LEN_FDESC,2,crlf);
                    459: putrec(fdat,F_ULER,LEN_ALIAS+5,f->uler);
                    460: putrec(fdat,F_ULER+LEN_ALIAS+5,2,crlf);
                    461: putrec(fdat,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10));
                    462: putrec(fdat,F_TIMESDLED+5,2,crlf);
                    463: putrec(fdat,F_OPENCOUNT,3,itoa(f->opencount,tmp,10));
                    464: putrec(fdat,F_OPENCOUNT+3,2,crlf);
                    465: fdat[F_MISC]=f->misc+SP;
                    466: putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp));
                    467: putrec(fdat,F_ALTPATH+2,2,crlf);
                    468: f->datoffset=l;
                    469: idx[0]=l&0xff;          /* Get offset within DAT file for IXB file */
                    470: idx[1]=(l>>8)&0xff;
                    471: idx[2]=(l>>16)&0xff;
                    472: lseek(file,l,SEEK_SET);
                    473: if(write(file,fdat,F_LEN)!=F_LEN) {
                    474:     close(file);
                    475:        return(0); }
                    476: length=filelength(file);
                    477: close(file);
                    478: if(length%F_LEN)
                    479:        printf("ERR_LEN %s %lu\n",str,length);
                    480: 
                    481: /*******************************************/
                    482: /* Update last upload date/time stamp file */
                    483: /*******************************************/
                    484: sprintf(str,"%s%s.DAB",dir[f->dir]->data_dir,dir[f->dir]->code);
                    485: if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
                    486:        printf("ERR_OPEN %s\r\n",str);
                    487: else {
                    488:        uldate=time(NULL);
                    489:        write(file,&uldate,4);
                    490:     close(file); }
                    491: 
                    492: /************************/
                    493: /* Add data to IXB File */
                    494: /************************/
                    495: strcpy(fname,f->name);
                    496: for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    497:     fname[i]=fname[i+1];
                    498: sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code);
                    499: if((file=nopen(str,O_RDWR|O_CREAT))==-1) {
                    500:        printf("ERR_OPEN %s\n",str);
                    501:        return(0); }
                    502: length=filelength(file);
                    503: if(length) {    /* IXB file isn't empty */
                    504:     if(length%F_IXBSIZE) {
                    505:         close(file);
                    506:                printf("ERR_LEN %s %lu\n",str,length);
                    507:                return(0); }
                    508:        if((ixbbuf=(char *)MALLOC(length))==NULL) {
                    509:         close(file);
                    510:                printf("ERR_ALLOC %s %lu\n",str,length);
                    511:                return(0); }
                    512:        if(lread(file,ixbbuf,length)!=length) {
                    513:         close(file);
                    514:                printf("ERR_READ %s %lu\n",str,length);
                    515:                FREE((char *)ixbbuf);
                    516:                return(0); }
                    517: /************************************************/
                    518: /* Sort by Name or Date, Assending or Decending */
                    519: /************************************************/
                    520:     if(dir[f->dir]->sort==SORT_NAME_A || dir[f->dir]->sort==SORT_NAME_D) {
                    521:         for(l=0;l<length;l+=F_IXBSIZE) {
                    522:             for(i=0;i<12 && fname[i]==ixbbuf[l+i];i++);
                    523:                        if(i==12) {     /* file already in directory index */
                    524:                 close(file);
                    525:                                printf("ERR_CHK %s\n",fname);
                    526:                                FREE((char *)ixbbuf);
                    527:                                return(0); }
                    528:             if(dir[f->dir]->sort==SORT_NAME_A && fname[i]<ixbbuf[l+i])
                    529:                 break;
                    530:             if(dir[f->dir]->sort==SORT_NAME_D && fname[i]>ixbbuf[l+i])
                    531:                 break; } }
                    532:     else {  /* sort by date */
                    533:         for(l=0;l<length;l+=F_IXBSIZE) {
                    534:             uldate=(ixbbuf[l+15]|((long)ixbbuf[l+16]<<8)
                    535:                 |((long)ixbbuf[l+17]<<16)|((long)ixbbuf[l+18]<<24));
                    536:             if(dir[f->dir]->sort==SORT_DATE_A && f->dateuled>uldate)
                    537:                 break;
                    538:             if(dir[f->dir]->sort==SORT_DATE_D && f->dateuled<uldate)
                    539:                 break; } }
                    540:     lseek(file,l,SEEK_SET);
                    541:     if(write(file,fname,11)!=11) {  /* Write filename to IXB file */
                    542:         close(file);
                    543:                FREE((char *)ixbbuf);
                    544:                return(0); }
                    545:     if(write(file,idx,3)!=3) {  /* Write DAT offset into IXB file */
                    546:         close(file);
                    547:                FREE((char *)ixbbuf);
                    548:                return(0); }
                    549:     write(file,&f->dateuled,sizeof(time_t));
                    550:     write(file,&f->datedled,4);              /* Write 0 for datedled */
                    551:        if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */
                    552:         close(file);
                    553:                FREE((char *)ixbbuf);
                    554:                return(0); }
                    555:        FREE((char *)ixbbuf); }
                    556: else {              /* IXB file is empty... No files */
                    557:     if(write(file,fname,11)!=11) {  /* Write filename it IXB file */
                    558:         close(file);
                    559:                return(0); }
                    560:     if(write(file,idx,3)!=3) {  /* Write DAT offset into IXB file */
                    561:         close(file);
                    562:                return(0); }
                    563:     write(file,&f->dateuled,sizeof(time_t));
                    564:     write(file,&f->datedled,4); }
                    565: length=filelength(file);
                    566: close(file);
                    567: if(length%F_IXBSIZE)
                    568:        printf("ERR_LEN %s %lu\n",str,length);
                    569: return(1);
                    570: }
                    571: 
                    572: void putextdesc(uint dirnum, ulong datoffset, char *ext)
                    573: {
                    574:        char str[256],nulbuf[512];
                    575:        int file;
                    576: 
                    577: sprintf(str,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code);
                    578: if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
                    579:        return;
                    580: lseek(file,0L,SEEK_END);
                    581: while(filelength(file)<(datoffset/F_LEN)*512L)
                    582:     write(file,nulbuf,512);
                    583: lseek(file,(datoffset/F_LEN)*512L,SEEK_SET);
                    584: write(file,ext,512);
                    585: close(file);
                    586: }
                    587: 
                    588: /****************************************************************************/
                    589: /* Gets file data from dircode.IXB file                                                                                */
                    590: /* Need fields .name and .dir filled.                                       */
                    591: /* only fills .offset, .dateuled, and .datedled                             */
                    592: /****************************************************************************/
                    593: void getfileixb(file_t *f)
                    594: {
                    595:        uchar HUGE16 *ixbbuf,str[256],fname[128];
                    596:        int file;
                    597:        ulong l,length;
                    598: 
                    599: sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code);
                    600: if((file=nopen(str,O_RDONLY))==-1) {
                    601:        printf("ERR_OPEN %s\n",str);
                    602:        return; }
                    603: length=filelength(file);
                    604: if(length%F_IXBSIZE) {
                    605:        close(file);
                    606:        printf("ERR_LEN %s\n");
                    607:        return; }
                    608: if((ixbbuf=(uchar HUGE16 *)MALLOC(length))==NULL) {
                    609:        close(file);
                    610:        printf("ERR_ALLOC %s\n",str);
                    611:        return; }
                    612: if(lread(file,ixbbuf,length)!=length) {
                    613:        close(file);
                    614:        FREE((char *)ixbbuf);
                    615:        printf("ERR_READ %s\n",str);
                    616:        return; }
                    617: close(file);
                    618: strcpy(fname,f->name);
                    619: for(l=8;l<12;l++)      /* Turn FILENAME.EXT into FILENAMEEXT */
                    620:        fname[l]=fname[l+1];
                    621: for(l=0;l<length;l+=F_IXBSIZE) {
                    622:        sprintf(str,"%11.11s",ixbbuf+l);
                    623:        if(!strcmp(str,fname))
                    624:                break; }
                    625: if(l>=length) {
                    626:        printf("getfileixb: ERR_CHK %s\n",fname);
                    627:        FREE((char *)ixbbuf);
                    628:        return; }
                    629: l+=11;
                    630: f->datoffset=ixbbuf[l]|((long)ixbbuf[l+1]<<8)|((long)ixbbuf[l+2]<<16);
                    631: f->dateuled=ixbbuf[l+3]|((long)ixbbuf[l+4]<<8)
                    632:        |((long)ixbbuf[l+5]<<16)|((long)ixbbuf[l+6]<<24);
                    633: f->datedled=ixbbuf[l+7]|((long)ixbbuf[l+8]<<8)
                    634:        |((long)ixbbuf[l+9]<<16)|((long)ixbbuf[l+10]<<24);
                    635: FREE((char *)ixbbuf);
                    636: }
                    637: 
                    638: /****************************************************************************/
                    639: /* Puts filedata into DIR_code.DAT file                                     */
                    640: /* Called from removefiles                                                  */
                    641: /****************************************************************************/
                    642: void putfiledat(file_t f)
                    643: {
                    644:     char buf[F_LEN+1],str[256];
                    645:     int file;
                    646:     long length;
                    647: 
                    648: putrec(buf,F_CDT,7,ultoa(f.cdt,tmp,10));
                    649: putrec(buf,F_CDT+7,2,crlf);
                    650: putrec(buf,F_DESC,LEN_FDESC,f.desc);
                    651: putrec(buf,F_DESC+LEN_FDESC,2,crlf);
                    652: putrec(buf,F_ULER,LEN_ALIAS+5,f.uler);
                    653: putrec(buf,F_ULER+LEN_ALIAS+5,2,crlf);
                    654: putrec(buf,F_TIMESDLED,5,itoa(f.timesdled,tmp,10));
                    655: putrec(buf,F_TIMESDLED+5,2,crlf);
                    656: putrec(buf,F_OPENCOUNT,3,itoa(f.opencount,tmp,10));
                    657: putrec(buf,F_OPENCOUNT+3,2,crlf);
                    658: buf[F_MISC]=f.misc+SP;
                    659: putrec(buf,F_ALTPATH,2,hexplus(f.altpath,tmp));
                    660: putrec(buf,F_ALTPATH+2,2,crlf);
                    661: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code);
                    662: if((file=nopen(str,O_WRONLY))==-1) {
                    663:        printf("ERR_OPEN %s\n",str);
                    664:     return; }
                    665: length=filelength(file);
                    666: if(length%F_LEN) {
                    667:     close(file);
                    668:        printf("ERR_LEN %s\n",str);
                    669:     return; }
                    670: if(f.datoffset>length) {
                    671:     close(file);
                    672:        printf("ERR_LEN %s\n",str);
                    673:     return; }
                    674: lseek(file,f.datoffset,SEEK_SET);
                    675: if(write(file,buf,F_LEN)!=F_LEN) {
                    676:     close(file);
                    677:        printf("ERR_WRITE %s\n",str);
                    678:     return; }
                    679: length=filelength(file);
                    680: close(file);
                    681: if(length%F_LEN)
                    682:        printf("ERR_LEN %s\n",str);
                    683: }
                    684: 
                    685: /****************************************************************************/
                    686: /* Update the upload date for the file 'f'                                  */
                    687: /****************************************************************************/
                    688: void update_uldate(file_t f)
                    689: {
                    690:        char str[256],fname[128];
                    691:        int i,file;
                    692:        long l,length;
                    693: 
                    694: /*******************/
                    695: /* Update IXB File */
                    696: /*******************/
                    697: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code);
                    698: if((file=nopen(str,O_RDWR))==-1) {
                    699:        printf("ERR_OPEN %s\n",str);
                    700:     return; }
                    701: length=filelength(file);
                    702: if(length%F_IXBSIZE) {
                    703:     close(file);
                    704:        printf("ERR_LEN %s\n",str);
                    705:     return; }
                    706: strcpy(fname,f.name);
                    707: for(i=8;i<12;i++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                    708:     fname[i]=fname[i+1];
                    709: for(l=0;l<length;l+=F_IXBSIZE) {
                    710:     read(file,str,F_IXBSIZE);      /* Look for the filename in the IXB file */
                    711:     str[11]=0;
                    712:     if(!strcmp(fname,str)) break; }
                    713: if(l>=length) {
                    714:     close(file);
                    715:        printf("ERR_CHK %s\n",f.name);
                    716:     return; }
                    717: lseek(file,l+14,SEEK_SET);
                    718: write(file,&f.dateuled,4);     /* Write the current time stamp for datedled */
                    719: close(file);
                    720: 
                    721: /*******************************************/
                    722: /* Update last upload date/time stamp file */
                    723: /*******************************************/
                    724: sprintf(str,"%s%s.DAB",dir[f.dir]->data_dir,dir[f.dir]->code);
                    725: if((file=nopen(str,O_WRONLY|O_CREAT))==-1)
                    726:        printf("ERR_OPEN %s\r\n",str);
                    727: else {
                    728:        write(file,&f.dateuled,4);
                    729:     close(file); }
                    730: 
                    731: }
                    732: 
                    733: 
                    734: void strip_ctrl(char *str)
                    735: {
                    736:        char tmp[1024];
                    737:        int i,j,k;
                    738: 
                    739: k=strlen(str);
                    740: for(i=j=0;i<k;i++)
                    741:        if(j && str[i]==SP && tmp[j-1]==SP && (mode&KEEP_SPACE))
                    742:                tmp[j++]=str[i];
                    743:        else if(j && str[i]<=SP && tmp[j-1]==SP)
                    744:                continue;
                    745:        else if(i && !isalnum(str[i]) && str[i]==str[i-1])
                    746:                continue;
                    747:        else if((uchar)str[i]>=SP)
                    748:                tmp[j++]=str[i];
                    749:        else if(str[i]==TAB || (str[i]==CR && str[i+1]==LF))
                    750:                tmp[j++]=SP;
                    751: tmp[j]=0;
                    752: strcpy(str,tmp);
                    753: }
                    754: 
                    755: 
                    756: void strip_exascii(char *str)
                    757: {
                    758:        char tmp[1024];
                    759:        int i,j,k;
                    760: 
                    761: k=strlen(str);
                    762: for(i=j=0;i<k;i++)
                    763:        if(!(str[i]&0x80))
                    764:                tmp[j++]=str[i];
                    765: tmp[j]=0;
                    766: strcpy(str,tmp);
                    767: }
                    768: 
                    769: /****************************************************************************/
                    770: /* Updates dstst.dab file                                                                                                      */
                    771: /****************************************************************************/
                    772: void updatestats(ulong size)
                    773: {
                    774:     char str[256];
                    775:     int i,file;
                    776:        ulong l;
                    777: 
                    778: sprintf(str,"%sDSTS.DAB",ctrl_dir);
                    779: if((file=nopen(str,O_RDWR))==-1) {
                    780:        printf("ERR_OPEN %s\n",str);
                    781:        return; }
                    782: lseek(file,20L,SEEK_SET);      /* Skip timestamp, logons and logons today */
                    783: read(file,&l,4);                       /* Uploads today                 */
                    784: l++;
                    785: lseek(file,-4L,SEEK_CUR);
                    786: write(file,&l,4);
                    787: read(file,&l,4);                       /* Upload bytes today    */
                    788: l+=size;
                    789: lseek(file,-4L,SEEK_CUR);
                    790: write(file,&l,4);
                    791: close(file);
                    792: }
                    793: 
                    794: void addlist(char *inpath, file_t f, char dskip, char sskip)
                    795: {
                    796:        uchar str[256],fname[256],listpath[256],filepath[256]
                    797:                ,curline[256],nextline[256],*p,exist,ext[1024],tmpext[513];
                    798:        int i,file;
                    799:        long l;
                    800:        FILE *stream;
                    801:        struct find_t ff;
                    802: 
                    803: if(mode&SEARCH_DIR) {
                    804:        strcpy(str,cur_altpath ? altpath[cur_altpath-1] : dir[f.dir]->path);
                    805:        if(str[0]=='.') {
                    806:                sprintf(tmp,"%s%s",node_dir,str);
                    807:                strcpy(str,tmp); }
                    808:        strcat(str,"*.*");
                    809:        printf("Searching %s\n\n",str);
                    810:        for(i=_dos_findfirst(str,0,&ff);!i;i=_dos_findnext(&ff)) {
                    811:                strupr(ff.name);
                    812:                sprintf(filepath,"%s%s",cur_altpath ? altpath[cur_altpath-1]
                    813:             : dir[f.dir]->path,ff.name);
                    814:         if(filepath[0]=='.') { /* relative path */
                    815:             sprintf(tmp,"%s%s",node_dir,filepath);
                    816:             strcpy(filepath,tmp); }
                    817:                f.misc=0;
                    818:                f.desc[0]=0;
                    819:                f.cdt=flength(filepath);
                    820:                padfname(ff.name,f.name);
                    821:                printf("%s  %10lu  %s\n"
                    822:                        ,f.name,f.cdt,unixtodstr(fdate(filepath),str));
                    823:                exist=findfile(f.dir,f.name);
                    824:                if(exist) {
                    825:                        if(mode&NO_UPDATE)
                    826:                                continue;
                    827:                        getfileixb(&f);
                    828:                        if(mode&ULDATE_ONLY) {
                    829:                                f.dateuled=time(NULL);
                    830:                                update_uldate(f);
                    831:                                continue; } }
                    832: 
                    833:                if(mode&FILE_DATE) {            /* get the file date and put into desc */
                    834:                        unixtodstr(fdate(filepath),f.desc);
                    835:                        strcat(f.desc,"  "); }
                    836: 
                    837:                if(mode&TODAYS_DATE) {          /* put today's date in desc */
                    838:                        unixtodstr(time(NULL),f.desc);
                    839:                        strcat(f.desc,"  "); }
                    840: 
                    841:                if(mode&FILE_ID) {
                    842:                        for(i=0;i<total_fextrs;i++)
                    843:                                if(!stricmp(fextr[i]->ext,f.name+9))
                    844:                                        break;
                    845:                        if(i<total_fextrs) {
                    846:                                sprintf(tmp,"%sFILE_ID.DIZ",temp_dir);
                    847:                                remove(tmp);
                    848:                                system(cmdstr(fextr[i]->cmd,filepath,"FILE_ID.DIZ",NULL));
                    849:                                if(!fexist(tmp)) {
                    850:                                        sprintf(tmp,"%sDESC.SDI",temp_dir);
                    851:                                        remove(tmp);
                    852:                                        system(cmdstr(fextr[i]->cmd,filepath,"DESC.SDI",NULL)); }
                    853:                                if((file=nopen(tmp,O_RDONLY))!=-1) {
                    854:                                        memset(ext,0,513);
                    855:                                        read(file,ext,512);
                    856:                                        for(i=512;i;i--)
                    857:                                                if(ext[i-1]>SP)
                    858:                                                        break;
                    859:                                        ext[i]=0;
                    860:                                        if(mode&ASCII_ONLY)
                    861:                                                strip_exascii(ext);
                    862:                                        if(!(mode&KEEP_DESC)) {
                    863:                                                sprintf(tmpext,"%.256s",ext);
                    864:                                                strip_ctrl(tmpext);
                    865:                                                for(i=0;tmpext[i];i++)
                    866:                                                        if(isalpha(tmpext[i]))
                    867:                                                                break;
                    868:                                                sprintf(f.desc,"%.*s",LEN_FDESC,tmpext+i);
                    869:                                                for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++)
                    870:                                                        ;
                    871:                                                f.desc[i]=0; }
                    872:                                        close(file);
                    873:                                        f.misc|=FM_EXTDESC; } } }
                    874: 
                    875:                f.dateuled=time(NULL);
                    876:                f.altpath=cur_altpath;
                    877:                strip_ctrl(f.desc);
                    878:                if(mode&ASCII_ONLY)
                    879:                        strip_exascii(f.desc);
                    880:                if(exist) {
                    881:                        putfiledat(f);
                    882:                        if(!(mode&NO_NEWDATE))
                    883:                                update_uldate(f); }
                    884:                else
                    885:                        addfiledat(&f);
                    886:                if(f.misc&FM_EXTDESC) {
                    887:                        truncsp(ext);
                    888:                        putextdesc(f.dir,f.datoffset,ext); }
                    889: 
                    890:                if(mode&UL_STATS)
                    891:                        updatestats(f.cdt);
                    892:                files++; }
                    893: #ifdef __WATCOMC__
                    894:    _dos_findclose(&ff);
                    895: #endif
                    896:        return; }
                    897: 
                    898: 
                    899: strcpy(listpath,inpath);
                    900: if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) {
                    901:        sprintf(listpath,"%s%s",cur_altpath ? altpath[cur_altpath-1]
                    902:                        : dir[f.dir]->path,inpath);
                    903:        if(listpath[0]=='.') { /* relative path */
                    904:                sprintf(str,"%s%s",node_dir,listpath);
                    905:                strcpy(listpath,str); }
                    906:        if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) {
                    907:                printf("Can't open: %s\n"
                    908:                           "        or: %s\n",inpath,listpath);
                    909:                return; } }
                    910: 
                    911: printf("Adding %s to %s %s\n\n"
                    912:        ,listpath,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname);
                    913: 
                    914: fgets(nextline,255,stream);
                    915: while(!feof(stream) && !ferror(stream)) {
                    916:        f.misc=0;
                    917:        f.desc[0]=0;
                    918:        strcpy(curline,nextline);
                    919:        nextline[0]=0;
                    920:        fgets(nextline,255,stream);
                    921:        truncsp(curline);
                    922:        if(curline[0]<=SP || (uchar)curline[0]>=0x7e)
                    923:                continue;
                    924:        printf("%s\n",curline);
                    925:        strcpy(fname,curline);
                    926: 
                    927:        p=strchr(fname,'.');
                    928:        if(!p || p==fname || p>fname+8)    /* no dot or invalid dot location */
                    929:                continue;
                    930:        p=strchr(p,SP);
                    931:        if(p) *p=0;
                    932:        else                               /* no space after filename? */
                    933:                continue;
                    934:        strupr(fname);
                    935:        strcpy(fname,unpadfname(fname,tmp));
                    936: 
                    937:        padfname(fname,f.name);
                    938:        if(strcspn(f.name,"\\/|<>+[]:=\";,")!=strlen(f.name))
                    939:                continue;
                    940: 
                    941:     for(i=0;i<12;i++)
                    942:         if(f.name[i]<SP || (uchar)f.name[i]>0x7e)
                    943:             break;
                    944: 
                    945:        if(i<12)                                        /* Ctrl chars or EX-ASCII in filename? */
                    946:                continue;
                    947:        exist=findfile(f.dir,f.name);
                    948:     if(exist) {
                    949:         if(mode&NO_UPDATE)
                    950:             continue;
                    951:                getfileixb(&f);
                    952:                if(mode&ULDATE_ONLY) {
                    953:                        f.dateuled=time(NULL);
                    954:                        update_uldate(f);
                    955:                        continue; } }
                    956: 
                    957:        sprintf(filepath,"%s%s",cur_altpath ? altpath[cur_altpath-1]
                    958:                : dir[f.dir]->path,fname);
                    959:        if(filepath[0]=='.') { /* relative path */
                    960:                sprintf(tmp,"%s%s",node_dir,filepath);
                    961:                strcpy(filepath,tmp); }
                    962: 
                    963:        if(mode&FILE_DATE) {            /* get the file date and put into desc */
                    964:                l=fdate(filepath);
                    965:                unixtodstr(l,f.desc);
                    966:                strcat(f.desc,"  "); }
                    967: 
                    968:        if(mode&TODAYS_DATE) {          /* put today's date in desc */
                    969:                l=time(NULL);
                    970:                unixtodstr(l,f.desc);
                    971:                strcat(f.desc,"  "); }
                    972: 
                    973:        if(dskip && strlen(curline)>=dskip) p=curline+dskip;
                    974:        else {
                    975:                p++;
                    976:                while(*p==SP) p++; }
                    977:        sprintf(tmp,"%.*s",LEN_FDESC-strlen(f.desc),p);
                    978:        strcat(f.desc,tmp);
                    979: 
                    980:        if(nextline[0]==SP || strlen(p)>LEN_FDESC) {    /* ext desc */
                    981:                if(!(mode&NO_EXTEND)) {
                    982:                        memset(ext,0,513);
                    983:                        f.misc|=FM_EXTDESC;
                    984:                        sprintf(ext,"%s\r\n",p); }
                    985: 
                    986:                if(nextline[0]==SP) {
                    987:                        strcpy(str,nextline);                              /* tack on to end of desc */
                    988:                        p=str+dskip;
                    989:                        i=LEN_FDESC-strlen(f.desc);
                    990:                        if(i>1) {
                    991:                                p[i-1]=0;
                    992:                                truncsp(p);
                    993:                                if(p[0]) {
                    994:                                        strcat(f.desc," ");
                    995:                                        strcat(f.desc,p); } } }
                    996: 
                    997:                while(!feof(stream) && !ferror(stream) && strlen(ext)<512) {
                    998:                        if(nextline[0]!=SP)
                    999:                                break;
                   1000:                        truncsp(nextline);
                   1001:                        printf("%s\n",nextline);
                   1002:                        if(!(mode&NO_EXTEND)) {
                   1003:                                f.misc|=FM_EXTDESC;
                   1004:                                p=nextline+dskip;
                   1005:                                while(*p==SP) p++;
                   1006:                                strcat(ext,p);
                   1007:                                strcat(ext,"\r\n"); }
                   1008:                        nextline[0]=0;
                   1009:                        fgets(nextline,255,stream); } }
                   1010: 
                   1011: 
                   1012:        if(sskip) l=atol(fname+sskip);
                   1013:        else {
                   1014:                l=flength(filepath);
                   1015:                if(l<1L) {
                   1016:                        printf("%s not found.\n",filepath);
                   1017:                        continue; } }
                   1018: 
                   1019:        if(mode&FILE_ID) {
                   1020:         for(i=0;i<total_fextrs;i++)
                   1021:             if(!stricmp(fextr[i]->ext,f.name+9))
                   1022:                 break;
                   1023:         if(i<total_fextrs) {
                   1024:             sprintf(tmp,"%sFILE_ID.DIZ",temp_dir);
                   1025:             remove(tmp);
                   1026:                        system(cmdstr(fextr[i]->cmd,filepath,"FILE_ID.DIZ",NULL));
                   1027:             if(!fexist(tmp)) {
                   1028:                 sprintf(tmp,"%sDESC.SDI",temp_dir);
                   1029:                 remove(tmp);
                   1030:                                system(cmdstr(fextr[i]->cmd,filepath,"DESC.SDI",NULL)); }
                   1031:                        if((file=nopen(tmp,O_RDONLY))!=-1) {
                   1032:                                memset(ext,0,513);
                   1033:                                read(file,ext,512);
                   1034:                                for(i=512;i;i--)
                   1035:                                        if(ext[i-1]>SP)
                   1036:                                                break;
                   1037:                                ext[i]=0;
                   1038:                                if(mode&ASCII_ONLY)
                   1039:                                        strip_exascii(ext);
                   1040:                                if(!(mode&KEEP_DESC)) {
                   1041:                                        sprintf(tmpext,"%.256s",ext);
                   1042:                                        strip_ctrl(tmpext);
                   1043:                                        for(i=0;tmpext[i];i++)
                   1044:                                                if(isalpha(tmpext[i]))
                   1045:                                                        break;
                   1046:                                        sprintf(f.desc,"%.*s",LEN_FDESC,tmpext+i);
                   1047:                                        for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++)
                   1048:                                                ;
                   1049:                                        f.desc[i]=0; }
                   1050:                                close(file);
                   1051:                                f.misc|=FM_EXTDESC; } } }
                   1052: 
                   1053:        f.cdt=l;
                   1054:        f.dateuled=time(NULL);
                   1055:        f.altpath=cur_altpath;
                   1056:        strip_ctrl(f.desc);
                   1057:        if(mode&ASCII_ONLY)
                   1058:                strip_exascii(f.desc);
                   1059:        if(exist) {
                   1060:                putfiledat(f);
                   1061:                if(!(mode&NO_NEWDATE))
                   1062:                        update_uldate(f); }
                   1063:        else
                   1064:                addfiledat(&f);
                   1065:        if(f.misc&FM_EXTDESC) {
                   1066:                truncsp(ext);
                   1067:                putextdesc(f.dir,f.datoffset,ext); }
                   1068: 
                   1069:        if(mode&UL_STATS)
                   1070:                updatestats(l);
                   1071:        files++; }
                   1072: fclose(stream);
                   1073: if(mode&DEL_LIST && !(mode&SYNC_LIST)) {
                   1074:        printf("\nDeleting %s\n",listpath);
                   1075:        remove(listpath); }
                   1076: 
                   1077: }
                   1078: 
                   1079: /***********************/
                   1080: /* Hex-plus to integer */
                   1081: /***********************/
                   1082: uint hptoi(char *str)
                   1083: {
                   1084:        char tmp[128];
                   1085:        uint i;
                   1086: 
                   1087: if(!str[1] || toupper(str[0])<='F')
                   1088:        return(strtol(str,0,16));
                   1089: strcpy(tmp,str);
                   1090: tmp[0]='F';
                   1091: i=strtol(tmp,0,16)+((toupper(str[0])-'F')*0x10);
                   1092: return(i);
                   1093: }
                   1094: 
                   1095: /****************************************************************************/
                   1096: /* Places into 'strout' CR or ETX terminated string starting at             */
                   1097: /* 'start' and ending at 'start'+'length' or terminator from 'strin'        */
                   1098: /****************************************************************************/
                   1099: void getrec(char *strin,int start,int length,char *strout)
                   1100: {
                   1101:     int i=0,stop;
                   1102: 
                   1103: stop=start+length;
                   1104: while(start<stop) {
                   1105:     if(strin[start]==ETX)
                   1106:         break;
                   1107:     strout[i++]=strin[start++]; }
                   1108: strout[i]=0;
                   1109: }
                   1110: 
                   1111: 
                   1112: /****************************************************************************/
                   1113: /* Gets filedata from dircode.DAT file                                                                         */
                   1114: /* Need fields .name ,.dir and .offset to get other info                               */
                   1115: /* Does not fill .dateuled or .datedled fields.                             */
                   1116: /****************************************************************************/
                   1117: void getfiledat(file_t *f)
                   1118: {
                   1119:        char buf[F_LEN+1],str[256];
                   1120:        int file;
                   1121:        long length;
                   1122: 
                   1123: sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code);
                   1124: if((file=nopen(str,O_RDONLY))==-1) {
                   1125:        printf("ERR_OPEN %s\n",str);
                   1126:        return; }
                   1127: length=filelength(file);
                   1128: if(f->datoffset>length) {
                   1129:        close(file);
                   1130:        printf("ERR_LEN %s %lu\n",str,length);
                   1131:        return; }
                   1132: if(length%F_LEN) {
                   1133:        close(file);
                   1134:        printf("ERR_LEN %s %lu\n",str,length);
                   1135:        return; }
                   1136: lseek(file,f->datoffset,SEEK_SET);
                   1137: if(read(file,buf,F_LEN)!=F_LEN) {
                   1138:     close(file);
                   1139:        printf("ERR_READ %s %lu\n",str,F_LEN);
                   1140:        return; }
                   1141: close(file);
                   1142: getrec(buf,F_ALTPATH,2,str);
                   1143: f->altpath=hptoi(str);
                   1144: getrec(buf,F_CDT,7,str);
                   1145: f->cdt=atol(str);
                   1146: f->timetodl=0;
                   1147: 
                   1148: getrec(buf,F_DESC,LEN_FDESC,f->desc);
                   1149: getrec(buf,F_ULER,LEN_ALIAS,f->uler);
                   1150: getrec(buf,F_TIMESDLED,5,str);
                   1151: f->timesdled=atoi(str);
                   1152: getrec(buf,F_OPENCOUNT,3,str);
                   1153: f->opencount=atoi(str);
                   1154: if(buf[F_MISC]!=ETX)
                   1155:        f->misc=buf[F_MISC]-SP;
                   1156: else
                   1157:        f->misc=0;
                   1158: }
                   1159: 
                   1160: /****************************************************************************/
                   1161: /* Removes any files in the user transfer index (XFER.IXT) that match the   */
                   1162: /* specifications of dest, or source user, or filename or any combination.  */
                   1163: /****************************************************************************/
                   1164: void rmuserxfers(int fromuser, int destuser, char *fname)
                   1165: {
                   1166:     char str[256],*ixtbuf;
                   1167:     int file;
                   1168:     long l,length;
                   1169: 
                   1170: sprintf(str,"%sXFER.IXT",data_dir);
                   1171: if(!fexist(str))
                   1172:     return;
                   1173: if(!flength(str)) {
                   1174:     remove(str);
                   1175:     return; }
                   1176: if((file=nopen(str,O_RDONLY))==-1) {
                   1177:        printf("ERR_OPEN %s\n",str);
                   1178:     return; }
                   1179: length=filelength(file);
                   1180: if((ixtbuf=(char *)MALLOC(length))==NULL) {
                   1181:     close(file);
                   1182:        printf("ERR_ALLOC %s\n",str,length);
                   1183:     return; }
                   1184: if(read(file,ixtbuf,length)!=length) {
                   1185:     close(file);
                   1186:        FREE(ixtbuf);
                   1187:        printf("ERR_READ %s %lu\n",str,length);
                   1188:     return; }
                   1189: close(file);
                   1190: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) {
                   1191:        FREE(ixtbuf);
                   1192:        printf("ERR_OPEN %s\n",str);
                   1193:     return; }
                   1194: for(l=0;l<length;l+=24) {
                   1195:     if(fname!=NULL && fname[0]) {               /* fname specified */
                   1196:         if(!strncmp(ixtbuf+l+5,fname,12)) {     /* this is the file */
                   1197:             if(destuser && fromuser) {          /* both dest and from user */
                   1198:                 if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser)
                   1199:                     continue; }                 /* both match */
                   1200:             else if(fromuser) {                 /* from user */
                   1201:                 if(atoi(ixtbuf+l+18)==fromuser) /* matches */
                   1202:                     continue; }
                   1203:             else if(destuser) {                 /* dest user */
                   1204:                 if(atoi(ixtbuf+l)==destuser)    /* matches */
                   1205:                     continue; }
                   1206:             else continue; } }                  /* no users, so match */
                   1207:     else if(destuser && fromuser) {
                   1208:         if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser)
                   1209:             continue; }
                   1210:     else if(destuser && atoi(ixtbuf+l)==destuser)
                   1211:         continue;
                   1212:     else if(fromuser && atoi(ixtbuf+l+18)==fromuser)
                   1213:         continue;
                   1214:     write(file,ixtbuf+l,24); }
                   1215: close(file);
                   1216: FREE(ixtbuf);
                   1217: }
                   1218: 
                   1219: 
                   1220: 
                   1221: /****************************************************************************/
                   1222: /* Removes DAT and IXB entries for the file in the struct 'f'               */
                   1223: /****************************************************************************/
                   1224: void removefiledat(file_t f)
                   1225: {
                   1226:        char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13];
                   1227:     int file;
                   1228:     ulong l,length;
                   1229: 
                   1230: strcpy(fname,f.name);
                   1231: for(c=8;c<12;c++)   /* Turn FILENAME.EXT into FILENAMEEXT */
                   1232:     fname[c]=fname[c+1];
                   1233: sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code);
                   1234: if((file=nopen(str,O_RDONLY))==-1) {
                   1235:        printf("ERR_OPEN %s\n",str);
                   1236:     return; }
                   1237: length=filelength(file);
                   1238: if(!length) {
                   1239:        close(file);
                   1240:        return; }
                   1241: if((ixbbuf=(char *)MALLOC(length))==0) {
                   1242:     close(file);
                   1243:        printf("ERR_ALLOC %s %lu\n",str,length);
                   1244:     return; }
                   1245: if(lread(file,ixbbuf,length)!=length) {
                   1246:     close(file);
                   1247:        printf("ERR_READ %s %lu\n",str,length);
                   1248:        FREE((char *)ixbbuf);
                   1249:     return; }
                   1250: close(file);
                   1251: if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) {
                   1252:        printf("ERR_OPEN %s\n",str);
                   1253:     return; }
                   1254: for(l=0;l<length;l+=F_IXBSIZE) {
                   1255:     for(c=0;c<11;c++)
                   1256:         ixbname[c]=ixbbuf[l+c];
                   1257:     ixbname[c]=0;
                   1258:     if(strcmp(ixbname,fname))
                   1259:                if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) {
                   1260:             close(file);
                   1261:                        printf("ERR_WRITE %s %lu\n",str,F_IXBSIZE);
                   1262:                        FREE((char *)ixbbuf);
                   1263:             return; } }
                   1264: FREE((char *)ixbbuf);
                   1265: close(file);
                   1266: sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code);
                   1267: if((file=nopen(str,O_WRONLY))==-1) {
                   1268:        printf("ERR_OPEN %s\n",str);
                   1269:     return; }
                   1270: lseek(file,f.datoffset,SEEK_SET);
                   1271: c=ETX;          /* If first char of record is ETX, record is unused */
                   1272: if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */
                   1273:     close(file);
                   1274:        printf("ERR_WRITE %s 1",str);
                   1275:     return; }
                   1276: close(file);
                   1277: if(f.dir==user_dir)  /* remove file from index */
                   1278:     rmuserxfers(0,0,f.name);
                   1279: 
                   1280: }
                   1281: 
                   1282: 
                   1283: void synclist(char *inpath, int dirnum)
                   1284: {
                   1285:        uchar str[1024],fname[256],listpath[256], HUGE16 *ixbbuf,*p;
                   1286:        int i,file,found;
                   1287:        long l,m,length;
                   1288:        FILE *stream;
                   1289:        file_t f;
                   1290: 
                   1291: sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code);
                   1292: if((file=nopen(str,O_RDONLY))==-1) {
                   1293:        printf("ERR_OPEN %s\n",str);
                   1294:        return; }
                   1295: length=filelength(file);
                   1296: if(length%F_IXBSIZE) {
                   1297:        close(file);
                   1298:        printf("ERR_LEN %s\n");
                   1299:        return; }
                   1300: if((ixbbuf=(uchar HUGE16 *)MALLOC(length))==NULL) {
                   1301:        close(file);
                   1302:        printf("ERR_ALLOC %s\n",str);
                   1303:        return; }
                   1304: if(lread(file,ixbbuf,length)!=length) {
                   1305:        close(file);
                   1306:        FREE((char *)ixbbuf);
                   1307:        printf("ERR_READ %s\n",str);
                   1308:        return; }
                   1309: close(file);
                   1310: 
                   1311: strcpy(listpath,inpath);
                   1312: if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) {
                   1313:        sprintf(listpath,"%s%s",cur_altpath ? altpath[cur_altpath-1]
                   1314:                        : dir[dirnum]->path,inpath);
                   1315:        if(listpath[0]=='.') { /* relative path */
                   1316:                sprintf(str,"%s%s",node_dir,listpath);
                   1317:                strcpy(listpath,str); }
                   1318:        if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) {
                   1319:                printf("Can't open: %s\n"
                   1320:                           "        or: %s\n",inpath,listpath);
                   1321:                return; } }
                   1322: 
                   1323: printf("\nSynchronizing %s with %s %s\n\n"
                   1324:        ,listpath,lib[dir[dirnum]->lib]->sname,dir[dirnum]->sname);
                   1325: 
                   1326: for(l=0;l<length;l+=F_IXBSIZE) {
                   1327:        m=l;
                   1328:        for(i=0;i<12 && l<length;i++)
                   1329:                if(i==8)
                   1330:                        str[i]='.';
                   1331:                else
                   1332:                        str[i]=ixbbuf[m++];     /* Turns FILENAMEEXT into FILENAME.EXT */
                   1333:        str[i]=0;
                   1334:        unpadfname(str,fname);
                   1335:        rewind(stream);
                   1336:        found=0;
                   1337:        while(!found) {
                   1338:                if(!fgets(str,1000,stream))
                   1339:                        break;
                   1340:                truncsp(str);
                   1341:                p=strchr(str,SP);
                   1342:                if(p) *p=0;
                   1343:                if(!stricmp(str,fname))
                   1344:                        found=1; }
                   1345:        if(found)
                   1346:                continue;
                   1347:        padfname(fname,f.name);
                   1348:        printf("%s not found in list - ",f.name);
                   1349:        f.dir=dirnum;
                   1350:        f.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16);
                   1351:        getfiledat(&f);
                   1352:        if(f.opencount) {
                   1353:                printf("currently OPEN by %u users\n",f.opencount);
                   1354:                continue; }
                   1355:        removefiledat(f);
                   1356:        sprintf(str,"%s%s"
                   1357:                ,f.altpath>0 && f.altpath<=altpaths ? altpath[f.altpath-1]
                   1358:                : dir[f.dir]->path,fname);
                   1359:        if(str[0]=='.') {
                   1360:                sprintf(tmp,"%s%s",node_dir,str);
                   1361:         strcpy(str,tmp); }
                   1362:        if(remove(str))
                   1363:                printf("Error removing %s\n",str);
                   1364:        removed++;
                   1365:        printf("Removed from database\n"); }
                   1366: 
                   1367: if(mode&DEL_LIST) {
                   1368:        printf("\nDeleting %s\n",listpath);
                   1369:        remove(listpath); }
                   1370: }
                   1371: 
                   1372: char *usage="\nusage: addfiles code [.alt_path] [/opts] [\"*user\"] +list "
                   1373:                         "[desc_off] [size_off]"
                   1374:        "\n   or: addfiles code [.alt_path] [/opts] [\"*user\"]  file "
                   1375:                "\"description\"\n"
                   1376:        "\navailable opts:"
                   1377:        "\n       a    import ASCII only (no extended ASCII)"
                   1378:        "\n       b    synchronize database with file list (use with caution)"
                   1379:        "\n       c    do not remove extra spaces from file description"
                   1380:        "\n       d    delete list after import"
                   1381:        "\n       e    do not import extended descriptions"
                   1382:        "\n       f    include file date in descriptions"
                   1383:        "\n       t    include today's date in descriptions"
                   1384:        "\n       i    include added files in upload statistics"
                   1385:        "\n       n    do not update information for existing files"
                   1386:        "\n       o    update upload date only for existing files"
                   1387:        "\n       u    do not update upload date for existing files"
                   1388:        "\n       z    check for and import FILE_ID.DIZ and DESC.SDI"
                   1389:        "\n       k    keep original short description (not DIZ)"
                   1390:        "\n       s    search directory for files (no file list)"
                   1391:        "\n"
                   1392:        "\nAuto-ADD:   use * in place of code for Auto-ADD of FILES.BBS"
                   1393:        "\n            use *filename to Auto-ADD a different filename"
                   1394:        "\n"
                   1395:        ;
                   1396: 
                   1397: /*********************/
                   1398: /* Entry point (duh) */
                   1399: /*********************/
                   1400: int main(int argc, char **argv)
                   1401: {
                   1402:        uchar str[256],str2[256],*p,exist,listgiven=0,namegiven=0,ext[513]
                   1403:                ,auto_name[13]="FILES.BBS";
                   1404:        int i,j,k,file;
                   1405:        long l;
                   1406:        read_cfg_text_t txt;
                   1407:        file_t f;
                   1408: 
                   1409: putenv("TZ=UCT0");
                   1410: _fmode=O_BINARY;
                   1411: setvbuf(stdout,NULL,_IONBF,0);
                   1412: 
                   1413: fprintf(stderr,"\nADDFILES Version %s (%s) - Adds files to Synchronet "
                   1414:        "Filebase\n"
                   1415:        ,ADDFILES_VER
                   1416: #if defined(__OS2__)
                   1417:        ,"OS/2"
                   1418: #elif defined(__NT__)
                   1419:     ,"Win32"
                   1420: #elif defined(__DOS4G__)
                   1421:        ,"DOS4G"
                   1422: #elif defined(__FLAT__)
                   1423:        ,"DOS32"
                   1424: #else
                   1425:        ,"DOS16"
                   1426: #endif
                   1427:        );
                   1428: 
                   1429: if(argc<2) {
                   1430:        printf(usage);
                   1431:        return(1); }
                   1432: 
                   1433: p=getenv("SBBSNODE");
                   1434: if(p==NULL) {
                   1435:        printf("\nSBBSNODE environment variable not set.\n");
                   1436:        printf("\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n");
                   1437:        exit(1); }
                   1438: 
                   1439: putenv("TZ=UCT0");
                   1440: 
                   1441: strcpy(node_dir,p);
                   1442: if(node_dir[strlen(node_dir)-1]!='\\')
                   1443:        strcat(node_dir,"\\");
                   1444: 
                   1445: txt.openerr="\7\nError opening %s for read.\n";
                   1446: txt.reading="\nReading %s...";
                   1447: txt.readit="\rRead %s       ";
                   1448: txt.allocerr="\7\nError allocating %u bytes of memory\n";
                   1449: txt.error="\7\nERROR: Offset %lu in %s\r\n\n";
                   1450: 
                   1451: read_node_cfg(txt);
                   1452: if(ctrl_dir[0]=='.') {   /* Relative path */
                   1453:        strcpy(str,ctrl_dir);
                   1454:        sprintf(ctrl_dir,"%s%s",node_dir,str); }
                   1455: read_main_cfg(txt);
                   1456: if(data_dir[0]=='.') {   /* Relative path */
                   1457:        strcpy(str,data_dir);
                   1458:        sprintf(data_dir,"%s%s",node_dir,str); }
                   1459: if(temp_dir[1]!=':' && temp_dir[0]!='\\') {
                   1460:        strcpy(str,temp_dir);
                   1461:        sprintf(temp_dir,"%s%s",node_dir,str); }
                   1462: read_file_cfg(txt);
                   1463: printf("\n\n");
                   1464: 
                   1465: if(argv[1][0]=='*') {
                   1466:        if(argv[1][1])
                   1467:                sprintf(auto_name,"%.12s",argv[1]+1);
                   1468:        mode|=AUTO_ADD;
                   1469:        i=0; }
                   1470: else {
                   1471:        for(i=0;i<total_dirs;i++)
                   1472:                if(!stricmp(dir[i]->code,argv[1]))
                   1473:                        break;
                   1474: 
                   1475:        if(i>=total_dirs) {
                   1476:                printf("Directory code '%s' not found.\n",argv[1]);
                   1477:                exit(1); } }
                   1478: 
                   1479: memset(&f,0,sizeof(file_t));
                   1480: f.dir=i;
                   1481: strcpy(f.uler,"-> ADDFILES <-");
                   1482: 
                   1483: for(j=2;j<argc;j++) {
                   1484:        if(argv[j][0]=='*')     /* set the uploader name */
                   1485:                sprintf(f.uler,"%.25s",argv[j]+1);
                   1486:        else if(argv[j][0]=='/') {      /* options */
                   1487:                for(i=1;i<strlen(argv[j]);i++)
                   1488:                        switch(toupper(argv[j][i])) {
                   1489:                                case 'A':
                   1490:                                        mode|=ASCII_ONLY;
                   1491:                                        break;
                   1492:                                case 'B':
                   1493:                                        mode|=(SYNC_LIST|NO_UPDATE);
                   1494:                                        break;
                   1495:                                case 'C':
                   1496:                                        mode|=KEEP_SPACE;
                   1497:                                        break;
                   1498:                                case 'D':
                   1499:                                        mode|=DEL_LIST;
                   1500:                                        break;
                   1501:                                case 'E':
                   1502:                                        mode|=NO_EXTEND;
                   1503:                                        break;
                   1504:                                case 'I':
                   1505:                                        mode|=UL_STATS;
                   1506:                                        break;
                   1507:                                case 'Z':
                   1508:                                        mode|=FILE_ID;
                   1509:                                        break;
                   1510:                                case 'K':
                   1511:                                        mode|=KEEP_DESC;         /* Don't use DIZ for short desc */
                   1512:                                        break;
                   1513:                                case 'N':
                   1514:                                        mode|=NO_UPDATE;
                   1515:                                        break;
                   1516:                                case 'O':
                   1517:                                        mode|=ULDATE_ONLY;
                   1518:                                        break;
                   1519:                                case 'U':
                   1520:                                        mode|=NO_NEWDATE;
                   1521:                                        break;
                   1522:                                case 'F':
                   1523:                                        mode|=FILE_DATE;
                   1524:                                        break;
                   1525:                                case 'T':
                   1526:                                        mode|=TODAYS_DATE;
                   1527:                                        break;
                   1528:                                case 'S':
                   1529:                                        mode|=SEARCH_DIR;
                   1530:                                        break;
                   1531:                                default:
                   1532:                                        printf(usage);
                   1533:                                        return(1); } }
                   1534:        else if(argv[j][0]=='+') {      /* filelist - FILES.BBS */
                   1535:                listgiven=1;
                   1536:                if(isdigit(argv[j+1][0])) { /* skip x characters before description */
                   1537:                        if(isdigit(argv[j+2][0])) { /* skip x characters before size */
                   1538:                                addlist(argv[j]+1,f,atoi(argv[j+1]),atoi(argv[j+2]));
                   1539:                                j+=2; }
                   1540:                        else {
                   1541:                                addlist(argv[j]+1,f,atoi(argv[j+1]),0);
                   1542:                                j++; } }
                   1543:                else
                   1544:                        addlist(argv[j]+1,f,0,0);
                   1545:                if(mode&SYNC_LIST)
                   1546:                        synclist(argv[j]+1,f.dir); }
                   1547:        else if(argv[j][0]=='.') {      /* alternate file path */
                   1548:                cur_altpath=atoi(argv[j]+1);
                   1549:                if(cur_altpath>altpaths) {
                   1550:                        printf("Invalid alternate path.\n");
                   1551:                        exit(1); } }
                   1552:        else {
                   1553:                namegiven=1;
                   1554:                padfname(argv[j],f.name);
                   1555:                f.desc[0]=0;
                   1556:                strupr(f.name);
                   1557:                if(j+1==argc) {
                   1558:                        printf("%s no description given.\n",f.name);
                   1559:                        continue; }
                   1560:                sprintf(str,"%s%s",cur_altpath ? altpath[cur_altpath-1]
                   1561:                        : dir[f.dir]->path,argv[j]);
                   1562:                if(str[0]=='.') {
                   1563:                        sprintf(tmp,"%s%s",node_dir,str);
                   1564:                        strcpy(str,tmp); }
                   1565:                if(mode&FILE_DATE)
                   1566:                        sprintf(f.desc,"%s  ",unixtodstr(fdate(str),tmp));
                   1567:                if(mode&TODAYS_DATE)
                   1568:                        sprintf(f.desc,"%s  ",unixtodstr(time(NULL),tmp));
                   1569:                sprintf(tmp,"%.*s",LEN_FDESC-strlen(f.desc),argv[++j]);
                   1570:                strcpy(f.desc,tmp);
                   1571:                l=flength(str);
                   1572:                if(l==-1) {
                   1573:                        printf("%s not found.\n",str);
                   1574:                        continue; }
                   1575:                exist=findfile(f.dir,f.name);
                   1576:                if(exist) {
                   1577:                        if(mode&NO_UPDATE)
                   1578:                                continue;
                   1579:                        getfileixb(&f);
                   1580:                        if(mode&ULDATE_ONLY) {
                   1581:                                f.dateuled=time(NULL);
                   1582:                                update_uldate(f);
                   1583:                                continue; } }
                   1584:                f.cdt=l;
                   1585:                f.dateuled=time(NULL);
                   1586:                f.altpath=cur_altpath;
                   1587:                strip_ctrl(f.desc);
                   1588:                if(mode&ASCII_ONLY)
                   1589:                        strip_exascii(f.desc);
                   1590:                printf("%s %7lu %s\n",f.name,f.cdt,f.desc);
                   1591:                if(mode&FILE_ID) {
                   1592:                        for(i=0;i<total_fextrs;i++)
                   1593:                                if(!stricmp(fextr[i]->ext,f.name+9))
                   1594:                                        break;
                   1595:                        if(i<total_fextrs) {
                   1596:                                sprintf(tmp,"%sFILE_ID.DIZ",temp_dir);
                   1597:                                remove(tmp);
                   1598:                                system(cmdstr(fextr[i]->cmd,str,"FILE_ID.DIZ",NULL));
                   1599:                                if(!fexist(tmp)) {
                   1600:                                        sprintf(tmp,"%sDESC.SDI",temp_dir);
                   1601:                                        remove(tmp);
                   1602:                                        system(cmdstr(fextr[i]->cmd,str,"DESC.SDI",NULL)); }
                   1603:                                if((file=nopen(tmp,O_RDONLY))!=-1) {
                   1604:                                        memset(ext,0,513);
                   1605:                                        read(file,ext,512);
                   1606:                                        if(!(mode&KEEP_DESC)) {
                   1607:                                                sprintf(f.desc,"%.*s",LEN_FDESC,ext);
                   1608:                                                for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++)
                   1609:                                                        ;
                   1610:                                                f.desc[i]=0; }
                   1611:                                        close(file);
                   1612:                                        f.misc|=FM_EXTDESC; } } }
                   1613:                if(exist) {
                   1614:                        putfiledat(f);
                   1615:                        if(!(mode&NO_NEWDATE))
                   1616:                                update_uldate(f); }
                   1617:                else
                   1618:                        addfiledat(&f);
                   1619: 
                   1620:                if(f.misc&FM_EXTDESC)
                   1621:                        putextdesc(f.dir,f.datoffset,ext);
                   1622: 
                   1623:                if(mode&UL_STATS)
                   1624:                        updatestats(l);
                   1625:                files++; } }
                   1626: 
                   1627: if(mode&AUTO_ADD) {
                   1628:        for(i=0;i<total_dirs;i++) {
                   1629:                if(dir[i]->misc&DIR_NOAUTO)
                   1630:                        continue;
                   1631:                f.dir=i;
                   1632:                if(mode&SEARCH_DIR) {
                   1633:                        addlist("",f,0,0);
                   1634:                        continue; }
                   1635:         sprintf(str,"%s.LST",dir[f.dir]->code);
                   1636:         if(flength(str)>0L) {
                   1637:                        printf("Auto-adding %s\n",str);
                   1638:             addlist(str,f,0,0);
                   1639:                        if(mode&SYNC_LIST)
                   1640:                                synclist(str,i);
                   1641:             continue; }
                   1642:                sprintf(str,"%s%s",dir[f.dir]->path,auto_name);
                   1643:                if(str[0]=='.') {
                   1644:                        sprintf(tmp,"%s%s",node_dir,str);
                   1645:                        strcpy(str,tmp); }
                   1646:                if(flength(str)>0L) {
                   1647:                        printf("Auto-adding %s\n",str);
                   1648:                        addlist(str,f,0,0);
                   1649:                        if(mode&SYNC_LIST)
                   1650:                                synclist(str,i);
                   1651:                        continue; } } }
                   1652: 
                   1653: else {
                   1654:        if(!listgiven && !namegiven) {
                   1655:                sprintf(str,"%s.LST",dir[f.dir]->code);
                   1656:                if(flength(str)<=0L)
                   1657:                        strcpy(str,"FILES.BBS");
                   1658:                addlist(str,f,0,0);
                   1659:                if(mode&SYNC_LIST)
                   1660:                        synclist(str,f.dir); } }
                   1661: 
                   1662: printf("\n%lu file(s) added.",files);
                   1663: if(removed)
                   1664:        printf("\n%lu files(s) removed.",removed);
                   1665: printf("\n");
                   1666: return(0);
                   1667: }
                   1668: 

unix.superglobalmegacorp.com

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