Annotation of sbbs/sbbs2/addfiles/addfiles.c, revision 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.