mirror of
https://github.com/coreutils/coreutils.git
synced 2025-01-21 15:43:30 +08:00
(make_path, make_dir): Use bool, not int, since we're not setting errno.
Use mode_t for modes, not int. All uses changed. (errno): Remove decl; no longer needed since we assume C89.
This commit is contained in:
parent
b90519d9f9
commit
21e05084ac
@ -35,13 +35,7 @@
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#ifndef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "gettext.h"
|
||||
@ -85,18 +79,19 @@ extern int errno;
|
||||
while (0)
|
||||
|
||||
/* Attempt to create directory DIR (aka DIRPATH) with the specified MODE.
|
||||
If CREATED_DIR_P is non-NULL, set *CREATED_DIR_P to non-zero if this
|
||||
function creates DIR and to zero otherwise. Give a diagnostic and
|
||||
return non-zero if DIR cannot be created or cannot be determined to
|
||||
If CREATED_DIR_P is non-NULL, set *CREATED_DIR_P if this
|
||||
function creates DIR and clear it otherwise. Give a diagnostic and
|
||||
return false if DIR cannot be created or cannot be determined to
|
||||
exist already. Use DIRPATH in any diagnostic, not DIR.
|
||||
Note that if DIR already exists, this function returns zero
|
||||
(indicating success) and sets *CREATED_DIR_P to zero. */
|
||||
Note that if DIR already exists, this function returns true
|
||||
(indicating success) and clears *CREATED_DIR_P. */
|
||||
|
||||
int
|
||||
make_dir (const char *dir, const char *dirpath, mode_t mode, int *created_dir_p)
|
||||
bool
|
||||
make_dir (const char *dir, const char *dirpath, mode_t mode,
|
||||
bool *created_dir_p)
|
||||
{
|
||||
int fail = 0;
|
||||
int created_dir;
|
||||
bool ok = true;
|
||||
bool created_dir;
|
||||
|
||||
created_dir = (mkdir (dir, mode) == 0);
|
||||
|
||||
@ -117,12 +112,12 @@ make_dir (const char *dir, const char *dirpath, mode_t mode, int *created_dir_p)
|
||||
{
|
||||
error (0, saved_errno, _("cannot create directory %s"),
|
||||
quote (dirpath));
|
||||
fail = 1;
|
||||
ok = false;
|
||||
}
|
||||
else if (!S_ISDIR (stats.st_mode))
|
||||
{
|
||||
error (0, 0, _("%s exists but is not a directory"), quote (dirpath));
|
||||
fail = 1;
|
||||
ok = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -133,7 +128,7 @@ make_dir (const char *dir, const char *dirpath, mode_t mode, int *created_dir_p)
|
||||
if (created_dir_p)
|
||||
*created_dir_p = created_dir;
|
||||
|
||||
return fail;
|
||||
return ok;
|
||||
}
|
||||
|
||||
/* Ensure that the directory ARGPATH exists.
|
||||
@ -147,36 +142,36 @@ make_dir (const char *dir, const char *dirpath, mode_t mode, int *created_dir_p)
|
||||
If VERBOSE_FMT_STRING is nonzero, use it as a printf format
|
||||
string for printing a message after successfully making a directory,
|
||||
with the name of the directory that was just made as an argument.
|
||||
If PRESERVE_EXISTING is non-zero and ARGPATH is an existing directory,
|
||||
If PRESERVE_EXISTING is true and ARGPATH is an existing directory,
|
||||
then do not attempt to set its permissions and ownership.
|
||||
|
||||
Return 0 if ARGPATH exists as a directory with the proper
|
||||
ownership and permissions when done, otherwise 1. */
|
||||
Return true iff ARGPATH exists as a directory with the proper
|
||||
ownership and permissions when done. */
|
||||
|
||||
int
|
||||
bool
|
||||
make_path (const char *argpath,
|
||||
int mode,
|
||||
int parent_mode,
|
||||
mode_t mode,
|
||||
mode_t parent_mode,
|
||||
uid_t owner,
|
||||
gid_t group,
|
||||
int preserve_existing,
|
||||
bool preserve_existing,
|
||||
const char *verbose_fmt_string)
|
||||
{
|
||||
struct stat stats;
|
||||
int retval = 0;
|
||||
bool retval = true;
|
||||
|
||||
if (stat (argpath, &stats))
|
||||
{
|
||||
char *slash;
|
||||
int tmp_mode; /* Initial perms for leading dirs. */
|
||||
int re_protect; /* Should leading dirs be unwritable? */
|
||||
mode_t tmp_mode; /* Initial perms for leading dirs. */
|
||||
bool re_protect; /* Should leading dirs be unwritable? */
|
||||
struct ptr_list
|
||||
{
|
||||
char *dirname_end;
|
||||
struct ptr_list *next;
|
||||
};
|
||||
struct ptr_list *p, *leading_dirs = NULL;
|
||||
int do_chdir; /* Whether to chdir before each mkdir. */
|
||||
bool do_chdir; /* Whether to chdir before each mkdir. */
|
||||
struct saved_cwd cwd;
|
||||
char *basename_dir;
|
||||
char *dirpath;
|
||||
@ -197,23 +192,23 @@ make_path (const char *argpath,
|
||||
&& (parent_mode & (S_ISUID | S_ISGID | S_ISVTX)) != 0))
|
||||
{
|
||||
tmp_mode = S_IRWXU;
|
||||
re_protect = 1;
|
||||
re_protect = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_mode = parent_mode;
|
||||
re_protect = 0;
|
||||
re_protect = false;
|
||||
}
|
||||
|
||||
/* If we can record the current working directory, we may be able
|
||||
to do the chdir optimization. */
|
||||
do_chdir = !save_cwd (&cwd);
|
||||
do_chdir = (save_cwd (&cwd) == 0);
|
||||
|
||||
/* If we've saved the cwd and DIRPATH is an absolute pathname,
|
||||
we must chdir to `/' in order to enable the chdir optimization.
|
||||
So if chdir ("/") fails, turn off the optimization. */
|
||||
if (do_chdir && *dirpath == '/' && chdir ("/") < 0)
|
||||
do_chdir = 0;
|
||||
do_chdir = false;
|
||||
|
||||
slash = dirpath;
|
||||
|
||||
@ -223,8 +218,7 @@ make_path (const char *argpath,
|
||||
|
||||
while (1)
|
||||
{
|
||||
int newly_created_dir;
|
||||
int fail;
|
||||
bool newly_created_dir;
|
||||
|
||||
/* slash points to the leftmost unprocessed component of dirpath. */
|
||||
basename_dir = slash;
|
||||
@ -239,11 +233,10 @@ make_path (const char *argpath,
|
||||
basename_dir = dirpath;
|
||||
|
||||
*slash = '\0';
|
||||
fail = make_dir (basename_dir, dirpath, tmp_mode, &newly_created_dir);
|
||||
if (fail)
|
||||
if (! make_dir (basename_dir, dirpath, tmp_mode, &newly_created_dir))
|
||||
{
|
||||
CLEANUP;
|
||||
return 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (newly_created_dir)
|
||||
@ -261,7 +254,7 @@ make_path (const char *argpath,
|
||||
error (0, errno, _("cannot change owner and/or group of %s"),
|
||||
quote (dirpath));
|
||||
CLEANUP;
|
||||
return 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (re_protect)
|
||||
@ -283,7 +276,7 @@ make_path (const char *argpath,
|
||||
error (0, errno, _("cannot chdir to directory %s"),
|
||||
quote (dirpath));
|
||||
CLEANUP;
|
||||
return 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
*slash++ = '/';
|
||||
@ -303,10 +296,10 @@ make_path (const char *argpath,
|
||||
/* We're done making leading directories.
|
||||
Create the final component of the path. */
|
||||
|
||||
if (make_dir (basename_dir, dirpath, mode, NULL))
|
||||
if (! make_dir (basename_dir, dirpath, mode, NULL))
|
||||
{
|
||||
CLEANUP;
|
||||
return 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (verbose_fmt_string != NULL)
|
||||
@ -322,7 +315,7 @@ make_path (const char *argpath,
|
||||
{
|
||||
error (0, errno, _("cannot change owner and/or group of %s"),
|
||||
quote (dirpath));
|
||||
retval = 1;
|
||||
retval = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -336,7 +329,7 @@ make_path (const char *argpath,
|
||||
{
|
||||
error (0, errno, _("cannot change permissions of %s"),
|
||||
quote (dirpath));
|
||||
retval = 1;
|
||||
retval = false;
|
||||
}
|
||||
|
||||
CLEANUP_CWD;
|
||||
@ -351,7 +344,7 @@ make_path (const char *argpath,
|
||||
{
|
||||
error (0, errno, _("cannot change permissions of %s"),
|
||||
quote (dirpath));
|
||||
retval = 1;
|
||||
retval = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -364,7 +357,7 @@ make_path (const char *argpath,
|
||||
if (!S_ISDIR (stats.st_mode))
|
||||
{
|
||||
error (0, 0, _("%s exists but is not a directory"), quote (dirpath));
|
||||
return 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!preserve_existing)
|
||||
@ -384,13 +377,13 @@ make_path (const char *argpath,
|
||||
{
|
||||
error (0, errno, _("cannot change owner and/or group of %s"),
|
||||
quote (dirpath));
|
||||
retval = 1;
|
||||
retval = false;
|
||||
}
|
||||
if (chmod (dirpath, mode))
|
||||
{
|
||||
error (0, errno, _("cannot change permissions of %s"),
|
||||
quote (dirpath));
|
||||
retval = 1;
|
||||
retval = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user