bug-hurd
[Top][All Lists]
Advanced

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

Re: [PATCH] [RFC] Add trivfs_startup_debug() for easier translator devel


From: Samuel Thibault
Subject: Re: [PATCH] [RFC] Add trivfs_startup_debug() for easier translator development
Date: Tue, 23 Aug 2022 00:03:13 +0200
User-agent: NeoMutt/20170609 (1.8.3)

Hello,

At last you got your copyright assignment done, so I can flush your
pending patches :)

luca.dariz@gmail.com, le jeu. 26 janv. 2017 22:36:16 +0100, a ecrit:
> Basically it is an automation of this:
> http://walfield.org/pub/people/neal/papers/hurd-misc/manual-bootstrap.txt
> 
> To launch a storeio translator on FILE:
>   $ storeio -d FILE -T TYPE ARG

That looks very convenient, applied, thanks!

You're welcome adding it to other translators :)

Samuel

> ---
>  libtrivfs/startup.c | 69 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  libtrivfs/trivfs.h  | 11 +++++++++
>  storeio/storeio.c   | 46 ++++++++++++++++++++++++++++-------
>  3 files changed, 117 insertions(+), 9 deletions(-)
> 
> diff --git a/libtrivfs/startup.c b/libtrivfs/startup.c
> index 4d76d47cb..43a858c4c 100644
> --- a/libtrivfs/startup.c
> +++ b/libtrivfs/startup.c
> @@ -86,3 +86,72 @@ trivfs_startup(mach_port_t bootstrap, int flags,
>  
>    return err;
>  }
> +
> +/* Start in debug mode, no need to be called by settrans. Common options are
> +   the same as in trivfs_startup. FILE_NAME is the path of the node where the
> +   translator is set*/
> +error_t
> +trivfs_startup_debug(const char *file_name,
> +                  struct port_class *control_class,
> +                  struct port_bucket *control_bucket,
> +                  struct port_class *protid_class,
> +                  struct port_bucket *protid_bucket,
> +                  struct trivfs_control **control)
> +{
> +  mach_port_t underlying, right, goaway;
> +  struct trivfs_control *fsys;
> +  error_t err =
> +    trivfs_create_control (MACH_PORT_NULL,
> +                        control_class, control_bucket,
> +                        protid_class, protid_bucket,
> +                        &fsys);
> +
> +  if (err)
> +    return err;
> +
> +  right = ports_get_send_right (fsys);
> +  goaway = ports_get_send_right (fsys);
> +
> +  /* Start ourselves as transpator instead of replying to settrans */
> +  underlying = file_name_lookup(file_name, 0, 0);
> +  if (underlying == MACH_PORT_NULL)
> +    err = errno;
> +  else
> +    err = file_set_translator(underlying, 0, FS_TRANS_SET, 0, "", 0,
> +                           right, MACH_MSG_TYPE_COPY_SEND);
> +  mach_port_deallocate (mach_task_self (), right);
> +
> +  if (! err)
> +    fsys->underlying = underlying;
> +
> +  ports_port_deref (fsys);
> +
> +  /* Pass back what we got, unless the caller doesn't want it.  */
> +  if (!err && control)
> +    *control = fsys;
> +
> +  /* don't mark us as important and install a SIGTERM handler, so we can be
> +   * easily killed by Ctrl-C */
> +  void handler_sigterm(int signum)
> +  {
> +    error_t ee;
> +    ee = fsys_goaway(goaway, 0);
> +    if (ee == ESUCCESS)
> +      {
> +     mach_port_deallocate (mach_task_self (), goaway);
> +      }
> +    else if (ee != EBUSY)
> +      {
> +     /* Not nice */
> +     error(99, err, "fsys_goaway");
> +      }
> +    /* else the translator is busy, please retry */
> +  }
> +
> +  struct sigaction sa;
> +  memset(&sa, 0, sizeof(sa));
> +  sa.sa_handler = handler_sigterm;
> +  if (sigaction(SIGTERM, &sa, NULL) < 0)
> +    err = errno;
> +  return err;
> +}
> diff --git a/libtrivfs/trivfs.h b/libtrivfs/trivfs.h
> index 49cc765f9..bcebe7eb3 100644
> --- a/libtrivfs/trivfs.h
> +++ b/libtrivfs/trivfs.h
> @@ -151,6 +151,17 @@ error_t trivfs_startup (mach_port_t bootstrap, int flags,
>                       struct port_bucket *protid_bucket,
>                       struct trivfs_control **control);
>  
> +/* Start in debug mode, no need to be called by settrans. Common options are
> +   the same as in trivfs_startup. FILE_NAME is the path of the node where the
> +   translator is set*/
> +error_t
> +trivfs_startup_debug(const char *file_name,
> +                    struct port_class *control_class,
> +                    struct port_bucket *control_bucket,
> +                    struct port_class *protid_class,
> +                    struct port_bucket *protid_bucket,
> +                    struct trivfs_control **control);
> +
>  /* Create a new trivfs control port, with underlying node UNDERLYING, and
>     return it in CONTROL.  CONTROL_CLASS & CONTROL_BUCKET are passed to
>     the ports library to create the control port, and PROTID_CLASS &
> diff --git a/storeio/storeio.c b/storeio/storeio.c
> index fcf2f30f3..cc4274edd 100644
> --- a/storeio/storeio.c
> +++ b/storeio/storeio.c
> @@ -23,6 +23,7 @@
>  #include <fcntl.h>
>  #include <argp.h>
>  #include <argz.h>
> +#include <stdbool.h>
>  
>  #include <hurd.h>
>  #include <hurd/ports.h>
> @@ -41,6 +42,8 @@ static struct argp_option options[] =
>    {"no-file-io", 'F', 0,  0,"Never perform io via plain file io RPCs"},
>    {"no-fileio",  0,   0, OPTION_ALIAS | OPTION_HIDDEN},
>    {"enforced",  'e', 0,        0,"Never reveal underlying devices, even to 
> root"},
> +  {"debug",  'd', "PATH",    0,
> +   "Launch a standalone translator, for debug purposes"},
>    {"rdev",     'n', "ID", 0,
>     "The stat rdev number for this node; may be either a"
>     " single integer, or of the form MAJOR,MINOR"},
> @@ -49,7 +52,10 @@ static struct argp_option options[] =
>  static const char doc[] = "Translator for devices and other stores";
>  
>  const char *argp_program_version = STANDARD_HURD_VERSION (storeio);
> -
> +
> +static bool debug=false;
> +static char *debug_fname=NULL;
> +
>  /* Desired store parameters specified by the user.  */
>  struct storeio_argp_params
>  {
> @@ -96,6 +102,16 @@ parse_opt (int key, char *arg, struct argp_state *state)
>        }
>        break;
>  
> +    case 'd':
> +      {
> +     debug=true;
> +     char *new = strdup (arg);
> +     if (new == NULL)
> +       return ENOMEM;
> +     debug_fname = new;
> +      }
> +      break;
> +
>      case ARGP_KEY_INIT:
>        /* Now store_argp's parser will get to initialize its state.
>        The default_type member is our input parameter to it.  */
> @@ -134,14 +150,26 @@ main (int argc, char *argv[])
>    params.dev = &device;
>    argp_parse (&argp, argc, argv, 0, 0, &params);
>  
> -  task_get_bootstrap_port (mach_task_self (), &bootstrap);
> -  if (bootstrap == MACH_PORT_NULL)
> -    error (2, 0, "Must be started as a translator");
> -
> -  /* Reply to our parent */
> -  err = trivfs_startup (bootstrap, 0, 0, 0, 0, 0, &storeio_fsys);
> -  if (err)
> -    error (3, err, "trivfs_startup");
> +  if (debug)
> +    {
> +      if (debug_fname)
> +     err = trivfs_startup_debug (debug_fname, 0, 0, 0, 0, &storeio_fsys);
> +      else
> +     error (3, err, "missing translated node");
> +      if (err)
> +     error (3, err, "trivfs_startup_debug failed");
> +    }
> +  else
> +    {
> +      task_get_bootstrap_port (mach_task_self (), &bootstrap);
> +      if (bootstrap == MACH_PORT_NULL)
> +     error (2, 0, "Must be started as a translator");
> +
> +      /* Reply to our parent */
> +      err = trivfs_startup (bootstrap, 0, 0, 0, 0, 0, &storeio_fsys);
> +      if (err)
> +     error (3, err, "trivfs_startup");
> +    }
>  
>    storeio_fsys->hook = &device;
>  
> -- 
> 2.11.0
> 
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]