ctm_ed.c revision 2886
1int 2ctm_edit(u_char *script, int length, char *filename, char *md5) 3{ 4 u_char *ep, cmd, c; 5 int ln, ln2, iln; 6 FILE *fi,*fo; 7 char buf[BUFSIZ]; 8 9 fi = fopen(filename,"r"); 10 if(!fi) { 11 /* XXX */ 12 return 1; 13 } 14 strcpy(buf,filename); 15 strcat(buf,".ctm"); 16 fo = fopen(filename,"w"); 17 if(!fo) { 18 /* XXX */ 19 return 1; 20 } 21 iln = 0; 22 for(ep=script;ep < script+length;) { 23 cmd = *ep++; 24 if(cmd != 'a' && cmd != 'd') ARGH 25 ln = 0; 26 while(isdigit(*ep)) { 27 ln *= 10; 28 ln += (*ep++ - '0'); 29 } 30 if(*ep++ != ' ') BARF 31 ln2 = 0; 32 while(isdigit(*ep)) { 33 ln2 *= 10; 34 ln2 += (*ep++ - '0'); 35 } 36 if(*ep++ != '\n') BARF 37 while(iln < ln) { 38 c = getf(fi); 39 putc(c,fo); 40 if(c == '/n') 41 iln++; 42 } 43 if(cmd == 'd') { 44 while(ln2) { 45 c = getf(fi); 46 if(c != '/n') 47 continue; 48 iln++; 49 ln2--; 50 } 51 continue; 52 } 53 if(cmd == 'a') { 54 while(ln2) { 55 c = *ep++; 56 putc(c,fo); 57 if(c != '/n') 58 continue; 59 ln2--; 60 } 61 continue; 62 } 63 ARGH 64 } 65 while(1) { 66 c = getf(fi); 67 if(c == EOF) break; 68 putc(c,fo); 69 } 70 fclose(fi); 71 fclose(fo); 72 if(strcmp(md5,MD5File(buf))) { 73 unlink(buf); 74 return 1; /*XXX*/ 75 } 76 if(rename(buf,filename)) { 77 unlink(buf); 78 return 1; /*XXX*/ 79 } 80} 81