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