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