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

1.1     ! root        1: /* ADDPHOTO.C */
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: #include <io.h>
        !             6: #include <dos.h>
        !             7: #include <bios.h>
        !             8: #include <time.h>
        !             9: #include <ctype.h>
        !            10: #include <stdio.h>
        !            11: #include <share.h>
        !            12: #include <conio.h>
        !            13: #include <errno.h>
        !            14: #include <fcntl.h>
        !            15: #include <string.h>
        !            16: #include <stdlib.h>
        !            17: #include <stdarg.h>
        !            18: #include <malloc.h>
        !            19: #include <sys/stat.h>
        !            20: #include <sys/types.h>
        !            21: 
        !            22: #include "gen_defs.h"
        !            23: #include "crc32.h"
        !            24: #include "smmdefs.h"
        !            25: 
        !            26: extern int daylight=0;
        !            27: extern long timezone=0L;
        !            28: 
        !            29: 
        !            30: char *base41(unsigned int i, char *str)
        !            31: {
        !            32:        char c;
        !            33:        unsigned int j=41*41,k;
        !            34: 
        !            35: for(c=0;c<3;c++) {
        !            36:        k=i/j;
        !            37:        str[c]='0'+k;
        !            38:        i-=(k*j);
        !            39:        j/=41;
        !            40:        if(str[c]>=':')
        !            41:                str[c]='A'+(str[c]-':');
        !            42:        if(str[c]>='[')
        !            43:                str[c]='#'+(str[c]-'['); }
        !            44: str[c]=0;
        !            45: return(str);
        !            46: }
        !            47: 
        !            48: /****************************************************************************/
        !            49: /* Updates 16-bit "rcrc" with character 'ch'                                */
        !            50: /****************************************************************************/
        !            51: void ucrc16(uchar ch, ushort *rcrc) {
        !            52:     ushort i, cy;
        !            53:     uchar nch=ch;
        !            54:  
        !            55: for (i=0; i<8; i++) {
        !            56:     cy=*rcrc & 0x8000;
        !            57:     *rcrc<<=1;
        !            58:     if (nch & 0x80) *rcrc |= 1;
        !            59:     nch<<=1;
        !            60:     if (cy) *rcrc ^= 0x1021; }
        !            61: }
        !            62: 
        !            63: /****************************************************************************/
        !            64: /* Returns 16-crc of string (not counting terminating NULL)                 */
        !            65: /****************************************************************************/
        !            66: ushort crc16(char *str)
        !            67: {
        !            68:     int     i=0;
        !            69:     ushort  crc=0;
        !            70: 
        !            71: ucrc16(0,&crc);
        !            72: while(str[i])
        !            73:     ucrc16(str[i++],&crc);
        !            74: ucrc16(0,&crc);
        !            75: ucrc16(0,&crc);
        !            76: return(crc);
        !            77: }
        !            78: 
        !            79: /****************************************************************************/
        !            80: /* Returns 32-crc of string (not counting terminating NULL)                            */
        !            81: /****************************************************************************/
        !            82: ulong crc32(char *str)
        !            83: {
        !            84:        int i=0;
        !            85:        ulong crc=0xffffffffUL;
        !            86: 
        !            87:        while(str[i])
        !            88:                crc=ucrc32(str[i++],crc);
        !            89:        crc=~crc;
        !            90:        return(crc);
        !            91: }
        !            92: 
        !            93: /****************************************************************************/
        !            94: /* Checks the disk drive for the existence of a file. Returns 1 if it       */
        !            95: /* exists, 0 if it doesn't.                                                 */
        !            96: /****************************************************************************/
        !            97: char fexist(char *filespec)
        !            98: {
        !            99:     struct ffblk f;
        !           100: 
        !           101: if(findfirst(filespec,&f,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC)==0)
        !           102:     return(1);
        !           103: return(0);
        !           104: }
        !           105: 
        !           106: #define MV_BUFLEN      4096
        !           107: 
        !           108: /****************************************************************************/
        !           109: /* Moves or copies a file from one dir to another                           */
        !           110: /* both 'src' and 'dest' must contain full path and filename                */
        !           111: /* returns 0 if successful, -1 if error                                     */
        !           112: /****************************************************************************/
        !           113: int mv(char *src, char *dest, char copy)
        !           114: {
        !           115:        char str[256],*buf;
        !           116:        int  ind,outd;
        !           117:        long length,chunk=MV_BUFLEN,l;
        !           118:        struct ftime ftime;
        !           119:        FILE *inp,*outp;
        !           120: 
        !           121: if(copy)
        !           122:        printf("Copying %s to %s\n",src,dest);
        !           123: else
        !           124:        printf("Moving %s to %s\n",src,dest);
        !           125: if(!stricmp(src,dest))  /* source and destination are the same! */
        !           126:        return(0);
        !           127: if(!fexist(src))
        !           128:        return(1);
        !           129: if(!copy && fexist(dest))
        !           130:        return(2);
        !           131: if(!copy && ((src[1]!=':' && dest[1]!=':')
        !           132:        || (src[1]==':' && dest[1]==':' && toupper(src[0])==toupper(dest[0])))) {
        !           133:        if(rename(src,dest))                                       /* same drive, so move */
        !           134:                return(3);
        !           135:        return(0); }
        !           136: if((ind=open(src,O_RDONLY|O_BINARY))==-1)
        !           137:        return(4);
        !           138: if((inp=fdopen(ind,"rb"))==NULL) {
        !           139:        close(ind);
        !           140:        return(5); }
        !           141: setvbuf(inp,NULL,_IOFBF,32*1024);
        !           142: if((outd=open(dest,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE|S_IREAD))==-1) {
        !           143:        fclose(inp);
        !           144:        return(6); }
        !           145: if((outp=fdopen(outd,"wb"))==NULL) {
        !           146:        close(outd);
        !           147:        fclose(inp);
        !           148:        return(7); }
        !           149: setvbuf(outp,NULL,_IOFBF,8*1024);
        !           150: length=filelength(ind);
        !           151: if(!length) {
        !           152:        fclose(inp);
        !           153:        fclose(outp);
        !           154:        return(8); }
        !           155: if((buf=(char *)MALLOC(MV_BUFLEN))==NULL) {
        !           156:        fclose(inp);
        !           157:        fclose(outp);
        !           158:        return(9); }
        !           159: l=0L;
        !           160: while(l<length) {
        !           161:        if(l+chunk>length)
        !           162:                chunk=length-l;
        !           163:        if(fread(buf,1,chunk,inp)!=chunk) {
        !           164:                FREE(buf);
        !           165:                fclose(inp);
        !           166:                fclose(outp);
        !           167:                return(10); }
        !           168:        if(fwrite(buf,1,chunk,outp)!=chunk) {
        !           169:                FREE(buf);
        !           170:                fclose(inp);
        !           171:                fclose(outp);
        !           172:                return(11); }
        !           173:        l+=chunk; }
        !           174: getftime(ind,&ftime);
        !           175: setftime(outd,&ftime);
        !           176: FREE(buf);
        !           177: fclose(inp);
        !           178: fclose(outp);
        !           179: if(!copy && remove(src))
        !           180:        return(12);
        !           181: return(0);
        !           182: }
        !           183: 
        !           184: time_t checktime()
        !           185: {
        !           186:        struct tm tm;
        !           187: 
        !           188: memset(&tm,0,sizeof(tm));
        !           189: tm.tm_year=94;
        !           190: tm.tm_mday=1;
        !           191: return(mktime(&tm)^0x2D24BD00L);
        !           192: }
        !           193: 
        !           194: 
        !           195: int main(int argc, char **argv)
        !           196: {
        !           197:        char str[128],fname[128],path[128],tmp[128],*p;
        !           198:        int i,file;
        !           199:        FILE *index, *stream;
        !           200:        ulong number,crc;
        !           201:        user_t user;
        !           202:        ixb_t ixb;
        !           203: 
        !           204: printf("\nADDPHOTO v1.01 - Synchronet Match Maker Photograph Addition\n\n");
        !           205: 
        !           206: if(checktime()) {
        !           207:     printf("Time problem!\n");
        !           208:        exit(1); }
        !           209: 
        !           210: if(argc<4) {
        !           211:        printf("usage: addphoto filename.ext user_number system_name\n");
        !           212:        exit(1); }
        !           213: 
        !           214: strupr(argv[1]);
        !           215: if(!fexist(argv[1])) {
        !           216:        printf("%s doesn't exist\n",argv[1]);
        !           217:        exit(1); }
        !           218: 
        !           219: if((file=open("SMM.DAB",O_RDWR|O_BINARY|O_DENYNONE|O_CREAT
        !           220:     ,S_IWRITE|S_IREAD))==-1) {
        !           221:        printf("\n\7Error opening/creating SMM.DAB\n");
        !           222:     exit(1); }
        !           223: if((stream=fdopen(file,"w+b"))==NULL) {
        !           224:        printf("\n\7Error converting SMM.DAB file handle to stream\n");
        !           225:     exit(1); }
        !           226: setvbuf(stream,0L,_IOFBF,4096);
        !           227: 
        !           228: if((file=open("SMM.IXB",O_RDWR|O_BINARY|O_DENYNONE|O_CREAT
        !           229:     ,S_IWRITE|S_IREAD))==-1) {
        !           230:        printf("\n\7Error opening/creating SMM.IXB\n");
        !           231:     exit(1); }
        !           232: if((index=fdopen(file,"w+b"))==NULL) {
        !           233:        printf("\n\7Error converting SMM.IXB file handle to stream\n");
        !           234:     exit(1); }
        !           235: setvbuf(stream,0L,_IOFBF,1024);
        !           236: 
        !           237: number=atol(argv[2]);
        !           238: str[0]=0;
        !           239: for(i=3;i<argc;i++) {
        !           240:        if(str[0])
        !           241:                strcat(str," ");
        !           242:        strcat(str,argv[i]); }
        !           243: 
        !           244: strupr(str);
        !           245: str[25]=0;
        !           246: 
        !           247: crc=crc32(str);
        !           248: rewind(index);
        !           249: i=0;
        !           250: while(!feof(index)) {
        !           251:        if(!fread(&ixb,sizeof(ixb_t),1,index))
        !           252:                break;
        !           253:        if(!ixb.number)    /* DELETED */
        !           254:                continue;
        !           255:        if(ixb.system!=crc || ixb.number!=number)
        !           256:                continue;
        !           257:        fseek(stream
        !           258:                ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t))
        !           259:                *sizeof(user_t),SEEK_SET);
        !           260:        if(!fread(&user,sizeof(user_t),1,stream))
        !           261:                continue;
        !           262:        i=1;
        !           263:        break; }
        !           264: if(!i) {
        !           265:        printf("\7User #%lu @ %s not found!\n",number,str);
        !           266:        exit(2); }
        !           267: 
        !           268: for(i=0;user.system[i];i++)
        !           269:        if(isalnum(user.system[i]))
        !           270:         break;
        !           271: if(!user.system[i])
        !           272:        fname[0]='~';
        !           273: else
        !           274:        fname[0]=user.system[i];
        !           275: for(i=strlen(user.system)-1;i>0;i--)
        !           276:        if(isalnum(user.system[i]))
        !           277:                break;
        !           278: if(i<=0)
        !           279:        fname[1]='~';
        !           280: else
        !           281:        fname[1]=user.system[i];
        !           282: fname[2]=0;
        !           283: strupr(user.system);
        !           284: strcat(fname,base41(crc16(user.system),tmp));
        !           285: strcat(fname,base41(user.number,tmp));
        !           286: p=strrchr(argv[1],'.');
        !           287: if(p)
        !           288:        strcat(fname,p);
        !           289: strupr(fname);
        !           290: mkdir("PHOTO");
        !           291: sprintf(path,"PHOTO\\%s",fname);
        !           292: if((i=mv(argv[1],path,1))!=0) {
        !           293:        printf("\7ERROR %d copying %s to %s\n",i,argv[1],path);
        !           294:        exit(3); }
        !           295: 
        !           296: user.misc|=USER_PHOTO;
        !           297: user.updated=time(NULL);
        !           298: user.photo=0;
        !           299: fseek(stream
        !           300:        ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t))
        !           301:        *sizeof(user_t),SEEK_SET);
        !           302: fwrite(&user,sizeof(user_t),1,stream);
        !           303: ixb.updated=user.updated;
        !           304: fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET);
        !           305: fwrite(&ixb,sizeof(ixb_t),1,index);
        !           306: 
        !           307: printf("%s added successfully!\n",argv[1]);
        !           308: return(0);
        !           309: }
        !           310: 

unix.superglobalmegacorp.com

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