From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3466 invoked from network); 8 Jun 2001 18:17:36 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 8 Jun 2001 18:17:36 -0000 Received: (qmail 21289 invoked by alias); 8 Jun 2001 18:17:12 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 14813 Received: (qmail 21278 invoked from network); 8 Jun 2001 18:17:12 -0000 Date: Fri, 8 Jun 2001 14:17:19 -0400 From: Clint Adams To: zsh-workers@sunsite.dk Subject: PATCH: check deleted .zwc files Message-ID: <20010608141719.A4626@dman.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i This seems to work; functions can be autoloaded from deleted-but-still-open digest files. Is any further logic needed to prevent anything? Index: zshconfig.ac =================================================================== RCS file: /cvsroot/zsh/zsh/zshconfig.ac,v retrieving revision 1.3 diff -u -r1.3 zshconfig.ac --- zshconfig.ac 2001/06/06 16:55:23 1.3 +++ zshconfig.ac 2001/06/08 18:10:51 @@ -912,7 +912,8 @@ AC_CHECK_FUNCS(strftime difftime gettimeofday \ select poll \ - readlink lstat lchown faccessx fchdir ftruncate \ + readlink faccessx fchdir ftruncate \ + fstat lstat lchown \ fseeko ftello \ mkfifo _mktemp \ waitpid wait3 \ Index: Src/parse.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/parse.c,v retrieving revision 1.20 diff -u -r1.20 parse.c --- Src/parse.c 2001/05/15 08:38:59 1.20 +++ Src/parse.c 2001/06/08 18:10:52 @@ -2827,6 +2827,7 @@ d->addr = addr; d->len = len; d->count = 0; + d->filename = ztrdup(dump); } #endif @@ -2854,7 +2855,7 @@ dig = dyncat(path, FD_EXT); wc = dyncat(file, FD_EXT); - rd = stat(dig, &std); + rd = zwcstat(dig, &std, dumps); rc = stat(wc, &stc); rn = stat(file, &stn); @@ -2934,7 +2935,7 @@ struct stat lsbuf; if (!sbuf) { - if (stat(file, &lsbuf)) + if (zwcstat(file, &lsbuf, dumps)) return NULL; sbuf = &lsbuf; } @@ -3077,6 +3078,7 @@ dumps = p->next; munmap((void *) f->addr, f->len); zclose(f->fd); + zsfree(f->filename); zfree(f, sizeof(*f)); } } Index: Src/utils.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/utils.c,v retrieving revision 1.30 diff -u -r1.30 utils.c --- Src/utils.c 2001/05/29 15:09:06 1.30 +++ Src/utils.c 2001/06/08 18:10:53 @@ -3829,3 +3829,20 @@ return 0; } #endif + +/**/ +mod_export int +zwcstat(char *filename, struct stat *buf, FuncDump dumps) +{ + FuncDump f; + + if (stat(filename, buf)) { +#ifdef HAVE_FSTAT + for (f = dumps; f; f = f->next) { + if (!fstat(f->fd, buf)) return 0; + } +#endif + return 1; + } else return 0; + +} Index: Src/zsh.h =================================================================== RCS file: /cvsroot/zsh/zsh/Src/zsh.h,v retrieving revision 1.29 diff -u -r1.29 zsh.h --- Src/zsh.h 2001/05/15 16:32:28 1.29 +++ Src/zsh.h 2001/06/08 18:10:53 @@ -493,6 +493,7 @@ Wordcode addr; /* mapped region */ int len; /* length */ int count; /* reference count */ + char *filename; }; struct eprog {