Annotation of sbbs/sbbs2/smm/outphoto.c, revision 1.1

1.1     ! root        1: /* OUTPHOTO.C */
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: /* Scans SMM database and posts any photographs into the an SMB base */
        !             6: 
        !             7: #define  uint unsigned int
        !             8: 
        !             9: #include <dos.h>
        !            10: #include <share.h>
        !            11: #include "smblib.h"
        !            12: #include "smmdefs.h"
        !            13: #include "crc32.h"
        !            14: 
        !            15: #define DAYS 15L                        // Hatch every 15 days
        !            16: 
        !            17: smb_t smb;
        !            18: extern int daylight=0;
        !            19: extern long timezone=0L;
        !            20: 
        !            21: unsigned _stklen=16000;                  /* Set stack size in code, not header */
        !            22: 
        !            23: /****************************************************************************/
        !            24: /* Checks the disk drive for the existence of a file. Returns 1 if it       */
        !            25: /* exists, 0 if it doesn't.                                                 */
        !            26: /****************************************************************************/
        !            27: char fexist(char *filespec)
        !            28: {
        !            29:     struct ffblk f;
        !            30: 
        !            31: if(findfirst(filespec,&f,0)==0)
        !            32:     return(1);
        !            33: return(0);
        !            34: }
        !            35: 
        !            36: 
        !            37: /****************************************************************************/
        !            38: /* Updates 16-bit "rcrc" with character 'ch'                                */
        !            39: /****************************************************************************/
        !            40: void ucrc16(uchar ch, ushort *rcrc) {
        !            41:        ushort i, cy;
        !            42:     uchar nch=ch;
        !            43:  
        !            44: for (i=0; i<8; i++) {
        !            45:     cy=*rcrc & 0x8000;
        !            46:     *rcrc<<=1;
        !            47:     if (nch & 0x80) *rcrc |= 1;
        !            48:     nch<<=1;
        !            49:     if (cy) *rcrc ^= 0x1021; }
        !            50: }
        !            51: 
        !            52: /****************************************************************************/
        !            53: /* Returns 16-crc of string (not counting terminating NULL)                            */
        !            54: /****************************************************************************/
        !            55: ushort crc16(char *str)
        !            56: {
        !            57:        int     i=0;
        !            58:        ushort  crc=0;
        !            59: 
        !            60: ucrc16(0,&crc);
        !            61: while(str[i])
        !            62:        ucrc16(str[i++],&crc);
        !            63: ucrc16(0,&crc);
        !            64: ucrc16(0,&crc);
        !            65: return(crc);
        !            66: }
        !            67: 
        !            68: /****************************************************************************/
        !            69: /* Returns 32-crc of string (not counting terminating NULL)                            */
        !            70: /****************************************************************************/
        !            71: ulong crc32(char *str)
        !            72: {
        !            73:        int i=0;
        !            74:        ulong crc=0xffffffffUL;
        !            75: 
        !            76:        while(str[i])
        !            77:                crc=ucrc32(str[i++],crc);
        !            78:        crc=~crc;
        !            79:        return(crc);
        !            80: }
        !            81: 
        !            82: 
        !            83: char *base41(unsigned int i, char *str)
        !            84: {
        !            85:        char c;
        !            86:        unsigned int j=41*41,k;
        !            87: 
        !            88: for(c=0;c<3;c++) {
        !            89:        k=i/j;
        !            90:        str[c]='0'+k;
        !            91:        i-=(k*j);
        !            92:        j/=41;
        !            93:        if(str[c]>=':')
        !            94:                str[c]='A'+(str[c]-':');
        !            95:        if(str[c]>='[')
        !            96:                str[c]='#'+(str[c]-'['); }
        !            97: str[c]=0;
        !            98: return(str);
        !            99: }
        !           100: 
        !           101: 
        !           102: 
        !           103: time_t checktime()
        !           104: {
        !           105:        struct tm tm;
        !           106: 
        !           107: memset(&tm,0,sizeof(tm));
        !           108: tm.tm_year=94;
        !           109: tm.tm_mday=1;
        !           110: return(mktime(&tm)^0x2D24BD00L);
        !           111: }
        !           112: 
        !           113: #define BUF_LEN 8192
        !           114: 
        !           115: int main(int argc, char **argv)
        !           116: {
        !           117:        uchar   str[128],tmp[128],buf[BUF_LEN],fname[64],path[128],*p,ch;
        !           118:        int     i,j,file,in,linelen,all=0;
        !           119:        ushort  xlat;
        !           120:        long    length,l;
        !           121:        ulong   offset,crc;
        !           122:        time_t  now;
        !           123:        struct  ffblk ff;
        !           124:        user_t  user;
        !           125:        smbmsg_t msg;
        !           126:        FILE    *stream;
        !           127: 
        !           128: fprintf(stderr,"\nOUTPHOTO %s - Write SMM photos to SMB - Developed 1995-1997 "
        !           129:        "Rob Swindell\n\n",__DATE__);
        !           130: 
        !           131: if(checktime()) {
        !           132:     printf("Time problem!\n");
        !           133:     return(-1); }
        !           134: 
        !           135: if(argc<3) {
        !           136:        fprintf(stderr,"usage: outphoto <smm.dab> <smb_file>\n\n");
        !           137:        fprintf(stderr,"example: outphoto c:\\sbbs\\xtrn\\smm\\smm.dab "
        !           138:                "c:\\sbbs\\data\\subs\\syncdata\n");
        !           139:        return(1); }
        !           140: 
        !           141: for(i=3;i<argc;i++)
        !           142:        if(!stricmp(argv[i],"/ALL"))
        !           143:                all=1;
        !           144: 
        !           145: strcpy(smb.file,argv[2]);
        !           146: strupr(smb.file);
        !           147: 
        !           148: strcpy(str,argv[1]);
        !           149: strupr(str);
        !           150: if((file=open(str,O_RDWR|O_BINARY|O_DENYNONE))==-1) {
        !           151:        printf("error opening %s\n",str);
        !           152:        return(1); }
        !           153: if((stream=fdopen(file,"w+b"))==NULL) {
        !           154:        printf("error fdopening %s\n",str);
        !           155:        return(1); }
        !           156: setvbuf(stream,NULL,_IOFBF,4096);
        !           157: 
        !           158: sprintf(str,"%s.SHD",smb.file);
        !           159: if(!fexist(str)) {
        !           160:        printf("%s doesn't exist\n",smb.file);
        !           161:        return(0); }
        !           162: fprintf(stderr,"Opening %s\n",smb.file);
        !           163: smb.retry_time=30;
        !           164: if((i=smb_open(&smb))!=0) {
        !           165:        printf("smb_open returned %d\n",i);
        !           166:        return(1); }
        !           167: 
        !           168: now=time(NULL);
        !           169: while(!feof(stream)) {
        !           170:        if(!fread(&user,sizeof(user_t),1,stream))
        !           171:                break;
        !           172: 
        !           173:        if(user.misc&USER_DELETED || !(user.misc&USER_PHOTO))
        !           174:                continue;
        !           175: 
        !           176:        printf("Photo: %-25.25s  %.24s  "
        !           177:                ,user.name,ctime(&user.photo));
        !           178: 
        !           179:        if(user.photo && now-user.photo<DAYS*24L*60L*60L && !all) {
        !           180:                printf("skipping\n");
        !           181:                continue; }
        !           182:        printf("hatching\n");
        !           183: 
        !           184:        for(i=0;user.system[i];i++)
        !           185:                if(isalnum(user.system[i]))
        !           186:                        break;
        !           187:        if(!user.system[i])
        !           188:                fname[0]='~';
        !           189:        else
        !           190:                fname[0]=user.system[i];
        !           191:        for(i=strlen(user.system)-1;i>0;i--)
        !           192:                if(isalnum(user.system[i]))
        !           193:                        break;
        !           194:        if(i<=0)
        !           195:                fname[1]='~';
        !           196:        else
        !           197:                fname[1]=user.system[i];
        !           198:        fname[2]=0;
        !           199:        strcpy(str,user.system);
        !           200:        strupr(str);
        !           201:        strcat(fname,base41(crc16(str),tmp));
        !           202:        strcat(fname,base41(user.number,tmp));
        !           203:        strcpy(path,argv[1]);
        !           204:        p=strchr(path,'\\');
        !           205:        if(p) *(p+1)=0;
        !           206:        else path[0]=0;
        !           207:        sprintf(str,"%sPHOTO\\%s.*",path,fname);
        !           208:        if(findfirst(str,&ff,0)) {
        !           209:                printf("%s doesn't exist!\n",str);
        !           210:                continue; }
        !           211:        strcpy(fname,ff.ff_name);
        !           212:        strcpy(path,argv[1]);
        !           213:        p=strchr(path,'\\');
        !           214:        if(p) *(p+1)=0;
        !           215:        else path[0]=0;
        !           216:        sprintf(str,"%sPHOTO\\%s",path,fname);
        !           217: 
        !           218:        printf("Exporting %s",str);
        !           219:        if((in=open(str,O_RDONLY|O_BINARY|SH_DENYWR))==-1) {
        !           220:                printf("\nError opening %s\n",str);
        !           221:                continue; }
        !           222: 
        !           223:        memset(buf,0,BUF_LEN);
        !           224:        crc=0xffffffffUL;
        !           225:        linelen=0;
        !           226:        sprintf(buf,"%lx\r\n",filelength(in)^4096);
        !           227:        l=strlen(buf);
        !           228:        while(l<(BUF_LEN-128)) {
        !           229:                if(!read(in,&ch,1))
        !           230:                        break;
        !           231:                crc=ucrc32(ch,crc);
        !           232:                if(ch=='`') {
        !           233:                        buf[l++]='`';
        !           234:                        buf[l++]='`';
        !           235:                        linelen++; }
        !           236:                else if(ch==0xff)
        !           237:                        buf[l++]='\xee';
        !           238:                else if(ch<0xf)
        !           239:                        buf[l++]=ch|0xf0;
        !           240:                else if(ch<0x20) {
        !           241:                        buf[l++]='`';
        !           242:                        buf[l++]=ch+'@';
        !           243:                        linelen++; }
        !           244:                else if(ch>=0xf0) {
        !           245:                        sprintf(str,"`%x",ch&0xf);
        !           246:                        buf[l++]=str[0];
        !           247:                        buf[l++]=str[1];
        !           248:                        linelen++; }
        !           249:                else if(ch==0xe3) {
        !           250:                        buf[l++]='`';
        !           251:                        buf[l++]='g';
        !           252:                        linelen++; }
        !           253:                else if(ch==0x8d) {
        !           254:                        buf[l++]='`';
        !           255:                        buf[l++]='h';
        !           256:                        linelen++; }
        !           257:                else if(ch==0xee) {
        !           258:                        buf[l++]='`';
        !           259:                        buf[l++]='i';
        !           260:             linelen++; }
        !           261:                else
        !           262:                        buf[l++]=ch;
        !           263:                linelen++;
        !           264:                if(linelen>=70) {
        !           265:                        buf[l++]=CR;
        !           266:                        buf[l++]=LF;
        !           267:                        linelen=0; } }
        !           268:        buf[l]=0;
        !           269:        crc=~crc;
        !           270:        sprintf(str,"%lx\r\n--- OUTPHOTO %s",time(NULL),__DATE__);
        !           271:        strcat(buf,str);
        !           272:        printf("\n");
        !           273: 
        !           274:        length=strlen(buf);   /* +2 for translation string */
        !           275: 
        !           276:        if(smb.status.attr&SMB_HYPERALLOC)
        !           277:                offset=smb_hallocdat(&smb);
        !           278:        else {
        !           279:                i=smb_open_da(&smb);
        !           280:                if(i) {
        !           281:                        printf("smb_open_da returned %d\n",i);
        !           282:                        exit(1); }
        !           283:                offset=smb_allocdat(&smb,length+2,1);
        !           284:                fclose(smb.sda_fp); }
        !           285: 
        !           286:        fseek(smb.sdt_fp,offset,SEEK_SET);
        !           287:        xlat=XLAT_NONE;
        !           288:        fwrite(&xlat,2,1,smb.sdt_fp);
        !           289:        fwrite(buf,length,1,smb.sdt_fp);
        !           290:        length+=2;
        !           291: 
        !           292:        memset(&msg,0,sizeof(smbmsg_t));
        !           293:        memcpy(msg.hdr.id,"SHD\x1a",4);
        !           294:        msg.hdr.version=SMB_VERSION;
        !           295:        msg.hdr.when_written.time=time(NULL);
        !           296:     
        !           297:        msg.hdr.offset=offset;
        !           298: 
        !           299:        strcpy(str,"SMM PHOTO");
        !           300:        i=smb_hfield(&msg,RECIPIENT,strlen(str),str);
        !           301:        if(i) {
        !           302:                printf("smb_hfield returned %d\n",i);
        !           303:                smb_freemsgdat(&smb,offset,length,1);
        !           304:                exit(1); }
        !           305:        strlwr(str);
        !           306:        msg.idx.to=crc16(str);
        !           307: 
        !           308:        strcpy(str,"Digital Dynamics");
        !           309:        i=smb_hfield(&msg,SENDER,strlen(str),str);
        !           310:        if(i) {
        !           311:                printf("smb_hfield returned %d\n",i);
        !           312:                smb_freemsgdat(&smb,offset,length,1);
        !           313:                exit(1); }
        !           314:        strlwr(str);
        !           315:        msg.idx.from=crc16(str);
        !           316: 
        !           317:        sprintf(tmp,"%.25s",user.system);
        !           318:        strupr(tmp);
        !           319:        sprintf(str,"%04lx%08lx%08lx%.3s"
        !           320:                ,user.number^0x191L,crc32(tmp)^0x90120e71L,crc^0x05296328L,fname+9);
        !           321:        i=smb_hfield(&msg,SUBJECT,strlen(str),str);
        !           322:        if(i) {
        !           323:                printf("smb_hfield returned %d\n",i);
        !           324:                smb_freemsgdat(&smb,offset,length,1);
        !           325:                exit(1); }
        !           326:        strlwr(str);
        !           327:        msg.idx.subj=crc16(str);
        !           328: 
        !           329:        i=smb_dfield(&msg,TEXT_BODY,length);
        !           330:        if(i) {
        !           331:                printf("smb_dfield returned %d\n",i);
        !           332:                smb_freemsgdat(&smb,offset,length,1);
        !           333:                exit(1); }
        !           334: 
        !           335:        i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
        !           336:        if(i) {
        !           337:                printf("smb_addmsghdr returned %d\n",i);
        !           338:                smb_freemsgdat(&smb,offset,length,1);
        !           339:                exit(1); }
        !           340:        smb_freemsgmem(&msg);
        !           341:        fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET);
        !           342:        user.photo=time(NULL);
        !           343:        fwrite(&user,sizeof(user_t),1,stream);
        !           344:        fseek(stream,ftell(stream),SEEK_SET); }
        !           345: return(0);
        !           346: }
        !           347: 

unix.superglobalmegacorp.com

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