X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmkancesdirs.c;h=2d5bb0ed7d889b78f640f37919cccae30e546828;hb=a4ed524753cd61bd2c52b9af041eabe83ea1d503;hp=efdabb4fada91e13b7f70ee349a30ec02eedd6a9;hpb=eeb96e1a6b5e0b31a4011d7d333999592c0bb2e9;p=gnulib.git diff --git a/lib/mkancesdirs.c b/lib/mkancesdirs.c index efdabb4fa..2d5bb0ed7 100644 --- a/lib/mkancesdirs.c +++ b/lib/mkancesdirs.c @@ -1,11 +1,11 @@ /* Make a file's ancestor directories. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + 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 - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,8 +13,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, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* Written by Paul Eggert. */ @@ -42,12 +41,12 @@ savewd. Create any ancestor directories that don't already exist, by - invoking MAKE_DIR (COMPONENT, MAKE_DIR_ARG). This function should - return 0 if successful and the resulting directory is readable, 1 - if successful but the resulting directory might not be readable, -1 - (setting errno) otherwise. If COMPONENT is relative, it is - relative to the temporary working directory, which may differ from - *WD. + invoking MAKE_DIR (FILE, COMPONENT, MAKE_DIR_ARG). This function + should return 0 if successful and the resulting directory is + readable, 1 if successful but the resulting directory might not be + readable, -1 (setting errno) otherwise. If COMPONENT is relative, + it is relative to the temporary working directory, which may differ + from *WD. Ordinarily MAKE_DIR is executed with the working directory changed to reflect the already-made prefix, and mkancesdirs returns with @@ -66,8 +65,8 @@ ptrdiff_t mkancesdirs (char *file, struct savewd *wd, - int (*make_dir) (char const *, void *), - void *make_dir_arg) + int (*make_dir) (char const *, char const *, void *), + void *make_dir_arg) { /* Address of the previous directory separator that follows an ordinary byte in a file name in the left-to-right scan, or NULL @@ -91,63 +90,63 @@ mkancesdirs (char *file, struct savewd *wd, while ((c = *p++)) if (ISSLASH (*p)) { - if (! ISSLASH (c)) - sep = p; + if (! ISSLASH (c)) + sep = p; } else if (ISSLASH (c) && *p && sep) { - /* Don't bother to make or test for "." since it does not - affect the algorithm. */ - if (! (sep - component == 1 && component[0] == '.')) - { - int make_dir_errno = 0; - int savewd_chdir_options = 0; - int chdir_result; - - /* Temporarily modify FILE to isolate this file name - component. */ - *sep = '\0'; - - /* Invoke MAKE_DIR on this component, except don't bother - with ".." since it must exist if its "parent" does. */ - if (sep - component == 2 - && component[0] == '.' && component[1] == '.') - made_dir = false; - else - switch (make_dir (component, make_dir_arg)) - { - case -1: - make_dir_errno = errno; - break; - - case 0: - savewd_chdir_options |= SAVEWD_CHDIR_READABLE; - /* Fall through. */ - case 1: - made_dir = true; - break; - } - - if (made_dir) - savewd_chdir_options |= SAVEWD_CHDIR_NOFOLLOW; - - chdir_result = - savewd_chdir (wd, component, savewd_chdir_options, NULL); - - /* Undo the temporary modification to FILE, unless there - was a failure. */ - if (chdir_result != -1) - *sep = '/'; - - if (chdir_result != 0) - { - if (make_dir_errno != 0 && errno == ENOENT) - errno = make_dir_errno; - return chdir_result; - } - } - - component = p; + /* Don't bother to make or test for "." since it does not + affect the algorithm. */ + if (! (sep - component == 1 && component[0] == '.')) + { + int make_dir_errno = 0; + int savewd_chdir_options = 0; + int chdir_result; + + /* Temporarily modify FILE to isolate this file name + component. */ + *sep = '\0'; + + /* Invoke MAKE_DIR on this component, except don't bother + with ".." since it must exist if its "parent" does. */ + if (sep - component == 2 + && component[0] == '.' && component[1] == '.') + made_dir = false; + else + switch (make_dir (file, component, make_dir_arg)) + { + case -1: + make_dir_errno = errno; + break; + + case 0: + savewd_chdir_options |= SAVEWD_CHDIR_READABLE; + /* Fall through. */ + case 1: + made_dir = true; + break; + } + + if (made_dir) + savewd_chdir_options |= SAVEWD_CHDIR_NOFOLLOW; + + chdir_result = + savewd_chdir (wd, component, savewd_chdir_options, NULL); + + /* Undo the temporary modification to FILE, unless there + was a failure. */ + if (chdir_result != -1) + *sep = '/'; + + if (chdir_result != 0) + { + if (make_dir_errno != 0 && errno == ENOENT) + errno = make_dir_errno; + return chdir_result; + } + } + + component = p; } return component - file;