Also, free the mode_change object when done.
if (specified_mode)
{
- struct mode_change *change = mode_compile (specified_mode, 0);
- if (change == MODE_INVALID)
+ struct mode_change *change = mode_compile (specified_mode);
+ if (!change)
error (EXIT_FAILURE, 0, _("invalid mode %s"), quote (specified_mode));
- else if (change == MODE_MEMORY_EXHAUSTED)
- xalloc_die ();
- mode = mode_adjust (0, change);
+ mode = mode_adjust (0, change, 0);
+ mode_free (change);
}
get_ids ();
}
newmode = S_IRWXUGO;
- if (specified_mode)
- {
- struct mode_change *change = mode_compile (specified_mode, MODE_MASK_ALL);
- if (change == MODE_INVALID)
- error (EXIT_FAILURE, 0, _("invalid mode %s"), quote (specified_mode));
- else if (change == MODE_MEMORY_EXHAUSTED)
- xalloc_die ();
- newmode = mode_adjust (newmode, change);
- }
if (specified_mode || create_parents)
{
mode_t umask_value = umask (0);
- if (! specified_mode)
- umask (umask_value);
+
parent_mode = (S_IRWXUGO & ~umask_value) | (S_IWUSR | S_IXUSR);
+
+ if (specified_mode)
+ {
+ struct mode_change *change = mode_compile (specified_mode);
+ if (!change)
+ error (EXIT_FAILURE, 0, _("invalid mode %s"),
+ quote (specified_mode));
+ newmode = mode_adjust (S_IRWXUGO, change, umask_value);
+ mode_free (change);
+ }
+ else
+ umask (umask_value);
}
for (; optind < argc; ++optind)
main (int argc, char **argv)
{
mode_t newmode;
- struct mode_change *change;
const char *specified_mode;
int exit_status = EXIT_SUCCESS;
int optc;
newmode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (specified_mode)
{
- change = mode_compile (specified_mode, MODE_MASK_ALL);
- if (change == MODE_INVALID)
+ struct mode_change *change = mode_compile (specified_mode);
+ if (!change)
error (EXIT_FAILURE, 0, _("invalid mode"));
- else if (change == MODE_MEMORY_EXHAUSTED)
- xalloc_die ();
- newmode = mode_adjust (newmode, change);
- umask (0);
+ newmode = mode_adjust (newmode, change, umask (0));
+ mode_free (change);
}
for (; optind < argc; ++optind)
main (int argc, char **argv)
{
mode_t newmode;
- struct mode_change *change;
const char *specified_mode;
int optc;
int expected_operands;
newmode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (specified_mode)
{
- change = mode_compile (specified_mode, MODE_MASK_ALL);
- if (change == MODE_INVALID)
+ struct mode_change *change = mode_compile (specified_mode);
+ if (!change)
error (EXIT_FAILURE, 0, _("invalid mode"));
- else if (change == MODE_MEMORY_EXHAUSTED)
- xalloc_die ();
- newmode = mode_adjust (newmode, change);
- umask (0);
+ newmode = mode_adjust (newmode, change, umask (0));
+ mode_free (change);
}
/* If the number of arguments is 0 or 1,