--- Here is the second step: move the PATH-searching function to lib/dpkg/path.c. The only changes to the body of the function consist of reformating to fit the style of the code around it --- no functional change intended.
Like the first patch, this patch is not even tested. Regardless, any comments would be welcome. lib/dpkg/path.c | 34 ++++++++++++++++++++++++++++++++++ lib/dpkg/path.h | 3 +++ src/help.c | 24 +----------------------- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/lib/dpkg/path.c b/lib/dpkg/path.c index 8ea891e..8c0c820 100644 --- a/lib/dpkg/path.c +++ b/lib/dpkg/path.c @@ -23,7 +23,11 @@ #include <config.h> #include <compat.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> #include <string.h> +#include <stdbool.h> #include <dpkg/path.h> @@ -54,3 +58,33 @@ path_skip_slash_dotslash(const char *path) return path; } +/* + * Verify that the named program can be found in the PATH. + * buf should have room for each path entry + '/' + name + '\0' + */ +bool +path_findprog(const char *path, const char *name, char *buf, size_t bufsz) +{ + struct stat stab; + const char *s, *end; + size_t len; + + s = path; + while (s) { + end = strchr(s, ':'); + len = end ? end-s : strlen(s); + assert(bufsz >= len + 2 + strlen(name)); + + memcpy(buf, s, len); + if (len) + buf[len++] = '/'; + strcpy(buf + len, name); + if (stat(buf, &stab) == 0 && (stab.st_mode & 0111)) + break; + + s = end; + if (s) + s++; + } + return start; +} diff --git a/lib/dpkg/path.h b/lib/dpkg/path.h index 701eb8e..03a9f40 100644 --- a/lib/dpkg/path.h +++ b/lib/dpkg/path.h @@ -27,11 +27,14 @@ #ifdef HAVE_STDDEF_H #include <stddef.h> #endif +#include <stdbool.h> DPKG_BEGIN_DECLS size_t path_rtrim_slash_slashdot(char *path); const char *path_skip_slash_dotslash(const char *path); +bool path_findprog(const char *path, const char *name, + char *buf, size_t bufsz); DPKG_END_DECLS diff --git a/src/help.c b/src/help.c index d898f33..aa179d4 100644 --- a/src/help.c +++ b/src/help.c @@ -29,7 +29,6 @@ #include <dirent.h> #include <assert.h> #include <string.h> -#include <stdbool.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/wait.h> @@ -79,27 +78,6 @@ struct filenamenode *namenodetouse(struct filenamenode *namenode, struct pkginfo return r; } -static bool checkpath_prog(const char *path, const char *name, char *buf, size_t bufsz) { -/* Verify that the named program can be found in the PATH. */ -/* buf should have room for each path entry + '/' + name + '\0' */ - struct stat stab; - const char *s, *p; - long l; - - s= path; - while (s) { - p= strchr(s,':'); - l= p ? p-s : (long)strlen(s); - assert(bufsz>=l+2+strlen(name)); - memcpy(buf,s,l); - if (l) buf[l++]= '/'; - strcpy(buf+l,name); - if (stat(buf,&stab) == 0 && (stab.st_mode & 0111)) break; - s= p; if (s) s++; - } - return s; -} - void checkpath(void) { /* Verify that some programs can be found in the PATH. */ static const char *const checklist[]= { "ldconfig", @@ -123,7 +101,7 @@ void checkpath(void) { buf=(char*)m_malloc(bufsz); for (clp=checklist; *clp; clp++) { - if (!checkpath_prog(path,*clp,buf,bufsz)) { + if (!path_findprog(path,*clp,buf,bufsz)) { fprintf(stderr,_("dpkg: `%s' not found on PATH.\n"),*clp); warned++; } -- 1.6.4.244.ge5cd0 -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org