From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2295 invoked from network); 4 Apr 2000 14:07:42 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 4 Apr 2000 14:07:42 -0000 Received: (qmail 12585 invoked by alias); 4 Apr 2000 14:07:33 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 10467 Received: (qmail 12576 invoked from network); 4 Apr 2000 14:07:32 -0000 Date: Tue, 4 Apr 2000 16:07:06 +0200 (MET DST) Message-Id: <200004041407.QAA14710@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.auc.dk In-reply-to: "Bart Schaefer"'s message of Mon, 3 Apr 2000 10:01:15 +0000 Subject: PATCH: Re: zrecompile Bart Schaefer wrote: > } And another thing: the zwc files till use $ZSH_VERSION in the header > } to test for compatibility -- somehow I didn't like to add an additional > } version number scheme for them, but it would be better, I think (the > } format will certainly change less often than $ZSH_VERSION). > > Yea, but it'll be much less recognizable in the -t output. I think the > $ZSH_VERSION test is fine. > > On the other hand, that should be put in some immutable part of the file > header so that *any* version of zsh can be guaranteed to be able to read > it back -- to rephrase, we set the requirement NOW that changes to the > format of the header must only come *after* the version string (or some > equivalent requirement), so that it's always possible to display the > version mismatch (or at least know that was the reason for the error). For the change that lead to all this I had to change the magic numbers, because there was no version change at the time, btw... But still, this patch makes the error messages a bit more informative and adds a comment saying that the header should not be changed. Bye Sven Index: Src/builtin.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/builtin.c,v retrieving revision 1.3 diff -u -r1.3 builtin.c --- Src/builtin.c 2000/04/04 12:02:04 1.3 +++ Src/builtin.c 2000/04/04 14:03:05 @@ -2118,12 +2118,9 @@ /* Take the arguments literally -- do not glob */ for (; *argv; argv++) { - if (ops['w']) { - if (dump_autoload(*argv, on, ops, func)) { - zwarnnam(name, "invalid wordcode file: %s", *argv, 0); - returnval = 1; - } - } else if ((shf = (Shfunc) shfunctab->getnode(shfunctab, *argv))) { + if (ops['w']) + returnval = dump_autoload(name, *argv, on, ops, func); + else if ((shf = (Shfunc) shfunctab->getnode(shfunctab, *argv))) { /* if any flag was given */ if (on|off) { /* turn on/off the given flags */ Index: Src/parse.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/parse.c,v retrieving revision 1.2 diff -u -r1.2 parse.c --- Src/parse.c 2000/04/01 20:49:48 1.2 +++ Src/parse.c 2000/04/04 14:03:06 @@ -2196,6 +2196,9 @@ * file should be mapped or read and if this header is the `other' one), * the version string in a field of 40 characters and the descriptions * for the functions in the dump file. + * + * NOTE: this layout has to be kept; everything after it may be changed. + * * Each description consists of a struct fdhead followed by the name, * aligned to sizeof(wordcode) (i.e. 4 bytes). */ @@ -2302,11 +2305,10 @@ zwarnnam(nam, "too few arguments", NULL, 0); return 1; } - if (!(f = load_dump_header(*args)) && - !(f = load_dump_header(dyncat(*args, FD_EXT)))) { - zwarnnam(nam, "invalid dump file: %s", *args, 0); - return 1; - } + if (!(f = load_dump_header(nam, (strsfx(FD_EXT, *args) ? *args : + dyncat(*args, FD_EXT)), 1))) + return 1; + if (args[1]) { for (args++; *args; args++) if (!dump_find_func(f, *args)) @@ -2315,7 +2317,7 @@ } else { FDHead h, e = (FDHead) (f + fdheaderlen(f)); - printf("function dump file (%s) for zsh-%s\n", + printf("zwc file (%s) for zsh-%s\n", ((fdflags(f) & FDF_MAP) ? "mapped" : "read"), fdversion(f)); for (h = firstfdhead(f); h < e; h = nextfdhead(h)) printf("%s\n", fdname(h)); @@ -2344,18 +2346,23 @@ /**/ static Wordcode -load_dump_header(char *name) +load_dump_header(char *nam, char *name, int err) { - int fd; + int fd, v = 0; wordcode buf[FD_PRELEN + 1]; - if ((fd = open(name, O_RDONLY)) < 0) + if ((fd = open(name, O_RDONLY)) < 0) { + if (err) + zwarnnam(nam, "can't open zwc file: %s", name, 0); return NULL; - + } if (read(fd, buf, (FD_PRELEN + 1) * sizeof(wordcode)) != ((FD_PRELEN + 1) * sizeof(wordcode)) || (fdmagic(buf) != FD_MAGIC && fdmagic(buf) != FD_OMAGIC) || - strcmp(ZSH_VERSION, fdversion(buf))) { + (v = strcmp(ZSH_VERSION, fdversion(buf)))) { + if (err) + zwarnnam(nam, (v ? "invalid zwc file, wrong version: %s" : + "invalid zwc file: %s") , name, 0); close(fd); return NULL; } else { @@ -2372,6 +2379,7 @@ if (lseek(fd, o, 0) == -1 || read(fd, buf, (FD_PRELEN + 1) * sizeof(wordcode)) != ((FD_PRELEN + 1) * sizeof(wordcode))) { + zwarnnam(nam, "invalid zwc file: %s" , name, 0); close(fd); return NULL; } @@ -2384,6 +2392,7 @@ len - ((FD_PRELEN + 1) * sizeof(wordcode))) != len - ((FD_PRELEN + 1) * sizeof(wordcode))) { close(fd); + zwarnnam(nam, "invalid zwc file: %s" , name, 0); return NULL; } close(fd); @@ -2483,7 +2492,7 @@ dump = dyncat(dump, FD_EXT); if ((dfd = open(dump, O_WRONLY|O_CREAT, 0600)) < 0) { - zwarnnam(nam, "can't write dump file: %s", dump, 0); + zwarnnam(nam, "can't write zwc file: %s", dump, 0); return 1; } progs = newlinklist(); @@ -2614,7 +2623,7 @@ dump = dyncat(dump, FD_EXT); if ((dfd = open(dump, O_WRONLY|O_CREAT, 0600)) < 0) { - zwarnnam(nam, "can't write dump file: %s", dump, 0); + zwarnnam(nam, "can't write zwc file: %s", dump, 0); return 1; } progs = newlinklist(); @@ -2876,7 +2885,7 @@ #endif - if (!f && (isrec || !(d = load_dump_header(file)))) + if (!f && (isrec || !(d = load_dump_header(NULL, file, 0)))) return NULL; if ((h = dump_find_func(d, name))) { @@ -3014,7 +3023,7 @@ /**/ int -dump_autoload(char *file, int on, char *ops, int func) +dump_autoload(char *nam, char *file, int on, char *ops, int func) { Wordcode h; FDHead n, e; @@ -3024,7 +3033,7 @@ if (!strsfx(FD_EXT, file)) file = dyncat(file, FD_EXT); - if (!(h = load_dump_header(file))) + if (!(h = load_dump_header(nam, file, 1))) return 1; for (n = firstfdhead(h), e = (FDHead) (h + fdheaderlen(h)); n < e; -- Sven Wischnowsky wischnow@informatik.hu-berlin.de