Annotation of sbbs/src/sbbs3/addfiles.c, revision 1.1.1.1

1.1       root        1: /* addfiles.c */
                      2: 
                      3: /* Program to add files to a Synchronet file database */
                      4: 
                      5: /* $Id: addfiles.c,v 1.39 2006/04/28 21:13:57 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: 
                     40: #define ADDFILES_VER "3.02"
                     41: 
                     42: scfg_t scfg;
                     43: 
                     44: int cur_altpath=0;
                     45: 
                     46: long files=0,removed=0,mode=0;
                     47: 
                     48: char lib[LEN_GSNAME+1];
                     49: 
                     50: #define DEL_LIST       (1L<<0)
                     51: #define NO_EXTEND      (1L<<1)
                     52: #define FILE_DATE      (1L<<2)
                     53: #define TODAYS_DATE (1L<<3)
                     54: #define FILE_ID        (1L<<4)
                     55: #define NO_UPDATE      (1L<<5)
                     56: #define NO_NEWDATE     (1L<<6)
                     57: #define ASCII_ONLY     (1L<<7)
                     58: #define UL_STATS       (1L<<8)
                     59: #define ULDATE_ONLY (1L<<9)
                     60: #define KEEP_DESC      (1L<<10)
                     61: #define AUTO_ADD       (1L<<11)
                     62: #define SEARCH_DIR     (1L<<12)
                     63: #define SYNC_LIST      (1L<<13)
                     64: #define KEEP_SPACE     (1L<<14)
                     65: 
                     66: /****************************************************************************/
                     67: /* This is needed by load_cfg.c                                                                                                */
                     68: /****************************************************************************/
                     69: int lprintf(int level, char *fmat, ...)
                     70: {
                     71:        va_list argptr;
                     72:        char sbuf[512];
                     73:        int chcount;
                     74: 
                     75:        va_start(argptr,fmat);
                     76:        chcount=vsprintf(sbuf,fmat,argptr);
                     77:        va_end(argptr);
                     78:        truncsp(sbuf);
                     79:        printf("%s\n",sbuf);
                     80:        return(chcount);
                     81: }
                     82: 
                     83: void prep_desc(uchar *str)
                     84: {
                     85:        char tmp[1024];
                     86:        int i,j;
                     87: 
                     88:        for(i=j=0;str[i] && j < sizeof(tmp)-1;i++) {
                     89:                if(j && str[i]==' ' && tmp[j-1]==' ' && (mode&KEEP_SPACE))
                     90:                        tmp[j++]=str[i];
                     91:                else if(j && str[i]<=' ' && tmp[j-1]==' ')
                     92:                        continue;
                     93:                else if(i && !isalnum(str[i]) && str[i]==str[i-1])
                     94:                        continue;
                     95:                else if(str[i]>=' ')
                     96:                        tmp[j++]=str[i];
                     97:                else if(str[i]==TAB || (str[i]==CR && str[i+1]==LF))
                     98:                        tmp[j++]=' ';
                     99:        }
                    100:        tmp[j]=0;
                    101:        strcpy(str,tmp);
                    102: }
                    103: 
                    104: /*****************************************************************************/
                    105: /* Returns command line generated from instr with %c replacments             */
                    106: /*****************************************************************************/
                    107: char *mycmdstr(char *instr, char *fpath, char *fspec, char *outstr)
                    108: {
                    109:     static char cmd[MAX_PATH+1];
                    110:     char str[MAX_PATH+1];
                    111:     int i,j,len;
                    112: #ifdef _WIN32
                    113:        char sfpath[MAX_PATH+1];
                    114: #endif
                    115: 
                    116:        len=strlen(instr);
                    117:        for(i=j=0;i<len && j<128;i++) {
                    118:                if(instr[i]=='%') {
                    119:                        i++;
                    120:                        cmd[j]=0;
                    121:                        switch(toupper(instr[i])) {
                    122:                                case 'F':   /* File path */
                    123:                                        strcat(cmd,fpath);
                    124:                                        break;
                    125:                                case '~':       /* DOS-compatible (8.3) filename */
                    126: #ifdef _WIN32
                    127:                                        SAFECOPY(sfpath,fpath);
                    128:                                        GetShortPathName(fpath,sfpath,sizeof(sfpath));
                    129:                                        strcat(cmd,sfpath);
                    130: #else
                    131:                     strcat(cmd,fpath);
                    132: #endif                 
                    133:                                        break;
                    134:                                case 'G':   /* Temp directory */
                    135:                                        strcat(cmd,scfg.temp_dir);
                    136:                                        break;
                    137:                 case 'J':
                    138:                     strcat(cmd,scfg.data_dir);
                    139:                     break;
                    140:                 case 'K':
                    141:                     strcat(cmd,scfg.ctrl_dir);
                    142:                     break;
                    143:                                case 'N':   /* Node Directory (same as SBBSNODE environment var) */
                    144:                                        strcat(cmd,scfg.node_dir);
                    145:                                        break;
                    146:                                case 'S':   /* File Spec */
                    147:                                        strcat(cmd,fspec);
                    148:                                        break;
                    149:                 case 'Z':
                    150:                     strcat(cmd,scfg.text_dir);
                    151:                     break;
                    152:                                case '!':   /* EXEC Directory */
                    153:                                        strcat(cmd,scfg.exec_dir);
                    154:                                        break;
                    155:                 case '@':   /* EXEC Directory for DOS/OS2/Win32, blank for Unix */
                    156: #ifndef __unix__
                    157:                     strcat(cmd,scfg.exec_dir);
                    158: #endif
                    159:                     break;
                    160:                                case '#':   /* Node number (same as SBBSNNUM environment var) */
                    161:                                        sprintf(str,"%d",scfg.node_num);
                    162:                                        strcat(cmd,str);
                    163:                                        break;
                    164:                                case '%':   /* %% for percent sign */
                    165:                                        strcat(cmd,"%");
                    166:                                        break;
                    167:                                default:    /* unknown specification */
                    168:                                        break; 
                    169:                        }
                    170:                        j=strlen(cmd); 
                    171:                }
                    172:                else
                    173:                        cmd[j++]=instr[i]; 
                    174:        }
                    175:        cmd[j]=0;
                    176: 
                    177:        return(cmd);
                    178: }
                    179: 
                    180: /****************************************************************************/
                    181: /* Updates dstst.dab file                                                                                                      */
                    182: /****************************************************************************/
                    183: void updatestats(ulong size)
                    184: {
                    185:     char       str[MAX_PATH+1];
                    186:     int                file;
                    187:        ulong   l;
                    188: 
                    189:        sprintf(str,"%sdsts.dab",scfg.ctrl_dir);
                    190:        if((file=nopen(str,O_RDWR|O_BINARY))==-1) {
                    191:                printf("ERR_OPEN %s\n",str);
                    192:                return; 
                    193:        }
                    194:        lseek(file,20L,SEEK_SET);       /* Skip timestamp, logons and logons today */
                    195:        read(file,&l,4);                        /* Uploads today                 */
                    196:        l++;
                    197:        lseek(file,-4L,SEEK_CUR);
                    198:        write(file,&l,4);
                    199:        read(file,&l,4);                        /* Upload bytes today    */
                    200:        l+=size;
                    201:        lseek(file,-4L,SEEK_CUR);
                    202:        write(file,&l,4);
                    203:        close(file);
                    204: }
                    205: 
                    206: void addlist(char *inpath, file_t f, uint dskip, uint sskip)
                    207: {
                    208:        char str[MAX_PATH+1];
                    209:        char tmp[MAX_PATH+1];
                    210:        char fname[MAX_PATH+1];
                    211:        char listpath[MAX_PATH+1];
                    212:        char filepath[MAX_PATH+1];
                    213:        char curline[256],nextline[256];
                    214:        char *p;
                    215:        uchar ext[1024],tmpext[513];
                    216:        int i,file;
                    217:        long l;
                    218:        BOOL exist;
                    219:        FILE *stream;
                    220:        DIR*    dir;
                    221:        DIRENT* dirent;
                    222: 
                    223:        if(mode&SEARCH_DIR) {
                    224:                strcpy(str,cur_altpath ? scfg.altpath[cur_altpath-1] : scfg.dir[f.dir]->path);
                    225:                printf("Searching %s\n\n",str);
                    226:                dir=opendir(str);
                    227: 
                    228:                while(dir!=NULL && (dirent=readdir(dir))!=NULL) {
                    229:                        sprintf(tmp,"%s%s"
                    230:                                ,cur_altpath ? scfg.altpath[cur_altpath-1] : scfg.dir[f.dir]->path
                    231:                                ,dirent->d_name);
                    232:                        if(isdir(tmp))
                    233:                                continue;
                    234: #ifdef _WIN32
                    235:                        GetShortPathName(tmp, filepath, sizeof(filepath));
                    236: #else
                    237:                        strcpy(filepath,tmp);
                    238: #endif
                    239:                        f.misc=0;
                    240:                        f.desc[0]=0;
                    241:                        f.cdt=flength(filepath);
                    242:                        padfname(getfname(filepath),f.name);
                    243:                        printf("%s  %10lu  %s\n"
                    244:                                ,f.name,f.cdt,unixtodstr(&scfg,fdate(filepath),str));
                    245:                        exist=findfile(&scfg,f.dir,f.name);
                    246:                        if(exist) {
                    247:                                if(mode&NO_UPDATE)
                    248:                                        continue;
                    249:                                getfileixb(&scfg,&f);
                    250:                                if(mode&ULDATE_ONLY) {
                    251:                                        f.dateuled=time(NULL);
                    252:                                        update_uldate(&scfg, &f);
                    253:                                        continue; 
                    254:                                } 
                    255:                        }
                    256: 
                    257:                        if(mode&FILE_DATE) {            /* get the file date and put into desc */
                    258:                                unixtodstr(&scfg,fdate(filepath),f.desc);
                    259:                                strcat(f.desc,"  "); 
                    260:                        }
                    261: 
                    262:                        if(mode&TODAYS_DATE) {          /* put today's date in desc */
                    263:                                unixtodstr(&scfg,time(NULL),f.desc);
                    264:                                strcat(f.desc,"  "); 
                    265:                        }
                    266: 
                    267:                        if(mode&FILE_ID) {
                    268:                                for(i=0;i<scfg.total_fextrs;i++)
                    269:                                        if(!stricmp(scfg.fextr[i]->ext,f.name+9) && chk_ar(&scfg,scfg.fextr[i]->ar,NULL))
                    270:                                                break;
                    271:                                if(i<scfg.total_fextrs) {
                    272:                                        sprintf(tmp,"%sFILE_ID.DIZ",scfg.temp_dir);
                    273:                                        remove(tmp);
                    274:                                        system(mycmdstr(scfg.fextr[i]->cmd,filepath,"FILE_ID.DIZ",NULL));
                    275:                                        if(!fexistcase(tmp)) {
                    276:                                                sprintf(tmp,"%sDESC.SDI",scfg.temp_dir);
                    277:                                                remove(tmp);
                    278:                                                system(mycmdstr(scfg.fextr[i]->cmd,filepath,"DESC.SDI",NULL)); 
                    279:                                                fexistcase(tmp);
                    280:                                        }
                    281:                                        if((file=nopen(tmp,O_RDONLY|O_BINARY))!=-1) {
                    282:                                                memset(ext,0,513);
                    283:                                                read(file,ext,512);
                    284:                                                for(i=512;i;i--)
                    285:                                                        if(ext[i-1]>' ')
                    286:                                                                break;
                    287:                                                ext[i]=0;
                    288:                                                if(mode&ASCII_ONLY)
                    289:                                                        strip_exascii(ext);
                    290:                                                if(!(mode&KEEP_DESC)) {
                    291:                                                        sprintf(tmpext,"%.256s",ext);
                    292:                                                        prep_desc(tmpext);
                    293:                                                        for(i=0;tmpext[i];i++)
                    294:                                                                if(isalpha(tmpext[i]))
                    295:                                                                        break;
                    296:                                                        sprintf(f.desc,"%.*s",LEN_FDESC,tmpext+i);
                    297:                                                        for(i=0;f.desc[i]>=' ' && i<LEN_FDESC;i++)
                    298:                                                                ;
                    299:                                                        f.desc[i]=0; }
                    300:                                                close(file);
                    301:                                                f.misc|=FM_EXTDESC; 
                    302:                                        } 
                    303:                                } 
                    304:                        }
                    305: 
                    306:                        f.dateuled=time(NULL);
                    307:                        f.altpath=cur_altpath;
                    308:                        prep_desc(f.desc);
                    309:                        if(mode&ASCII_ONLY)
                    310:                                strip_exascii(f.desc);
                    311:                        if(exist) {
                    312:                                putfiledat(&scfg,&f);
                    313:                                if(!(mode&NO_NEWDATE))
                    314:                                        update_uldate(&scfg, &f); 
                    315:                        }
                    316:                        else
                    317:                                addfiledat(&scfg,&f);
                    318:                        if(f.misc&FM_EXTDESC) {
                    319:                                truncsp(ext);
                    320:                                putextdesc(&scfg,f.dir,f.datoffset,ext); 
                    321:                        }
                    322:                        if(mode&UL_STATS)
                    323:                                updatestats(f.cdt);
                    324:                        files++; 
                    325:                }
                    326:                if(dir!=NULL)
                    327:                        closedir(dir);
                    328:                return; 
                    329:        }
                    330: 
                    331: 
                    332:        strcpy(listpath,inpath);
                    333:        fexistcase(listpath);
                    334:        if((stream=fopen(listpath,"r"))==NULL) {
                    335:                fprintf(stderr,"Error %d (%s) opening %s\n"
                    336:                        ,errno,strerror(errno),listpath);
                    337:                sprintf(listpath,"%s%s",cur_altpath ? scfg.altpath[cur_altpath-1]
                    338:                                : scfg.dir[f.dir]->path,inpath);
                    339:                fexistcase(listpath);
                    340:                if((stream=fopen(listpath,"r"))==NULL) {
                    341:                        printf("Can't open: %s\n"
                    342:                                   "        or: %s\n",inpath,listpath);
                    343:                        return; 
                    344:                } 
                    345:        }
                    346: 
                    347:        printf("Adding %s to %s %s\n\n"
                    348:                ,listpath,scfg.lib[scfg.dir[f.dir]->lib]->sname,scfg.dir[f.dir]->sname);
                    349: 
                    350:        fgets(nextline,255,stream);
                    351:        while(!feof(stream) && !ferror(stream)) {
                    352:                f.misc=0;
                    353:                f.desc[0]=0;
                    354:                strcpy(curline,nextline);
                    355:                nextline[0]=0;
                    356:                fgets(nextline,255,stream);
                    357:                truncsp(curline);
                    358:                if(curline[0]<=' ' || (mode&ASCII_ONLY && (uchar)curline[0]>=0x7e))
                    359:                        continue;
                    360:                printf("%s\n",curline);
                    361:                strcpy(fname,curline);
                    362: 
                    363:                p=strchr(fname,'.');
                    364:                if(!p || p==fname || p>fname+8)    /* no dot or invalid dot location */
                    365:                        continue;
                    366:                p=strchr(p,' ');
                    367:                if(p) *p=0;
                    368:                else                               /* no space after filename? */
                    369:                        continue;
                    370: #if 0
                    371:                strupr(fname);
                    372: #endif
                    373:                strcpy(fname,unpadfname(fname,tmp));
                    374: 
                    375:                padfname(fname,f.name);
                    376:                if(strcspn(f.name,"\\/|<>+[]:=\";,")!=strlen(f.name))
                    377:                        continue;
                    378: 
                    379:                for(i=0;i<12;i++)
                    380:                        if(f.name[i]<' ' || (mode&ASCII_ONLY && (uchar)f.name[i]>0x7e))
                    381:                                break;
                    382: 
                    383:                if(i<12)                                        /* Ctrl chars or EX-ASCII in filename? */
                    384:                        continue;
                    385:                exist=findfile(&scfg,f.dir,f.name);
                    386:                if(exist) {
                    387:                        if(mode&NO_UPDATE)
                    388:                                continue;
                    389:                        getfileixb(&scfg,&f);
                    390:                        if(mode&ULDATE_ONLY) {
                    391:                                f.dateuled=time(NULL);
                    392:                                update_uldate(&scfg, &f);
                    393:                                continue; 
                    394:                        } 
                    395:                }
                    396: 
                    397:                sprintf(filepath,"%s%s",cur_altpath ? scfg.altpath[cur_altpath-1]
                    398:                        : scfg.dir[f.dir]->path,fname);
                    399: 
                    400:                if(mode&FILE_DATE) {            /* get the file date and put into desc */
                    401:                        l=fdate(filepath);
                    402:                        unixtodstr(&scfg,l,f.desc);
                    403:                        strcat(f.desc,"  "); 
                    404:                }
                    405: 
                    406:                if(mode&TODAYS_DATE) {          /* put today's date in desc */
                    407:                        l=time(NULL);
                    408:                        unixtodstr(&scfg,l,f.desc);
                    409:                        strcat(f.desc,"  "); 
                    410:                }
                    411: 
                    412:                if(dskip && strlen(curline)>=dskip) p=curline+dskip;
                    413:                else {
                    414:                        p++;
                    415:                        while(*p==' ') p++; 
                    416:                }
                    417:                SAFECOPY(tmp,p);
                    418:                prep_desc(tmp);
                    419:                sprintf(f.desc+strlen(f.desc),"%.*s",(int)(LEN_FDESC-strlen(f.desc)),tmp);
                    420: 
                    421:                if(nextline[0]==' ' || strlen(p)>LEN_FDESC) {   /* ext desc */
                    422:                        if(!(mode&NO_EXTEND)) {
                    423:                                memset(ext,0,513);
                    424:                                f.misc|=FM_EXTDESC;
                    425:                                sprintf(ext,"%s\r\n",p); 
                    426:                        }
                    427: 
                    428:                        if(nextline[0]==' ') {
                    429:                                strcpy(str,nextline);                              /* tack on to end of desc */
                    430:                                p=str+dskip;
                    431:                                while(*p && *p<=' ') p++;
                    432:                                i=LEN_FDESC-strlen(f.desc);
                    433:                                if(i>1) {
                    434:                                        p[i-1]=0;
                    435:                                        truncsp(p);
                    436:                                        if(p[0]) {
                    437:                                                strcat(f.desc," ");
                    438:                                                strcat(f.desc,p); 
                    439:                                        } 
                    440:                                } 
                    441:                        }
                    442: 
                    443:                        while(!feof(stream) && !ferror(stream) && strlen(ext)<512) {
                    444:                                if(nextline[0]!=' ')
                    445:                                        break;
                    446:                                truncsp(nextline);
                    447:                                printf("%s\n",nextline);
                    448:                                if(!(mode&NO_EXTEND)) {
                    449:                                        f.misc|=FM_EXTDESC;
                    450:                                        p=nextline+dskip;
                    451:                                        while(*p==' ') p++;
                    452:                                        strcat(ext,p);
                    453:                                        strcat(ext,"\r\n"); 
                    454:                                }
                    455:                                nextline[0]=0;
                    456:                                fgets(nextline,255,stream); 
                    457:                        } 
                    458:                }
                    459: 
                    460: 
                    461:                if(sskip) l=atol(fname+sskip);
                    462:                else {
                    463:                        l=flength(filepath);
                    464:                        if(l<1L) {
                    465:                                printf("%s not found.\n",filepath);
                    466:                                continue; 
                    467:                        } 
                    468:                }
                    469: 
                    470:                if(mode&FILE_ID) {
                    471:                        for(i=0;i<scfg.total_fextrs;i++)
                    472:                                if(!stricmp(scfg.fextr[i]->ext,f.name+9) && chk_ar(&scfg,scfg.fextr[i]->ar,NULL))
                    473:                                        break;
                    474:                        if(i<scfg.total_fextrs) {
                    475:                                sprintf(tmp,"%sFILE_ID.DIZ",scfg.temp_dir);
                    476:                                remove(tmp);
                    477:                                system(mycmdstr(scfg.fextr[i]->cmd,filepath,"FILE_ID.DIZ",NULL));
                    478:                                if(!fexistcase(tmp)) {
                    479:                                        sprintf(tmp,"%sDESC.SDI",scfg.temp_dir);
                    480:                                        remove(tmp);
                    481:                                        system(mycmdstr(scfg.fextr[i]->cmd,filepath,"DESC.SDI",NULL)); 
                    482:                                        fexistcase(tmp);
                    483:                                }
                    484:                                if((file=nopen(tmp,O_RDONLY|O_BINARY))!=-1) {
                    485:                                        memset(ext,0,513);
                    486:                                        read(file,ext,512);
                    487:                                        for(i=512;i;i--)
                    488:                                                if(ext[i-1]>' ')
                    489:                                                        break;
                    490:                                        ext[i]=0;
                    491:                                        if(mode&ASCII_ONLY)
                    492:                                                strip_exascii(ext);
                    493:                                        if(!(mode&KEEP_DESC)) {
                    494:                                                sprintf(tmpext,"%.256s",ext);
                    495:                                                prep_desc(tmpext);
                    496:                                                for(i=0;tmpext[i];i++)
                    497:                                                        if(isalpha(tmpext[i]))
                    498:                                                                break;
                    499:                                                sprintf(f.desc,"%.*s",LEN_FDESC,tmpext+i);
                    500:                                                for(i=0;f.desc[i]>=' ' && i<LEN_FDESC;i++)
                    501:                                                        ;
                    502:                                                f.desc[i]=0; 
                    503:                                        }
                    504:                                        close(file);
                    505:                                        f.misc|=FM_EXTDESC; 
                    506:                                } 
                    507:                        } 
                    508:                }
                    509: 
                    510:                f.cdt=l;
                    511:                f.dateuled=time(NULL);
                    512:                f.altpath=cur_altpath;
                    513:                prep_desc(f.desc);
                    514:                if(mode&ASCII_ONLY)
                    515:                        strip_exascii(f.desc);
                    516:                if(exist) {
                    517:                        putfiledat(&scfg,&f);
                    518:                        if(!(mode&NO_NEWDATE))
                    519:                                update_uldate(&scfg, &f); 
                    520:                }
                    521:                else
                    522:                        addfiledat(&scfg,&f);
                    523:                if(f.misc&FM_EXTDESC) {
                    524:                        truncsp(ext);
                    525:                        putextdesc(&scfg,f.dir,f.datoffset,ext); 
                    526:                }
                    527: 
                    528:                if(mode&UL_STATS)
                    529:                        updatestats(l);
                    530:                files++; 
                    531:        }
                    532:        fclose(stream);
                    533:        if(mode&DEL_LIST && !(mode&SYNC_LIST)) {
                    534:                printf("\nDeleting %s\n",listpath);
                    535:                remove(listpath); 
                    536:        }
                    537: 
                    538: }
                    539: 
                    540: void synclist(char *inpath, int dirnum)
                    541: {
                    542:        uchar   str[1024];
                    543:        char    fname[MAX_PATH+1];
                    544:        char    listpath[MAX_PATH+1];
                    545:        uchar*  ixbbuf;
                    546:        uchar*  p;
                    547:        int             i,file,found;
                    548:        long    l,m,length;
                    549:        FILE*   stream;
                    550:        file_t  f;
                    551: 
                    552:        sprintf(str,"%s%s.ixb",scfg.dir[dirnum]->data_dir,scfg.dir[dirnum]->code);
                    553:        if((file=nopen(str,O_RDONLY|O_BINARY))==-1) {
                    554:                printf("ERR_OPEN %s\n",str);
                    555:                return; 
                    556:        }
                    557:        length=filelength(file);
                    558:        if(length%F_IXBSIZE) {
                    559:                close(file);
                    560:                printf("ERR_LEN (%ld) of %s\n",length,str);
                    561:                return; 
                    562:        }
                    563:        if((ixbbuf=(uchar *)malloc(length))==NULL) {
                    564:                close(file);
                    565:                printf("ERR_ALLOC %s\n",str);
                    566:                return; 
                    567:        }
                    568:        if(lread(file,ixbbuf,length)!=length) {
                    569:                close(file);
                    570:                free((char *)ixbbuf);
                    571:                printf("ERR_READ %s\n",str);
                    572:                return; 
                    573:        }
                    574:        close(file);
                    575: 
                    576:        strcpy(listpath,inpath);
                    577:        if((stream=fopen(listpath,"r"))==NULL) {
                    578:                sprintf(listpath,"%s%s",cur_altpath ? scfg.altpath[cur_altpath-1]
                    579:                                : scfg.dir[dirnum]->path,inpath);
                    580:                if((stream=fopen(listpath,"r"))==NULL) {
                    581:                        printf("Can't open: %s\n"
                    582:                                   "        or: %s\n",inpath,listpath);
                    583:                        return; 
                    584:                } 
                    585:        }
                    586: 
                    587:        printf("\nSynchronizing %s with %s %s\n\n"
                    588:                ,listpath,scfg.lib[scfg.dir[dirnum]->lib]->sname,scfg.dir[dirnum]->sname);
                    589: 
                    590:        for(l=0;l<length;l+=F_IXBSIZE) {
                    591:                m=l;
                    592:                for(i=0;i<12 && l<length;i++)
                    593:                        if(i==8)
                    594:                                str[i]=ixbbuf[m]>' ' ? '.' : ' ';
                    595:                        else
                    596:                                str[i]=ixbbuf[m++];     /* Turns FILENAMEEXT into FILENAME.EXT */
                    597:                str[i]=0;
                    598:                unpadfname(str,fname);
                    599:                rewind(stream);
                    600:                found=0;
                    601:                while(!found) {
                    602:                        if(!fgets(str,1000,stream))
                    603:                                break;
                    604:                        truncsp(str);
                    605:                        p=strchr(str,' ');
                    606:                        if(p) *p=0;
                    607:                        if(!stricmp(str,fname))
                    608:                                found=1; 
                    609:                }
                    610:                if(found)
                    611:                        continue;
                    612:                padfname(fname,f.name);
                    613:                printf("%s not found in list - ",f.name);
                    614:                f.dir=dirnum;
                    615:                f.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16);
                    616:                getfiledat(&scfg,&f);
                    617:                if(f.opencount) {
                    618:                        printf("currently OPEN by %u users\n",f.opencount);
                    619:                        continue; 
                    620:                }
                    621:                removefiledat(&scfg,&f);
                    622:                if(remove(getfilepath(&scfg,&f,str)))
                    623:                        printf("Error removing %s\n",str);
                    624:                removed++;
                    625:                printf("Removed from database\n"); 
                    626:        }
                    627: 
                    628:        if(mode&DEL_LIST) {
                    629:                printf("\nDeleting %s\n",listpath);
                    630:                remove(listpath); 
                    631:        }
                    632: }
                    633: 
                    634: char *usage="\nusage: addfiles code [.alt_path] [-opts] +list "
                    635:                         "[desc_off] [size_off]"
                    636:        "\n   or: addfiles code [.alt_path] [-opts] file "
                    637:                "\"description\"\n"
                    638:        "\navailable opts:"
                    639:        "\n       a         import ASCII only (no extended ASCII)"
                    640:        "\n       b         synchronize database with file list (use with caution)"
                    641:        "\n       c         do not remove extra spaces from file description"
                    642:        "\n       d         delete list after import"
                    643:        "\n       e         do not import extended descriptions"
                    644:        "\n       f         include file date in descriptions"
                    645:        "\n       t         include today's date in descriptions"
                    646:        "\n       i         include added files in upload statistics"
                    647:        "\n       n         do not update information for existing files"
                    648:        "\n       o         update upload date only for existing files"
                    649:        "\n       u         do not update upload date for existing files"
                    650:        "\n       z         check for and import FILE_ID.DIZ and DESC.SDI"
                    651:        "\n       k         keep original short description (not DIZ)"
                    652:        "\n       s         search directory for files (no file list)"
                    653:        "\n       l<lib>    specify library (short name) to Auto-ADD"
                    654:        "\n       x<name>   specify uploader's user name (may require quotes)"
                    655:        "\n"
                    656:        "\nAuto-ADD:   use - in place of code for Auto-ADD of FILES.BBS"
                    657:        "\n            use -filename to Auto-ADD a different filename"
                    658:        "\n            use -l \"libname\" to only Auto-ADD files to a specific library"
                    659:        "\n"
                    660:        ;
                    661: 
                    662: /*********************/
                    663: /* Entry point (duh) */
                    664: /*********************/
                    665: int main(int argc, char **argv)
                    666: {
                    667:        char error[512];
                    668:        char revision[16];
                    669:        char str[MAX_PATH+1];
                    670:        char tmp[MAX_PATH+1];
                    671:        uchar *p,exist,listgiven=0,namegiven=0,ext[513]
                    672:                ,auto_name[MAX_PATH+1]="FILES.BBS";
                    673:        int i,j,file;
                    674:        uint desc_offset=0, size_offset=0;
                    675:        long l;
                    676:        file_t  f;
                    677: 
                    678:        sscanf("$Revision: 1.39 $", "%*s %s", revision);
                    679: 
                    680:        fprintf(stderr,"\nADDFILES v%s-%s (rev %s) - Adds Files to Synchronet "
                    681:                "Filebase\n"
                    682:                ,ADDFILES_VER
                    683:                ,PLATFORM_DESC
                    684:                ,revision
                    685:                );
                    686: 
                    687:        if(argc<2) {
                    688:                printf(usage);
                    689:                return(1); 
                    690:        }
                    691: 
                    692:        p=getenv("SBBSCTRL");
                    693:        if(p==NULL) {
                    694:                printf("\nSBBSCTRL environment variable not set.\n");
                    695:                printf("\nExample: SET SBBSCTRL=/sbbs/ctrl\n");
                    696:                exit(1); 
                    697:        }
                    698: 
                    699:        memset(&scfg,0,sizeof(scfg));
                    700:        scfg.size=sizeof(scfg);
                    701:        SAFECOPY(scfg.ctrl_dir,p);
                    702: 
                    703:        if(chdir(scfg.ctrl_dir)!=0)
                    704:                fprintf(stderr,"!ERROR changing directory to: %s", scfg.ctrl_dir);
                    705: 
                    706:        printf("\nLoading configuration files from %s\n",scfg.ctrl_dir);
                    707:        if(!load_cfg(&scfg,NULL,TRUE,error)) {
                    708:                fprintf(stderr,"!ERROR loading configuration files: %s\n",error);
                    709:                exit(1);
                    710:        }
                    711:        SAFECOPY(scfg.temp_dir,"../temp");
                    712:        prep_dir(scfg.ctrl_dir, scfg.temp_dir, sizeof(scfg.temp_dir));
                    713: 
                    714:        if(!(scfg.sys_misc&SM_LOCAL_TZ))
                    715:                putenv("TZ=UTC0");
                    716: 
                    717:        if(argv[1][0]=='*' || argv[1][0]=='-') {
                    718:                if(argv[1][1]=='?') {
                    719:                        printf(usage);
                    720:                        exit(0);
                    721:                }
                    722:                if(argv[1][1])
                    723:                        SAFECOPY(auto_name,argv[1]+1);
                    724:                mode|=AUTO_ADD;
                    725:                i=0; 
                    726:        } else {
                    727:                if(!isalnum(argv[1][0]) && argc==2) {
                    728:                        printf(usage);
                    729:                        return(1); 
                    730:                }
                    731: 
                    732:                for(i=0;i<scfg.total_dirs;i++)
                    733:                        if(!stricmp(scfg.dir[i]->code,argv[1])) /* use matchmatchi() instead? */
                    734:                                break;
                    735: 
                    736:                if(i>=scfg.total_dirs) {
                    737:                        printf("Directory code '%s' not found.\n",argv[1]);
                    738:                        exit(1); 
                    739:                } 
                    740:        }
                    741: 
                    742:        memset(&f,0,sizeof(file_t));
                    743:        f.dir=i;
                    744:        strcpy(f.uler,"-> ADDFILES <-");
                    745: 
                    746:        for(j=2;j<argc;j++) {
                    747:                if(argv[j][0]=='*')     /* set the uploader name (legacy) */
                    748:                        SAFECOPY(f.uler,argv[j]+1);
                    749:                else 
                    750:                        if(argv[j][0]=='-'
                    751:                        || argv[j][0]=='/'
                    752:                        ) {      /* options */
                    753:                        for(i=1;argv[j][i];i++)
                    754:                                switch(toupper(argv[j][i])) {
                    755:                                        case 'A':
                    756:                                                mode|=ASCII_ONLY;
                    757:                                                break;
                    758:                                        case 'B':
                    759:                                                mode|=(SYNC_LIST|NO_UPDATE);
                    760:                                                break;
                    761:                                        case 'C':
                    762:                                                mode|=KEEP_SPACE;
                    763:                                                break;
                    764:                                        case 'D':
                    765:                                                mode|=DEL_LIST;
                    766:                                                break;
                    767:                                        case 'E':
                    768:                                                mode|=NO_EXTEND;
                    769:                                                break;
                    770:                                        case 'I':
                    771:                                                mode|=UL_STATS;
                    772:                                                break;
                    773:                                        case 'L':
                    774:                                                j++;
                    775:                                                if(argv[j]==NULL) {
                    776:                                                        printf(usage);
                    777:                                                        return(-1);
                    778:                                                }
                    779:                                                SAFECOPY(lib,argv[j]);
                    780:                                                i=strlen(argv[j])-1;
                    781:                                                break;
                    782:                                        case 'X':
                    783:                                                j++;
                    784:                                                if(argv[j]==NULL) {
                    785:                                                        printf(usage);
                    786:                                                        return(-1);
                    787:                                                }
                    788:                                                SAFECOPY(f.uler,argv[j]);
                    789:                                                i=strlen(argv[j])-1;
                    790:                                                break;
                    791:                                        case 'Z':
                    792:                                                mode|=FILE_ID;
                    793:                                                break;
                    794:                                        case 'K':
                    795:                                                mode|=KEEP_DESC;         /* Don't use DIZ for short desc */
                    796:                                                break;
                    797:                                        case 'N':
                    798:                                                mode|=NO_UPDATE;
                    799:                                                break;
                    800:                                        case 'O':
                    801:                                                mode|=ULDATE_ONLY;
                    802:                                                break;
                    803:                                        case 'U':
                    804:                                                mode|=NO_NEWDATE;
                    805:                                                break;
                    806:                                        case 'F':
                    807:                                                mode|=FILE_DATE;
                    808:                                                break;
                    809:                                        case 'T':
                    810:                                                mode|=TODAYS_DATE;
                    811:                                                break;
                    812:                                        case 'S':
                    813:                                                mode|=SEARCH_DIR;
                    814:                                                break;
                    815:                                        default:
                    816:                                                printf(usage);
                    817:                                                return(1); 
                    818:                        } 
                    819:                }
                    820:                else if(isdigit(argv[j][0])) {
                    821:                        if(desc_offset==0)
                    822:                                desc_offset=atoi(argv[j]);
                    823:                        else
                    824:                                size_offset=atoi(argv[j]);
                    825:                        continue;
                    826:                }
                    827:                else if(argv[j][0]=='+') {      /* filelist - FILES.BBS */
                    828:                        listgiven=1;
                    829:                        if(argc > j+1
                    830:                                && isdigit(argv[j+1][0])) { /* skip x characters before description */
                    831:                                if(argc > j+2
                    832:                                        && isdigit(argv[j+2][0])) { /* skip x characters before size */
                    833:                                        addlist(argv[j]+1,f,atoi(argv[j+1]),atoi(argv[j+2]));
                    834:                                        j+=2; 
                    835:                                }
                    836:                                else {
                    837:                                        addlist(argv[j]+1,f,atoi(argv[j+1]),0);
                    838:                                        j++; 
                    839:                                } 
                    840:                        }
                    841:                        else
                    842:                                addlist(argv[j]+1,f,0,0);
                    843:                        if(mode&SYNC_LIST)
                    844:                                synclist(argv[j]+1,f.dir); 
                    845:                }
                    846:                else if(argv[j][0]=='.') {      /* alternate file path */
                    847:                        cur_altpath=atoi(argv[j]+1);
                    848:                        if(cur_altpath>scfg.altpaths) {
                    849:                                printf("Invalid alternate path.\n");
                    850:                                exit(1); 
                    851:                        } 
                    852:                }
                    853:                else {
                    854:                        namegiven=1;
                    855:                        padfname(argv[j],f.name);
                    856:                        f.desc[0]=0;
                    857: #if 0
                    858:                        strupr(f.name);
                    859: #endif
                    860:                        if(j+1==argc) {
                    861:                                printf("%s no description given.\n",f.name);
                    862:                                continue; 
                    863:                        }
                    864:                        sprintf(str,"%s%s",cur_altpath ? scfg.altpath[cur_altpath-1]
                    865:                                : scfg.dir[f.dir]->path,argv[j]);
                    866:                        if(mode&FILE_DATE)
                    867:                                sprintf(f.desc,"%s  ",unixtodstr(&scfg,fdate(str),tmp));
                    868:                        if(mode&TODAYS_DATE)
                    869:                                sprintf(f.desc,"%s  ",unixtodstr(&scfg,time(NULL),tmp));
                    870:                        sprintf(tmp,"%.*s",(int)(LEN_FDESC-strlen(f.desc)),argv[++j]);
                    871:                        strcpy(f.desc,tmp);
                    872:                        l=flength(str);
                    873:                        if(l==-1) {
                    874:                                printf("%s not found.\n",str);
                    875:                                continue; 
                    876:                        }
                    877:                        exist=findfile(&scfg,f.dir,f.name);
                    878:                        if(exist) {
                    879:                                if(mode&NO_UPDATE)
                    880:                                        continue;
                    881:                                getfileixb(&scfg,&f);
                    882:                                if(mode&ULDATE_ONLY) {
                    883:                                        f.dateuled=time(NULL);
                    884:                                        update_uldate(&scfg, &f);
                    885:                                        continue; 
                    886:                                } 
                    887:                        }
                    888:                        f.cdt=l;
                    889:                        f.dateuled=time(NULL);
                    890:                        f.altpath=cur_altpath;
                    891:                        prep_desc(f.desc);
                    892:                        if(mode&ASCII_ONLY)
                    893:                                strip_exascii(f.desc);
                    894:                        printf("%s %7lu %s\n",f.name,f.cdt,f.desc);
                    895:                        if(mode&FILE_ID) {
                    896:                                for(i=0;i<scfg.total_fextrs;i++)
                    897:                                        if(!stricmp(scfg.fextr[i]->ext,f.name+9) && chk_ar(&scfg,scfg.fextr[i]->ar,NULL))
                    898:                                                break;
                    899:                                if(i<scfg.total_fextrs) {
                    900:                                        sprintf(tmp,"%sFILE_ID.DIZ",scfg.temp_dir);
                    901:                                        remove(tmp);
                    902:                                        system(mycmdstr(scfg.fextr[i]->cmd,str,"FILE_ID.DIZ",NULL));
                    903:                                        if(!fexistcase(tmp)) {
                    904:                                                sprintf(tmp,"%sDESC.SDI",scfg.temp_dir);
                    905:                                                remove(tmp);
                    906:                                                system(mycmdstr(scfg.fextr[i]->cmd,str,"DESC.SDI",NULL)); 
                    907:                                                fexistcase(tmp);
                    908:                                        }
                    909:                                        if((file=nopen(tmp,O_RDONLY|O_BINARY))!=-1) {
                    910:                                                memset(ext,0,513);
                    911:                                                read(file,ext,512);
                    912:                                                if(!(mode&KEEP_DESC)) {
                    913:                                                        sprintf(f.desc,"%.*s",LEN_FDESC,ext);
                    914:                                                        for(i=0;f.desc[i]>=' ' && i<LEN_FDESC;i++)
                    915:                                                                ;
                    916:                                                        f.desc[i]=0; 
                    917:                                                }
                    918:                                                close(file);
                    919:                                                f.misc|=FM_EXTDESC; 
                    920:                                        } 
                    921:                                } 
                    922:                        }
                    923:                        if(exist) {
                    924:                                putfiledat(&scfg,&f);
                    925:                                if(!(mode&NO_NEWDATE))
                    926:                                        update_uldate(&scfg, &f); 
                    927:                        }
                    928:                        else
                    929:                                addfiledat(&scfg,&f);
                    930: 
                    931:                        if(f.misc&FM_EXTDESC)
                    932:                                putextdesc(&scfg,f.dir,f.datoffset,ext);
                    933: 
                    934:                        if(mode&UL_STATS)
                    935:                                updatestats(l);
                    936:                        files++; 
                    937:                } 
                    938:        }
                    939: 
                    940:        if(mode&AUTO_ADD) {
                    941:                for(i=0;i<scfg.total_dirs;i++) {
                    942:                        if(lib[0] && stricmp(scfg.lib[scfg.dir[i]->lib]->sname,lib))
                    943:                                continue;
                    944:                        if(scfg.dir[i]->misc&DIR_NOAUTO)
                    945:                                continue;
                    946:                        f.dir=i;
                    947:                        if(mode&SEARCH_DIR) {
                    948:                                addlist("",f,desc_offset,size_offset);
                    949:                                continue; 
                    950:                        }
                    951:                        sprintf(str,"%s%s.lst",scfg.dir[f.dir]->path,scfg.dir[f.dir]->code);
                    952:                        if(fexistcase(str) && flength(str)>0L) {
                    953:                                printf("Auto-adding %s\n",str);
                    954:                                addlist(str,f,desc_offset,size_offset);
                    955:                                if(mode&SYNC_LIST)
                    956:                                        synclist(str,i);
                    957:                                continue; 
                    958:                        }
                    959:                        sprintf(str,"%s%s",scfg.dir[f.dir]->path,auto_name);
                    960:                        if(fexistcase(str) && flength(str)>0L) {
                    961:                                printf("Auto-adding %s\n",str);
                    962:                                addlist(str,f,desc_offset,size_offset);
                    963:                                if(mode&SYNC_LIST)
                    964:                                        synclist(str,i);
                    965:                                continue; 
                    966:                        } 
                    967:                } 
                    968:        }
                    969: 
                    970:        else {
                    971:                if(!listgiven && !namegiven) {
                    972:                        sprintf(str,"%s%s.lst",scfg.dir[f.dir]->path, scfg.dir[f.dir]->code);
                    973:                        if(!fexistcase(str) || flength(str)<=0L)
                    974:                                sprintf(str,"%s%s",scfg.dir[f.dir]->path, auto_name);
                    975:                        addlist(str,f,desc_offset,size_offset);
                    976:                        if(mode&SYNC_LIST)
                    977:                                synclist(str,f.dir); 
                    978:                } 
                    979:        }
                    980: 
                    981:        printf("\n%lu file(s) added.",files);
                    982:        if(removed)
                    983:                printf("\n%lu files(s) removed.",removed);
                    984:        printf("\n");
                    985:        return(0);
                    986: }
                    987: 

unix.superglobalmegacorp.com

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