[OE-core] [PATCH 2/7] shadow: add a -native recipe with customized utilities

Phil Blundell philb at gnu.org
Thu Sep 1 14:46:27 UTC 2011


I just tried using useradd.bbclass for the first time (in an effort to
make dbus installable on a readonly-rootfs) and it doesn't seem to be
working very well for me.

The root of my problem seems to be the code below.  As far as I can
tell, what's happening is that process_root_flag() consumes all the
command line arguments to useradd, which means that the subsequent call
to getopt() in process_flags() just returns immediately because there is
nothing left for it to do.  The upshot of all this is that the switches
on the command line are simply ignored and useradd doesn't do what I
wanted.

Is anybody else using this code successfully in oe-core with a
nontrivial USERADD_PARAM?

p.

On Tue, 2011-05-31 at 12:53 -0700, Scott Garman wrote:
> + /*
> ++ * process_root_flag - chroot if given the --root option
> ++ *
> ++ * We do this outside of process_flags() because
> ++ * the is_shadow_pwd boolean needs to be set before
> ++ * process_flags(), and if we do need to chroot() we
> ++ * must do so before is_shadow_pwd gets set.
> ++ */
> ++static void process_root_flag (int argc, char **argv)
> ++{
> ++	/*
> ++	 * Parse the command line options.
> ++	 */
> ++	int flag;
> ++	int option_index = 0;
> ++	static struct option long_options[] = {
> ++		{"root", required_argument, NULL, 'Q'},
> ++		{NULL, 0, NULL, '\0'}
> ++	};
> ++
> ++	while ((flag = getopt_long (argc, argv, "a:A:d:gM:Q:rR", long_options, &option_index)) != -1) {
> ++		switch (flag) {
> ++		case 'Q':
> ++			if ('/' != optarg[0]) {
> ++				fprintf (stderr,
> ++				         _("%s: invalid chroot path '%s'\n"),
> ++				         Prog, optarg);
> ++				exit (E_BAD_ARG);
> ++			}
> ++			newroot = optarg;
> ++
> ++			if (access (newroot, F_OK) != 0) {
> ++				fprintf(stderr,
> ++				        _("%s: chroot directory %s does not exist\n"),
> ++				        Prog, newroot);
> ++				exit (E_BAD_ARG);
> ++			}
> ++			if ( chroot(newroot) != 0 ) {
> ++				fprintf(stderr,
> ++				        _("%s: unable to chroot to directory %s\n"),
> ++				        Prog, newroot);
> ++				exit (E_BAD_ARG);
> ++			}
> ++			break;
> ++		/* no-op on everything else - they will be hanled by process_flags() */
> ++		}
> ++	}
> ++}






More information about the Openembedded-core mailing list