X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=lib%2Fchdir-long.c;h=d70f0b20f30f94ebc8939b68141b60efb1743ab7;hb=92249085071a973e2c0621b0415b93d2e48bb00d;hp=28e24070e9bfef285c3435a01166dcd71cf4b31f;hpb=a2016c1de6e4884f6c8ed5cc498f3bf821c25ca4;p=debian%2Fgzip diff --git a/lib/chdir-long.c b/lib/chdir-long.c index 28e2407..d70f0b2 100644 --- a/lib/chdir-long.c +++ b/lib/chdir-long.c @@ -1,5 +1,5 @@ /* provide a chdir function that tries not to fail due to ENAMETOOLONG - Copyright (C) 2004-2010 Free Software Foundation, Inc. + Copyright (C) 2004-2018 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -12,7 +12,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see . */ + along with this program. If not, see . */ /* written by Jim Meyering */ @@ -20,7 +20,6 @@ #include "chdir-long.h" -#include #include #include #include @@ -28,6 +27,8 @@ #include #include +#include "assure.h" + #ifndef PATH_MAX # error "compile this file only if your system defines PATH_MAX" #endif @@ -42,25 +43,25 @@ struct cd_buf int fd; }; -static inline void +static void cdb_init (struct cd_buf *cdb) { cdb->fd = AT_FDCWD; } -static inline int +static int cdb_fchdir (struct cd_buf const *cdb) { return fchdir (cdb->fd); } -static inline void +static void cdb_free (struct cd_buf const *cdb) { if (0 <= cdb->fd) { bool close_fail = close (cdb->fd); - assert (! close_fail); + assure (! close_fail); } } @@ -72,7 +73,7 @@ static int cdb_advance_fd (struct cd_buf *cdb, char const *dir) { int new_fd = openat (cdb->fd, dir, - O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK); + O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK); if (new_fd < 0) return -1; @@ -83,7 +84,7 @@ cdb_advance_fd (struct cd_buf *cdb, char const *dir) } /* Return a pointer to the first non-slash in S. */ -static inline char * +static char * _GL_ATTRIBUTE_PURE find_non_slash (char const *s) { size_t n_slash = strspn (s, "/"); @@ -96,7 +97,7 @@ find_non_slash (char const *s) name. It handles an arbitrarily long directory name by operating on manageable portions of the name. On systems without the openat syscall, this means changing the working directory to more and more - `distant' points along the long directory name and then restoring + "distant" points along the long directory name and then restoring the working directory. If any of those attempts to save or restore the working directory fails, this function exits nonzero. @@ -122,8 +123,8 @@ chdir_long (char *dir) /* If DIR is the empty string, then the chdir above must have failed and set errno to ENOENT. */ - assert (0 < len); - assert (PATH_MAX <= len); + assure (0 < len); + assure (PATH_MAX <= len); /* Count leading slashes. */ n_leading_slash = strspn (dir, "/"); @@ -158,8 +159,8 @@ chdir_long (char *dir) dir += n_leading_slash; } - assert (*dir != '/'); - assert (dir <= dir_end); + assure (*dir != '/'); + assure (dir <= dir_end); while (PATH_MAX <= dir_end - dir) { @@ -175,7 +176,7 @@ chdir_long (char *dir) } *slash = '\0'; - assert (slash - dir < PATH_MAX); + assure (slash - dir < PATH_MAX); err = cdb_advance_fd (&cdb, dir); *slash = '/'; if (err != 0) @@ -211,8 +212,6 @@ chdir_long (char *dir) # include "closeout.h" # include "error.h" -char *program_name; - int main (int argc, char *argv[]) { @@ -220,7 +219,6 @@ main (int argc, char *argv[]) size_t n = 0; int len; - program_name = argv[0]; atexit (close_stdout); len = getline (&line, &n, stdin); @@ -245,7 +243,7 @@ main (int argc, char *argv[]) if (argc <= 1) { - /* Using `pwd' here makes sense only if it is a robust implementation, + /* Using 'pwd' here makes sense only if it is a robust implementation, like the one in coreutils after the 2004-04-19 changes. */ char const *cmd = "pwd"; execlp (cmd, (char *) NULL);