diff options
author | Poul-Henning Kamp <phk@FreeBSD.org> | 1994-09-21 04:38:48 +0000 |
---|---|---|
committer | Poul-Henning Kamp <phk@FreeBSD.org> | 1994-09-21 04:38:48 +0000 |
commit | caabd87d0ac8ed5055f039f8511484135dd968e3 (patch) | |
tree | e81af7ad51a3e05f28ecde6565a88d93ca23c71b /usr.sbin/ctm | |
parent | 1aa57be3619a7594208c62f58e923d601e363a7d (diff) | |
download | src-caabd87d0ac8ed5055f039f8511484135dd968e3.tar.gz src-caabd87d0ac8ed5055f039f8511484135dd968e3.zip |
The next batch of refinements. Now it no longer needs to call on ed(1) to
fix our files, it has a builtin "diff -n" editor.
Notes
Notes:
svn path=/head/; revision=2948
Diffstat (limited to 'usr.sbin/ctm')
-rw-r--r-- | usr.sbin/ctm/ctm/Makefile | 2 | ||||
-rw-r--r-- | usr.sbin/ctm/ctm/ctm.c | 7 | ||||
-rw-r--r-- | usr.sbin/ctm/ctm/ctm.h | 1 | ||||
-rw-r--r-- | usr.sbin/ctm/ctm/ctm_ed.c | 27 | ||||
-rw-r--r-- | usr.sbin/ctm/ctm/ctm_input.c | 16 | ||||
-rw-r--r-- | usr.sbin/ctm/ctm/ctm_pass1.c | 52 | ||||
-rw-r--r-- | usr.sbin/ctm/ctm/ctm_pass2.c | 12 | ||||
-rw-r--r-- | usr.sbin/ctm/ctm/ctm_pass3.c | 28 | ||||
-rw-r--r-- | usr.sbin/ctm/ctm_scan/ctm_scan.c | 5 | ||||
-rw-r--r-- | usr.sbin/ctm/mkCTM/mkCTM | 2 |
10 files changed, 115 insertions, 37 deletions
diff --git a/usr.sbin/ctm/ctm/Makefile b/usr.sbin/ctm/ctm/Makefile index 959c0a7e0a8d..690636621f73 100644 --- a/usr.sbin/ctm/ctm/Makefile +++ b/usr.sbin/ctm/ctm/Makefile @@ -15,5 +15,5 @@ SRCS= ctm.c ctm_input.c ctm_pass1.c ctm_pass2.c ctm_pass3.c \ ctm_syntax.c ctm_ed.c LDADD+= -lmd NOMAN= 1 -CFLAGS+= -Wall +CFLAGS+= -Wall -g .include <bsd.prog.mk> diff --git a/usr.sbin/ctm/ctm/ctm.c b/usr.sbin/ctm/ctm/ctm.c index 27fcc02997a8..db449b21abe9 100644 --- a/usr.sbin/ctm/ctm/ctm.c +++ b/usr.sbin/ctm/ctm/ctm.c @@ -50,6 +50,7 @@ main(int argc, char **argv) while((c=getopt(argc,argv,"ab:B:cd:Fm:pPqr:R:T:Vv")) != -1) { switch (c) { + case 'c': CheckIt++; break; /* Only check it */ case 'p': Paranoid--; break; /* Less Paranoid */ case 'P': Paranoid++; break; /* More Paranoid */ case 'q': Verbose--; break; /* Quiet */ @@ -159,6 +160,11 @@ Proc(char *filename) f = popen(p,"r"); } + if(CheckIt) { + fprintf(stderr,"All ok\n"); + return 0; + } + if((i=Pass3(f))) return i; @@ -169,5 +175,6 @@ Proc(char *filename) Free(p); } + fprintf(stderr,"All ok\n"); return 0; } diff --git a/usr.sbin/ctm/ctm/ctm.h b/usr.sbin/ctm/ctm/ctm.h index 142569b38bc6..7260e01148d4 100644 --- a/usr.sbin/ctm/ctm/ctm.h +++ b/usr.sbin/ctm/ctm/ctm.h @@ -100,6 +100,7 @@ EXTERN int Paranoid; EXTERN int Verbose; EXTERN int Exit; EXTERN int Force; +EXTERN int CheckIt; char * String(char *s); diff --git a/usr.sbin/ctm/ctm/ctm_ed.c b/usr.sbin/ctm/ctm/ctm_ed.c index fae5920e00b7..219fafca31ac 100644 --- a/usr.sbin/ctm/ctm/ctm_ed.c +++ b/usr.sbin/ctm/ctm/ctm_ed.c @@ -31,7 +31,7 @@ ctm_edit(u_char *script, int length, char *filein, char *fileout) fclose(fi); return 4; } - iln = 0; + iln = 1; for(ep=script;ep < script+length;) { cmd = *ep++; if(cmd != 'a' && cmd != 'd') { ret = 1; goto bye; } @@ -47,23 +47,34 @@ ctm_edit(u_char *script, int length, char *filein, char *fileout) ln2 += (*ep++ - '0'); } if(*ep++ != '\n') { ret = 1; goto bye; } - while(iln < ln) { - c = getc(fi); - putc(c,fo); - if(c == '\n') - iln++; - } + + if(cmd == 'd') { + while(iln < ln) { + c = getc(fi); + if(c == EOF) { ret = 1; goto bye; } + putc(c,fo); + if(c == '\n') + iln++; + } while(ln2) { c = getc(fi); + if(c == EOF) { ret = 1; goto bye; } if(c != '\n') continue; - iln++; ln2--; + iln++; } continue; } if(cmd == 'a') { + while(iln <= ln) { + c = getc(fi); + if(c == EOF) { ret = 1; goto bye; } + putc(c,fo); + if(c == '\n') + iln++; + } while(ln2) { c = *ep++; putc(c,fo); diff --git a/usr.sbin/ctm/ctm/ctm_input.c b/usr.sbin/ctm/ctm/ctm_input.c index 88a0fd6d782a..582bdf7bb5e0 100644 --- a/usr.sbin/ctm/ctm/ctm_input.c +++ b/usr.sbin/ctm/ctm/ctm_input.c @@ -57,11 +57,15 @@ Ffield(FILE *fd, MD5_CTX *ctx,u_char term) MD5Update(ctx,buf,l); if(buf[l-1] != term) { Fatal("Corrupt patch."); - fprintf(stderr,"Expected \"%s\" but didn't find it.\n", - term == '\n' ? "\\n" : " "); + fprintf(stderr,"Expected \"%s\" but didn't find it {%02x}.\n", + term == '\n' ? "\\n" : " ",buf[l-1]); + if(Verbose > 4) + fprintf(stderr,"{%s}\n",buf); return 0; } buf[--l] = '\0'; + if(Verbose > 4) + fprintf(stderr,"<%s>\n",buf); return buf; } @@ -69,16 +73,18 @@ int Fbytecnt(FILE *fd, MD5_CTX *ctx, u_char term) { u_char *p,*q; - int u_chars; + int u_chars=0; p = Ffield(fd,ctx,term); if(!p) return -1; - for(q=p;*q;q++) + for(q=p;*q;q++) { if(!isdigit(*q)) { Fatal("Bytecount contains non-digit."); return -1; } - u_chars=atoi(p); + u_chars *= 10; + u_chars += (*q - '0'); + } if(u_chars > MAXSIZE) { Fatal("Bytecount too large."); return -1; diff --git a/usr.sbin/ctm/ctm/ctm_pass1.c b/usr.sbin/ctm/ctm/ctm_pass1.c index 832922ee6d24..a1ffaf62cb0f 100644 --- a/usr.sbin/ctm/ctm/ctm_pass1.c +++ b/usr.sbin/ctm/ctm/ctm_pass1.c @@ -25,6 +25,7 @@ Pass1(FILE *fd) int i,j,sep,cnt; u_char *md5=0,*trash=0; struct CTM_Syntax *sp; + int slashwarn=0; if(Verbose>3) printf("Pass1 -- Checking integrity of incomming CTM-patch\n"); @@ -86,19 +87,58 @@ Pass1(FILE *fd) switch (j & CTM_F_MASK) { case CTM_F_Name: /* XXX check for garbage and .. */ - case CTM_F_Uid: /* XXX check for garbage */ - case CTM_F_Gid: /* XXX check for garbage */ - case CTM_F_Mode: /* XXX check for garbage */ GETFIELD(p,sep); + j = strlen(p); + if(p[j-1] == '/' && !slashwarn) { + fprintf(stderr,"Warning: contains trailing slash\n"); + slashwarn++; + } + break; + case CTM_F_Uid: + GETFIELD(p,sep); + while(*p) { + if(!isdigit(*p)) { + Fatal("Non-digit in uid."); + return 32; + } + p++; + } + break; + case CTM_F_Gid: + GETFIELD(p,sep); + while(*p) { + if(!isdigit(*p)) { + Fatal("Non-digit in gid."); + return 32; + } + p++; + } + break; + case CTM_F_Mode: + GETFIELD(p,sep); + while(*p) { + if(!isdigit(*p)) { + Fatal("Non-digit in mode."); + return 32; + } + p++; + } break; case CTM_F_MD5: - if(j & CTM_Q_MD5_Chunk) + if(j & CTM_Q_MD5_Chunk) { GETFIELDCOPY(md5,sep); /* XXX check for garbage */ - else + } else if(j & CTM_Q_MD5_Before) { GETFIELD(p,sep); /* XXX check for garbage */ + } else if(j & CTM_Q_MD5_After) { + GETFIELD(p,sep); /* XXX check for garbage */ + } else { + fprintf(stderr,"List = 0x%x\n",j); + Fatal("Unqualified MD5."); + return 32; + } break; case CTM_F_Count: - GETBYTECNT(cnt,sep); /* XXX check for garbage */ + GETBYTECNT(cnt,sep); break; case CTM_F_Bytes: if(cnt < 0) WRONG diff --git a/usr.sbin/ctm/ctm/ctm_pass2.c b/usr.sbin/ctm/ctm/ctm_pass2.c index e85baffc10ce..599f4da21f2c 100644 --- a/usr.sbin/ctm/ctm/ctm_pass2.c +++ b/usr.sbin/ctm/ctm/ctm_pass2.c @@ -137,14 +137,20 @@ Pass2(FILE *fd) GETDATA(trash,cnt); if(!strcmp(sp->Key,"FN")) { p = tempnam(TmpDir,"CTMclient"); - i = ctm_edit(trash,cnt,name,p); - ret |= i; - if(i == 0 && strcmp(md5,MD5File(p))) { + j = ctm_edit(trash,cnt,name,p); + if(j) { + fprintf(stderr," %s: %s edit returned %d.\n", + sp->Key,name,j); + ret |= j; + return ret; + } else if(strcmp(md5,MD5File(p))) { fprintf(stderr," %s: %s edit fails.\n", sp->Key,name); ret |= 32; + return ret; } unlink(p); + free(p); } break; diff --git a/usr.sbin/ctm/ctm/ctm_pass3.c b/usr.sbin/ctm/ctm/ctm_pass3.c index 3579104ce6f6..fb39a719f9b3 100644 --- a/usr.sbin/ctm/ctm/ctm_pass3.c +++ b/usr.sbin/ctm/ctm/ctm_pass3.c @@ -83,47 +83,48 @@ Pass3(FILE *fd) default: WRONG } } + /* XXX This should go away. Disallow trailing '/' */ j = strlen(name)-1; if(name[j] == '/') name[j] = '\0'; + fprintf(stderr,"> %s %s\n",sp->Key,name); if(!strcmp(sp->Key,"FM") || !strcmp(sp->Key, "FS")) { i = open(name,O_WRONLY|O_CREAT|O_TRUNC,0644); if(i < 0) { perror(name); - continue; + WRONG } if(cnt != write(i,trash,cnt)) { perror(name); - continue; + WRONG } close(i); if(strcmp(md5,MD5File(name))) { fprintf(stderr," %s %s MD5 didn't come out right\n", sp->Key,name); - continue; + WRONG } continue; } if(!strcmp(sp->Key,"FE")) { - ed = popen("ed","w"); + ed = popen("ed -s","w"); if(!ed) { WRONG } - fprintf(ed,"e %s\n",name); if(cnt != fwrite(trash,1,cnt,ed)) { perror(name); pclose(ed); - continue; + WRONG } fprintf(ed,"w %s\n",name); if(pclose(ed)) { perror("ed"); - continue; + WRONG } if(strcmp(md5,MD5File(name))) { fprintf(stderr," %s %s MD5 didn't come out right\n", sp->Key,name); - continue; + WRONG } continue; } @@ -132,8 +133,17 @@ Pass3(FILE *fd) strcat(buf,".ctm"); i = ctm_edit(trash,cnt,name,buf); if(i) { + fprintf(stderr," %s %s Edit failed with code %d.\n", + sp->Key,name,i); + WRONG } rename(buf,name); + if(strcmp(md5,MD5File(name))) { + fprintf(stderr," %s %s Edit failed MD5 check.\n", + sp->Key,name); + WRONG + } + continue; } if(!strcmp(sp->Key,"DM")) { if(0 > mkdir(name,0755)) { @@ -142,7 +152,7 @@ Pass3(FILE *fd) } if(0 > stat(name,&st) || ((st.st_mode & S_IFMT) != S_IFDIR)) { fprintf(stderr,"<%s> mkdir failed\n",name); - exit(1); + WRONG } continue; } diff --git a/usr.sbin/ctm/ctm_scan/ctm_scan.c b/usr.sbin/ctm/ctm_scan/ctm_scan.c index 623cd1495004..21145d7aad20 100644 --- a/usr.sbin/ctm/ctm_scan/ctm_scan.c +++ b/usr.sbin/ctm/ctm_scan/ctm_scan.c @@ -65,9 +65,6 @@ Do(char *path) ret |= 1; continue; } - if((st.st_mode & S_IFMT) == S_IFDIR) { - strcat(buf,"/"); - } pde[nde] = malloc(strlen(buf+bufp)+1); strcpy(pde[nde++],buf+bufp); } @@ -83,7 +80,7 @@ Do(char *path) } switch(st.st_mode & S_IFMT) { case S_IFDIR: - i = printf("d %s %o %d %d - - -\n", + i = printf("d %s %d %d %d - - -\n", buf,st.st_mode & (~S_IFMT),st.st_uid,st.st_gid); if(!i) exit(-1); diff --git a/usr.sbin/ctm/mkCTM/mkCTM b/usr.sbin/ctm/mkCTM/mkCTM index 64725802a3c1..a29bd76b53b2 100644 --- a/usr.sbin/ctm/mkCTM/mkCTM +++ b/usr.sbin/ctm/mkCTM/mkCTM @@ -82,7 +82,7 @@ proc CTMchg {t1 n1 m1 u1 g1 b1 s1 h1 t2 n2 m2 u2 g2 b2 s2 h2} { incr changes return } - if {$b1 == "0" || $b2 == "0"} { + if {$b1 == "0" && $b2 == "0"} { puts stderr "E $b1$b2 $t1$t2 $n1" set i [catch "exec diff -e $d1/$n1 $d2/$n2 > tmp" j] set s [file size tmp] |