[systemd-devel] [PATCH 1/2] dev-setup: allow a path prefix for use in chroots

Lennart Poettering lennart at poettering.net
Tue Aug 21 08:25:19 PDT 2012


On Tue, 14.08.12 20:00, Dave Reisner (dreisner at archlinux.org) wrote:

> With this adjustment, we can reuse this code elsewhere, such as in
> nspawn.

Applied both, and made a couple of changes afterwards so that NULL as
param has the same effect as "".

Lennart

> ---
>  src/core/mount-setup.c |  2 +-
>  src/shared/dev-setup.c | 16 +++++++++++++---
>  src/shared/dev-setup.h |  7 ++-----
>  src/udev/udevd.c       |  2 +-
>  4 files changed, 17 insertions(+), 10 deletions(-)
> 
> diff --git a/src/core/mount-setup.c b/src/core/mount-setup.c
> index e86a893..be11bb8 100644
> --- a/src/core/mount-setup.c
> +++ b/src/core/mount-setup.c
> @@ -398,7 +398,7 @@ int mount_setup(bool loaded_policy) {
>          /* Create a few default symlinks, which are normally created
>           * by udevd, but some scripts might need them before we start
>           * udevd. */
> -        dev_setup();
> +        dev_setup("");
>  
>          /* Mark the root directory as shared in regards to mount
>           * propagation. The kernel defaults to "private", but we think
> diff --git a/src/shared/dev-setup.c b/src/shared/dev-setup.c
> index 0b3d648..759ecd7 100644
> --- a/src/shared/dev-setup.c
> +++ b/src/shared/dev-setup.c
> @@ -50,7 +50,7 @@ static int symlink_and_label(const char *old_path, const char *new_path) {
>          return r;
>  }
>  
> -void dev_setup(void) {
> +void dev_setup(const char *pathprefix) {
>          const char *j, *k;
>  
>          static const char symlinks[] =
> @@ -60,6 +60,16 @@ void dev_setup(void) {
>                  "/proc/self/fd/1\0"  "/dev/stdout\0"
>                  "/proc/self/fd/2\0"  "/dev/stderr\0";
>  
> -        NULSTR_FOREACH_PAIR(j, k, symlinks)
> -                symlink_and_label(j, k);
> +        NULSTR_FOREACH_PAIR(j, k, symlinks) {
> +                char *linkname;
> +
> +                if (asprintf(&linkname, "%s/%s", pathprefix, k) < 0) {
> +                        log_oom();
> +                        break;
> +                }
> +
> +                symlink_and_label(j, linkname);
> +
> +                free(linkname);
> +        }
>  }
> diff --git a/src/shared/dev-setup.h b/src/shared/dev-setup.h
> index 5850758..320c0b3 100644
> --- a/src/shared/dev-setup.h
> +++ b/src/shared/dev-setup.h
> @@ -1,7 +1,6 @@
>  /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
>  
> -#ifndef foodevsetuphfoo
> -#define foodevsetuphfoo
> +#pragma once
>  
>  /***
>    This file is part of systemd.
> @@ -22,6 +21,4 @@
>    along with systemd; If not, see <http://www.gnu.org/licenses/>.
>  ***/
>  
> -void dev_setup(void);
> -
> -#endif
> +void dev_setup(const char *pathprefix);
> diff --git a/src/udev/udevd.c b/src/udev/udevd.c
> index 23351ae..1bb15d8 100644
> --- a/src/udev/udevd.c
> +++ b/src/udev/udevd.c
> @@ -1155,7 +1155,7 @@ int main(int argc, char *argv[])
>  
>          mkdir("/run/udev", 0755);
>  
> -        dev_setup();
> +        dev_setup("");
>          static_dev_create_from_modules(udev);
>  
>          /* before opening new files, make sure std{in,out,err} fds are in a sane state */


Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list