summaryrefslogtreecommitdiff
path: root/libmisc/root_flag.c
diff options
context:
space:
mode:
authorBalint Reczey <balint@balintreczey.hu>2021-11-07 15:18:49 +0100
committerBalint Reczey <balint@balintreczey.hu>2021-11-07 15:18:49 +0100
commit749c1780621163ca5108f164861324bafa9e0ae8 (patch)
tree51001872624a692018c45bf39276df94b603fb19 /libmisc/root_flag.c
parentd906ecd3b652d95af6ffb974a2f6669501bb9496 (diff)
downloadshadow-749c1780621163ca5108f164861324bafa9e0ae8.tar.gz
New upstream version 4.9upstream/4.9
Diffstat (limited to 'libmisc/root_flag.c')
-rw-r--r--libmisc/root_flag.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/libmisc/root_flag.c b/libmisc/root_flag.c
index 7f5e6110..e9a97d44 100644
--- a/libmisc/root_flag.c
+++ b/libmisc/root_flag.c
@@ -56,25 +56,31 @@ extern void process_root_flag (const char* short_opt, int argc, char **argv)
* Parse the command line options.
*/
int i;
- const char *newroot = NULL;
+ const char *newroot = NULL, *val;
for (i = 0; i < argc; i++) {
+ val = NULL;
if ( (strcmp (argv[i], "--root") == 0)
+ || ((strncmp (argv[i], "--root=", 7) == 0)
+ && (val = argv[i] + 7))
|| (strcmp (argv[i], short_opt) == 0)) {
if (NULL != newroot) {
- fprintf (stderr,
+ fprintf (shadow_logfd,
_("%s: multiple --root options\n"),
Prog);
exit (E_BAD_ARG);
}
- if (i + 1 == argc) {
- fprintf (stderr,
+ if (val) {
+ newroot = val;
+ } else if (i + 1 == argc) {
+ fprintf (shadow_logfd,
_("%s: option '%s' requires an argument\n"),
Prog, argv[i]);
exit (E_BAD_ARG);
+ } else {
+ newroot = argv[++ i];
}
- newroot = argv[i + 1];
}
}
@@ -88,34 +94,34 @@ static void change_root (const char* newroot)
/* Drop privileges */
if ( (setregid (getgid (), getgid ()) != 0)
|| (setreuid (getuid (), getuid ()) != 0)) {
- fprintf (stderr, _("%s: failed to drop privileges (%s)\n"),
+ fprintf (shadow_logfd, _("%s: failed to drop privileges (%s)\n"),
Prog, strerror (errno));
exit (EXIT_FAILURE);
}
if ('/' != newroot[0]) {
- fprintf (stderr,
+ fprintf (shadow_logfd,
_("%s: invalid chroot path '%s'\n"),
Prog, newroot);
exit (E_BAD_ARG);
}
if (access (newroot, F_OK) != 0) {
- fprintf(stderr,
+ fprintf(shadow_logfd,
_("%s: cannot access chroot directory %s: %s\n"),
Prog, newroot, strerror (errno));
exit (E_BAD_ARG);
}
if (chdir (newroot) != 0) {
- fprintf(stderr,
+ fprintf(shadow_logfd,
_("%s: cannot chdir to chroot directory %s: %s\n"),
Prog, newroot, strerror (errno));
exit (E_BAD_ARG);
}
if (chroot (newroot) != 0) {
- fprintf(stderr,
+ fprintf(shadow_logfd,
_("%s: unable to chroot to directory %s: %s\n"),
Prog, newroot, strerror (errno));
exit (E_BAD_ARG);