[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT/MUSL PATCH 17/19] Implement functions related to process management with glue code



Hi Gaulthier,

We should create an internal library for process related functionality.
I will do that in the following day and I'm going to move the code from
process.c file from newlib's glue. After that, please add the missing
changes that you introduce in this patch.

Cheers,
Costin

On 10/15/19 6:23 PM, Gaulthier Gain wrote:
> wip: This commit adds functions related to process management in
> process.c and are copied from the process file defined in the newlibc
> glue code.
> 
> Signed-off-by: Gaulthier Gain <gaulthier.gain@xxxxxxxxx>
> ---
>  Makefile.uk          |   1 +
>  include/uk/process.h |  43 +++++++++
>  process.c            | 242 
> +++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 286 insertions(+)
>  create mode 100644 include/uk/process.h
>  create mode 100644 process.c
> 
> diff --git a/Makefile.uk b/Makefile.uk
> index 4c65046..e30c3f7 100644
> --- a/Makefile.uk
> +++ b/Makefile.uk
> @@ -135,6 +135,7 @@ LIBMUSLGLUE_CXXFLAGS-y += $(LIBMUSLGLUE_SUPPRESS_FLAGS-y)
>  
> ################################################################################
>  LIBMUSLGLUE_SRCS-y += $(LIBMUSL_BASE)/mem.c
>  LIBMUSLGLUE_SRCS-y += $(LIBMUSL_BASE)/ldso.c
> +LIBMUSLGLUE_SRCS-y += $(LIBMUSL_BASE)/process.c
>  LIBMUSLGLUE_SRCS-y += $(LIBMUSL_BASE)/stdio.c
>  LIBMUSLGLUE_SRCS-y += $(LIBMUSL_BASE)/thread.c
>  
> diff --git a/include/uk/process.h b/include/uk/process.h
> new file mode 100644
> index 0000000..67208e3
> --- /dev/null
> +++ b/include/uk/process.h
> @@ -0,0 +1,43 @@
> +/* SPDX-License-Identifier: BSD-3-Clause */
> +/*
> + * Authors: Costin Lupu <costin.lupu@xxxxxxxxx>
> + *
> + * Copyright (c) 2019, University Politehnica of Bucharest. All rights 
> reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the copyright holder nor the names of its
> + *    contributors may be used to endorse or promote products derived from
> + *    this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
> IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + *
> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
> + */
> +
> +#ifndef __UK_PROCESS_H__
> +#define __UK_PROCESS_H__
> +
> +#define UNIKRAFT_PID      1
> +#define UNIKRAFT_PPID     0
> +#define UNIKRAFT_SID      0
> +#define UNIKRAFT_PGID     0
> +
> +#endif /* __UK_PROCESS_H__ */
> diff --git a/process.c b/process.c
> new file mode 100644
> index 0000000..ef8de05
> --- /dev/null
> +++ b/process.c
> @@ -0,0 +1,242 @@
> +/* SPDX-License-Identifier: BSD-3-Clause */
> +/*
> + * libnewlib glue code
> + *
> + * Authors: Felipe Huici <felipe.huici@xxxxxxxxx>
> + *          Costin Lupu <costin.lupu@xxxxxxxxx>
> + *          Gaulthier Gain <gaulthier.gain@xxxxxxxxx>
> + *
> + * Copyright (c) 2017, NEC Europe Ltd., NEC Corporation. All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + *
> + * 1. Redistributions of source code must retain the above copyright
> + *    notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + *    notice, this list of conditions and the following disclaimer in the
> + *    documentation and/or other materials provided with the distribution.
> + * 3. Neither the name of the copyright holder nor the names of its
> + *    contributors may be used to endorse or promote products derived from
> + *    this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
> IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + *
> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
> + */
> +
> +#include <errno.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <unistd.h>
> +#include <spawn.h>
> +#include <uk/process.h>
> +#include <uk/print.h>
> +extern int errno;
> +
> +int fork(void)
> +{
> +     /* fork() is not supported on this platform */
> +     errno = ENOSYS;
> +     return -1;
> +}
> +
> +static
> +void exec_warn(const char *func,
> +             const char *path, char *const argv[], char *const envp[])
> +{
> +     int i;
> +
> +     uk_pr_warn("%s(): path=%s", func, path);
> +
> +     /* print arguments */
> +     i = 0;
> +     uk_pr_warn(" argv=[");
> +     while (argv[i]) {
> +             uk_pr_warn("%s%s", (i > 0 ? ", " : ""), argv[i]);
> +             i++;
> +     }
> +     uk_pr_warn("]");
> +
> +     /* print environment variables */
> +     if (envp) {
> +             i = 0;
> +             uk_pr_warn(" envp=[");
> +             while (envp[i]) {
> +                     uk_pr_warn("%s%s", (i > 0 ? ", " : ""), envp[i]);
> +                     i++;
> +             }
> +             uk_pr_warn("]");
> +     }
> +
> +     uk_pr_warn("\n");
> +}
> +
> +int execve(const char *path, char *const argv[], char *const envp[])
> +{
> +     exec_warn(__func__, path, argv, envp);
> +     errno = ENOSYS;
> +     return -1;
> +}
> +
> +int execv(const char *path, char *const argv[])
> +{
> +     exec_warn(__func__, path, argv, NULL);
> +     errno = ENOSYS;
> +     return -1;
> +}
> +
> +int system(const char *command)
> +{
> +     uk_pr_warn("%s: %s\n", __func__, command);
> +     errno = ENOSYS;
> +     return -1;
> +}
> +
> +FILE *popen(const char *command, const char *type __unused)
> +{
> +     uk_pr_warn("%s: %s\n", __func__, command);
> +     errno = ENOSYS;
> +     return NULL;
> +}
> +
> +int pclose(FILE *stream __unused)
> +{
> +     errno = EINVAL;
> +     return -1;
> +}
> +
> +int wait(int *status __unused)
> +{
> +     /* No children */
> +     errno = ECHILD;
> +     return -1;
> +}
> +
> +pid_t waitpid(pid_t pid __unused, int *wstatus __unused, int options 
> __unused)
> +{
> +     /* No children */
> +     errno = ECHILD;
> +     return -1;
> +}
> +
> +pid_t wait3(int *wstatus __unused, int options __unused,
> +             struct rusage *rusage __unused)
> +{
> +     /* No children */
> +     errno = ECHILD;
> +     return -1;
> +}
> +
> +pid_t wait4(pid_t pid __unused, int *wstatus __unused, int options __unused,
> +             struct rusage *rusage __unused)
> +{
> +     /* No children */
> +     errno = ECHILD;
> +     return -1;
> +}
> +
> +int getpid(void)
> +{
> +     return UNIKRAFT_PID;
> +}
> +
> +pid_t getppid(void)
> +{
> +     return UNIKRAFT_PPID;
> +}
> +
> +pid_t setsid(void)
> +{
> +     /* We have a single "session" with a single "process" */
> +     errno = EPERM;
> +     return (pid_t) -1;
> +}
> +
> +pid_t getsid(pid_t pid)
> +{
> +     if (pid != 0) {
> +             /* We support only calls for the only calling "process" */
> +             errno = ESRCH;
> +             return (pid_t) -1;
> +     }
> +     return UNIKRAFT_SID;
> +}
> +
> +int setpgid(pid_t pid, pid_t pgid)
> +{
> +     if (pid != 0) {
> +             /* We support only calls for the only calling "process" */
> +             errno = ESRCH;
> +             return (pid_t) -1;
> +     }
> +     if (pgid != 0) {
> +             /* We have a single "group" with a single "process" */
> +             errno = EPERM;
> +             return (pid_t) -1;
> +     }
> +     return 0;
> +}
> +
> +pid_t getpgid(pid_t pid)
> +{
> +     if (pid != 0) {
> +             /* We support only calls for the only calling "process" */
> +             errno = ESRCH;
> +             return (pid_t) -1;
> +     }
> +     return UNIKRAFT_PGID;
> +}
> +
> +pid_t getpgrp(void)
> +{
> +     return UNIKRAFT_PGID;
> +}
> +
> +int setpgrp(void)
> +{
> +     return setpgid(0, 0);
> +}
> +
> +int tcsetpgrp(int fd __unused, pid_t pgrp)
> +{
> +     /* TODO check if fd is BADF */
> +     if (pgrp != UNIKRAFT_PGID) {
> +             errno = EINVAL;
> +             return -1;
> +     }
> +     return 0;
> +}
> +
> +pid_t tcgetpgrp(int fd)
> +{
> +     /* We have a single "process group" */
> +     return UNIKRAFT_PGID;
> +}
> +
> +int nice(int inc __unused)
> +{
> +     /* We don't support priority updates for unikernels */
> +     errno = EPERM;
> +     return -1;
> +}
> +
> +int posix_spawn(pid_t *restrict res, const char *restrict path,
> +                const posix_spawn_file_actions_t *fa,
> +                const posix_spawnattr_t *restrict attr,
> +                char *const argv[restrict], char *const envp[restrict])
> +{
> +        errno = ENOSYS;
> +        return -1;
> +}
> 

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.