From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6863 invoked from network); 1 Aug 2000 19:45:09 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 1 Aug 2000 19:45:09 -0000 Received: (qmail 5962 invoked by alias); 1 Aug 2000 19:44:57 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 12472 Received: (qmail 5955 invoked from network); 1 Aug 2000 19:44:56 -0000 Date: Tue, 1 Aug 2000 15:44:47 -0400 From: Clint Adams To: zsh-workers@sunsite.auc.dk Subject: PATCH: limited pathconf support Message-ID: <20000801154447.B29524@dman.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii User-Agent: Mutt/1.1.2i This is meant as a step toward getting rid of dependence on PATH_MAX. PATH_MAX is still used in several other places for static memory allocation, so this will need to be made dynamic, and in order to support filesystems where _PC_PATH_MAX is infinite, reallocation may be necessary. Of course, this patch will break on systems where _PC_PATH_MAX is unlimited, so further checking will be needed if pathconf() returns -1. I'll refrain from committing this to allow sufficient time for flamage. Index: configure.in =================================================================== RCS file: /cvsroot/zsh/zsh/configure.in,v retrieving revision 1.15 diff -u -r1.15 configure.in --- configure.in 2000/07/28 09:10:36 1.15 +++ configure.in 2000/08/01 15:41:17 @@ -863,7 +863,8 @@ uname \ signgam \ putenv getenv \ - brk sbrk) + brk sbrk \ + pathconf) AC_FUNC_STRCOLL if test $ac_cv_func_setpgrp = yes; then Index: Src/Modules/files.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Modules/files.c,v retrieving revision 1.1.1.9 diff -u -r1.1.1.9 files.c --- Src/Modules/files.c 1999/12/16 14:26:36 1.1.1.9 +++ Src/Modules/files.c 2000/08/01 15:41:21 @@ -71,6 +71,9 @@ mode_t oumask = umask(0); mode_t mode = 0777 & ~oumask; int err = 0; +#ifdef HAVE_PATHCONF + int pathmax = 0; +#endif umask(oumask); if(ops['m']) { @@ -91,11 +94,20 @@ while(ptr > *args + (**args == '/') && *--ptr == '/') *ptr = 0; - if(ztrlen(*args) > PATH_MAX - 1) { +#ifdef HAVE_PATHCONF + if((pathmax = pathconf(*args,_PC_PATH_MAX)) == -1) { + zwarnnam(nam, "%s: %e", *args, errno); + err = 1; + continue; + } + else if(ztrlen(*args) > pathmax - 1) { +#else + if(ztrlen(*args) > PATH_MAX - 1) { +#endif zwarnnam(nam, "%s: %e", *args, ENAMETOOLONG); err = 1; continue; - } + } if(ops['p']) { char *ptr = *args; Index: Src/Modules/parameter.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/Modules/parameter.c,v retrieving revision 1.11 diff -u -r1.11 parameter.c --- Src/Modules/parameter.c 2000/07/04 10:02:27 1.11 +++ Src/Modules/parameter.c 2000/08/01 15:41:22 @@ -1397,7 +1397,17 @@ static void setpmnameddir(Param pm, char *value) { +#ifdef HAVE_PATHCONF + int pathmax = 0; + + pathmax = pathconf(value, _PC_PATH_MAX); + if (pathmax == -1) { + zwarn("%s: %e", value, errno); + } + else if (!value || *value != '/' || strlen(value) >= pathmax) +#else if (!value || *value != '/' || strlen(value) >= PATH_MAX) +#endif zwarn("invalid value: %s", value, 0); else adduserdir(pm->nam, value, 0, 1); @@ -1420,6 +1430,9 @@ { int i; HashNode hn, next, hd; +#ifdef HAVE_PATHCONF + int pathmax = 0; +#endif if (!ht) return; @@ -1442,8 +1455,17 @@ v.arr = NULL; v.pm = (Param) hn; +#ifdef HAVE_PATHCONF + if((pathmax = pathconf(val, _PC_PATH_MAX)) == -1) + zwarn("%s: %e", val, errno); + else +#endif if (!(val = getstrvalue(&v)) || *val != '/' || +#ifdef HAVE_PATHCONF strlen(val) >= PATH_MAX) +#else + strlen(val) >= pathmax) +#endif zwarn("invalid value: %s", val, 0); else adduserdir(hn->nam, val, 0, 1);