summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1994-09-21 04:38:48 +0000
committerphk <phk@FreeBSD.org>1994-09-21 04:38:48 +0000
commit5d04033c566e15e9913be1f6e7ebf192b3969935 (patch)
treee81af7ad51a3e05f28ecde6565a88d93ca23c71b
parentcf1b53abb4125b665122c280cad94251613ec065 (diff)
downloadFreeBSD-src-5d04033c566e15e9913be1f6e7ebf192b3969935.zip
FreeBSD-src-5d04033c566e15e9913be1f6e7ebf192b3969935.tar.gz
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.
-rw-r--r--usr.sbin/ctm/ctm/Makefile2
-rw-r--r--usr.sbin/ctm/ctm/ctm.c7
-rw-r--r--usr.sbin/ctm/ctm/ctm.h1
-rw-r--r--usr.sbin/ctm/ctm/ctm_ed.c27
-rw-r--r--usr.sbin/ctm/ctm/ctm_input.c16
-rw-r--r--usr.sbin/ctm/ctm/ctm_pass1.c52
-rw-r--r--usr.sbin/ctm/ctm/ctm_pass2.c12
-rw-r--r--usr.sbin/ctm/ctm/ctm_pass3.c28
-rw-r--r--usr.sbin/ctm/ctm_scan/ctm_scan.c5
-rw-r--r--usr.sbin/ctm/mkCTM/mkCTM2
10 files changed, 115 insertions, 37 deletions
diff --git a/usr.sbin/ctm/ctm/Makefile b/usr.sbin/ctm/ctm/Makefile
index 959c0a7..6906366 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 27fcc02..db449b2 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 142569b..7260e01 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 fae5920..219fafc 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 88a0fd6..582bdf7 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 832922e..a1ffaf6 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 e85baff..599f4da 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 3579104..fb39a71 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 623cd14..21145d7 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 6472580..a29bd76 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]
OpenPOWER on IntegriCloud