|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.