Quoting Dwight Engen (dwight.en...@oracle.com):
> Signed-off-by: Dwight Engen <dwight.en...@oracle.com>

Acked-by: Serge E. Hallyn <serge.hal...@ubuntu.com>

> ---
>  doc/lxc-monitor.sgml.in  |  7 ++++++
>  src/lxc/arguments.c      | 34 +++++++++++++++++++++++++++--
>  src/lxc/arguments.h      |  5 ++++-
>  src/lxc/lxc.h            | 31 +++++++++++++++++++++-----
>  src/lxc/lxc_attach.c     |  8 +++----
>  src/lxc/lxc_cgroup.c     |  6 ++---
>  src/lxc/lxc_checkpoint.c |  2 +-
>  src/lxc/lxc_console.c    |  4 ++--
>  src/lxc/lxc_execute.c    |  6 ++---
>  src/lxc/lxc_freeze.c     |  4 ++--
>  src/lxc/lxc_info.c       |  6 ++---
>  src/lxc/lxc_kill.c       |  4 ++--
>  src/lxc/lxc_monitor.c    | 35 +++++++++++++++++++++--------
>  src/lxc/lxc_restart.c    |  6 ++---
>  src/lxc/lxc_start.c      |  6 ++---
>  src/lxc/lxc_stop.c       |  4 ++--
>  src/lxc/lxc_unfreeze.c   |  4 ++--
>  src/lxc/lxc_wait.c       |  5 +++--
>  src/lxc/monitor.c        | 57 
> +++++++++++++++++++++++++++++++-----------------
>  19 files changed, 165 insertions(+), 69 deletions(-)
> 
> diff --git a/doc/lxc-monitor.sgml.in b/doc/lxc-monitor.sgml.in
> index 336061d..b460843 100644
> --- a/doc/lxc-monitor.sgml.in
> +++ b/doc/lxc-monitor.sgml.in
> @@ -63,6 +63,13 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
> 02111-1307 USA
>        to monitor all the containers, several of them or just one.
>      </para>
>  
> +    <para>
> +      The <option>-P, --lxcpath</option>=PATH option may be specified 
> multiple
> +      times to monitor more than one container path. Note however that
> +      containers with the same name in multiple paths will be
> +      indistinguishable in the output.
> +    </para>
> +
>    </refsect1>
>  
>    &commonoptions;
> diff --git a/src/lxc/arguments.c b/src/lxc/arguments.c
> index f61c6eb..5f1c1af 100644
> --- a/src/lxc/arguments.c
> +++ b/src/lxc/arguments.c
> @@ -150,13 +150,32 @@ See the %s man page for further information.\n\n",
>       exit(code);
>  }
>  
> +static int lxc_arguments_lxcpath_add(struct lxc_arguments *args,
> +                                  const char *lxcpath)
> +{
> +     if (args->lxcpath_additional != -1 &&
> +         args->lxcpath_cnt > args->lxcpath_additional) {
> +             fprintf(stderr, "This command only accepts %d -P,--lxcpath 
> arguments\n",
> +                     args->lxcpath_additional + 1);
> +             exit(EXIT_FAILURE);
> +     }
> +
> +     args->lxcpath = realloc(args->lxcpath, (args->lxcpath_cnt + 1) *
> +                              sizeof(args->lxcpath[0]));
> +     if (args->lxcpath == NULL) {
> +             lxc_error(args, "no memory");
> +             return ENOMEM;
> +     }
> +     args->lxcpath[args->lxcpath_cnt++] = lxcpath;
> +     return 0;
> +}
> +
>  extern int lxc_arguments_parse(struct lxc_arguments *args,
>                              int argc, char * const argv[])
>  {
>       char shortopts[256];
>       int  ret = 0;
>  
> -     args->lxcpath = default_lxc_path();
>       ret = build_shortopts(args->options, shortopts, sizeof(shortopts));
>       if (ret < 0) {
>               lxc_error(args, "build_shortopts() failed : %s",
> @@ -176,7 +195,11 @@ extern int lxc_arguments_parse(struct lxc_arguments 
> *args,
>               case 'l':       args->log_priority = optarg; break;
>               case 'c':       args->console = optarg; break;
>               case 'q':       args->quiet = 1; break;
> -             case 'P':       args->lxcpath = optarg; break;
> +             case 'P':
> +                     ret = lxc_arguments_lxcpath_add(args, optarg);
> +                     if (ret < 0)
> +                             return ret;
> +                     break;
>               case OPT_USAGE: print_usage(args->options, args);
>               case '?':       print_help(args, 1);
>               case 'h':       print_help(args, 0);
> @@ -195,6 +218,13 @@ extern int lxc_arguments_parse(struct lxc_arguments 
> *args,
>       args->argv = &argv[optind];
>       args->argc = argc - optind;
>  
> +     /* If no lxcpaths were given, use default */
> +     if (!args->lxcpath_cnt) {
> +             ret = lxc_arguments_lxcpath_add(args, default_lxc_path());
> +             if (ret < 0)
> +                     return ret;
> +     }
> +
>       /* Check the command options */
>  
>       if (!args->name) {
> diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h
> index 6f6826b..002a919 100644
> --- a/src/lxc/arguments.h
> +++ b/src/lxc/arguments.h
> @@ -47,7 +47,10 @@ struct lxc_arguments {
>       const char *console;
>       const char *console_log;
>       const char *pidfile;
> -     const char *lxcpath;
> +     const char **lxcpath;
> +     int lxcpath_cnt;
> +     /* set to 0 to accept only 1 lxcpath, -1 for unlimited */
> +     int lxcpath_additional;
>  
>       /* for lxc-checkpoint/restart */
>       const char *statefile;
> diff --git a/src/lxc/lxc.h b/src/lxc/lxc.h
> index db921f0..9057757 100644
> --- a/src/lxc/lxc.h
> +++ b/src/lxc/lxc.h
> @@ -28,6 +28,7 @@ extern "C" {
>  #endif
>  
>  #include <stddef.h>
> +#include <sys/types.h>
>  #include <lxc/state.h>
>  
>  struct lxc_msg;
> @@ -77,17 +78,37 @@ extern int lxc_execute(const char *name, char *const 
> argv[], int quiet,
>  extern int lxc_monitor_open(const char *lxcpath);
>  
>  /*
> - * Read the state of the container if this one has changed
> - * The function will block until there is an event available
> - * @fd : the file descriptor provided by lxc_monitor_open
> - * @state : the variable which will be filled with the state
> + * Blocking read for the next container state change
> + * @fd  : the file descriptor provided by lxc_monitor_open
> + * @msg : the variable which will be filled with the state
>   * Returns 0 if the monitored container has exited, > 0 if
> - * data was readen, < 0 otherwise
> + * data was read, < 0 otherwise
>   */
>  extern int lxc_monitor_read(int fd, struct lxc_msg *msg);
> +
> +/*
> + * Blocking read for the next container state change with timeout
> + * @fd      : the file descriptor provided by lxc_monitor_open
> + * @msg     : the variable which will be filled with the state
> + * @timeout : the timeout in seconds to wait for a state change
> + * Returns 0 if the monitored container has exited, > 0 if
> + * data was read, < 0 otherwise
> + */
>  extern int lxc_monitor_read_timeout(int fd, struct lxc_msg *msg, int 
> timeout);
>  
>  /*
> + * Blocking read from multiple monitors for the next container state
> + * change with timeout
> + * @rfds    : an fd_set of file descriptors provided by lxc_monitor_open
> + * @nfds    : the maximum fd number in rfds + 1
> + * @msg     : the variable which will be filled with the state
> + * @timeout : the timeout in seconds to wait for a state change
> + * Returns 0 if the monitored container has exited, > 0 if
> + * data was read, < 0 otherwise
> + */
> +extern int lxc_monitor_read_fdset(fd_set *rfds, int nfds, struct lxc_msg 
> *msg, int timeout);
> +
> +/*
>   * Close the fd associated with the monitoring
>   * @fd : the file descriptor provided by lxc_monitor_open
>   * Returns 0 on success, < 0 otherwise
> diff --git a/src/lxc/lxc_attach.c b/src/lxc/lxc_attach.c
> index 300bc92..e0c253b 100644
> --- a/src/lxc/lxc_attach.c
> +++ b/src/lxc/lxc_attach.c
> @@ -292,11 +292,11 @@ int main(int argc, char *argv[])
>               return ret;
>  
>       ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                        my_args.progname, my_args.quiet, my_args.lxcpath);
> +                        my_args.progname, my_args.quiet, my_args.lxcpath[0]);
>       if (ret)
>               return ret;
>  
> -     init_pid = get_init_pid(my_args.name, my_args.lxcpath);
> +     init_pid = get_init_pid(my_args.name, my_args.lxcpath[0]);
>       if (init_pid < 0) {
>               ERROR("failed to get the init pid");
>               return -1;
> @@ -314,7 +314,7 @@ int main(int argc, char *argv[])
>        * by asking lxc-start
>        */
>       if (namespace_flags == -1) {
> -             namespace_flags = lxc_get_clone_flags(my_args.name, 
> my_args.lxcpath);
> +             namespace_flags = lxc_get_clone_flags(my_args.name, 
> my_args.lxcpath[0]);
>               /* call failed */
>               if (namespace_flags == -1) {
>                       ERROR("failed to automatically determine the "
> @@ -387,7 +387,7 @@ int main(int argc, char *argv[])
>               }
>  
>               if (!elevated_privileges) {
> -                     ret = lxc_cgroup_attach(grandchild, my_args.name, 
> my_args.lxcpath);
> +                     ret = lxc_cgroup_attach(grandchild, my_args.name, 
> my_args.lxcpath[0]);
>                       if (ret < 0) {
>                               ERROR("failed to attach process to cgroup");
>                               return -1;
> diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
> index 7684f1b..094686d 100644
> --- a/src/lxc/lxc_cgroup.c
> +++ b/src/lxc/lxc_cgroup.c
> @@ -69,7 +69,7 @@ int main(int argc, char *argv[])
>               return -1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return -1;
>  
>       state_object = my_args.argv[0];
> @@ -78,7 +78,7 @@ int main(int argc, char *argv[])
>               value = my_args.argv[1];
>  
>       if (value) {
> -             if (lxc_cgroup_set(my_args.name, state_object, value, 
> my_args.lxcpath)) {
> +             if (lxc_cgroup_set(my_args.name, state_object, value, 
> my_args.lxcpath[0])) {
>                       ERROR("failed to assign '%s' value to '%s' for '%s'",
>                               value, state_object, my_args.name);
>                       return -1;
> @@ -88,7 +88,7 @@ int main(int argc, char *argv[])
>               int ret;
>               char buffer[len];
>  
> -             ret = lxc_cgroup_get(my_args.name, state_object, buffer, len, 
> my_args.lxcpath);
> +             ret = lxc_cgroup_get(my_args.name, state_object, buffer, len, 
> my_args.lxcpath[0]);
>               if (ret < 0) {
>                       ERROR("failed to retrieve value of '%s' for '%s'",
>                             state_object, my_args.name);
> diff --git a/src/lxc/lxc_checkpoint.c b/src/lxc/lxc_checkpoint.c
> index 8b3a02a..ee41ba1 100644
> --- a/src/lxc/lxc_checkpoint.c
> +++ b/src/lxc/lxc_checkpoint.c
> @@ -116,7 +116,7 @@ int main(int argc, char *argv[])
>               return ret;
>  
>       ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                        my_args.progname, my_args.quiet, my_args.lxcpath);
> +                        my_args.progname, my_args.quiet, my_args.lxcpath[0]);
>       if (ret)
>               return ret;
>  
> diff --git a/src/lxc/lxc_console.c b/src/lxc/lxc_console.c
> index 1d779a1..795b54c 100644
> --- a/src/lxc/lxc_console.c
> +++ b/src/lxc/lxc_console.c
> @@ -192,7 +192,7 @@ int main(int argc, char *argv[])
>               return -1;
>  
>       err = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                        my_args.progname, my_args.quiet, my_args.lxcpath);
> +                        my_args.progname, my_args.quiet, my_args.lxcpath[0]);
>       if (err)
>               return -1;
>  
> @@ -202,7 +202,7 @@ int main(int argc, char *argv[])
>               return -1;
>       }
>  
> -     err = lxc_console(my_args.name, my_args.ttynum, &master, 
> my_args.lxcpath);
> +     err = lxc_console(my_args.name, my_args.ttynum, &master, 
> my_args.lxcpath[0]);
>       if (err)
>               goto out;
>  
> diff --git a/src/lxc/lxc_execute.c b/src/lxc/lxc_execute.c
> index 0fa2d25..3c070cf 100644
> --- a/src/lxc/lxc_execute.c
> +++ b/src/lxc/lxc_execute.c
> @@ -101,7 +101,7 @@ int main(int argc, char *argv[])
>               return -1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return -1;
>  
>       /* rcfile is specified in the cli option */
> @@ -110,7 +110,7 @@ int main(int argc, char *argv[])
>       else {
>               int rc;
>  
> -             rc = asprintf(&rcfile, "%s/%s/config", my_args.lxcpath, 
> my_args.name);
> +             rc = asprintf(&rcfile, "%s/%s/config", my_args.lxcpath[0], 
> my_args.name);
>               if (rc == -1) {
>                       SYSERROR("failed to allocate memory");
>                       return -1;
> @@ -137,5 +137,5 @@ int main(int argc, char *argv[])
>       if (lxc_config_define_load(&defines, conf))
>               return -1;
>  
> -     return lxc_execute(my_args.name, my_args.argv, my_args.quiet, conf, 
> my_args.lxcpath);
> +     return lxc_execute(my_args.name, my_args.argv, my_args.quiet, conf, 
> my_args.lxcpath[0]);
>  }
> diff --git a/src/lxc/lxc_freeze.c b/src/lxc/lxc_freeze.c
> index ff3cdd5..3bd5e28 100644
> --- a/src/lxc/lxc_freeze.c
> +++ b/src/lxc/lxc_freeze.c
> @@ -55,9 +55,9 @@ int main(int argc, char *argv[])
>               return -1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return -1;
>  
> -     return lxc_freeze(my_args.name, my_args.lxcpath);
> +     return lxc_freeze(my_args.name, my_args.lxcpath[0]);
>  }
>  
> diff --git a/src/lxc/lxc_info.c b/src/lxc/lxc_info.c
> index b19b1d0..f815b0f 100644
> --- a/src/lxc/lxc_info.c
> +++ b/src/lxc/lxc_info.c
> @@ -80,14 +80,14 @@ int main(int argc, char *argv[])
>               return 1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return 1;
>  
>       if (!state && !pid)
>               state = pid = true;
>  
>       if (state || test_state) {
> -             ret = lxc_getstate(my_args.name, my_args.lxcpath);
> +             ret = lxc_getstate(my_args.name, my_args.lxcpath[0]);
>               if (ret < 0)
>                       return 1;
>               if (test_state)
> @@ -97,7 +97,7 @@ int main(int argc, char *argv[])
>       }
>  
>       if (pid)
> -             printf("pid:%10d\n", get_init_pid(my_args.name, 
> my_args.lxcpath));
> +             printf("pid:%10d\n", get_init_pid(my_args.name, 
> my_args.lxcpath[0]));
>  
>       return 0;
>  }
> diff --git a/src/lxc/lxc_kill.c b/src/lxc/lxc_kill.c
> index e089931..9a24209 100644
> --- a/src/lxc/lxc_kill.c
> +++ b/src/lxc/lxc_kill.c
> @@ -62,7 +62,7 @@ int main(int argc, char *argv[], char *envp[])
>               return ret;
>  
>       ret = lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                        my_args.progname, my_args.quiet, my_args.lxcpath);
> +                        my_args.progname, my_args.quiet, my_args.lxcpath[0]);
>       if (ret)
>               return ret;
>  
> @@ -76,7 +76,7 @@ int main(int argc, char *argv[], char *envp[])
>       } else
>               sig=SIGKILL;
>  
> -     pid = get_init_pid(my_args.name, my_args.lxcpath);
> +     pid = get_init_pid(my_args.name, my_args.lxcpath[0]);
>       if (pid < 0) {
>               ERROR("failed to get the init pid");
>               return -1;
> diff --git a/src/lxc/lxc_monitor.c b/src/lxc/lxc_monitor.c
> index 5ddb291..e41686f 100644
> --- a/src/lxc/lxc_monitor.c
> +++ b/src/lxc/lxc_monitor.c
> @@ -52,6 +52,7 @@ Options :\n\
>       .options  = my_longopts,
>       .parser   = NULL,
>       .checker  = NULL,
> +     .lxcpath_additional = -1,
>  };
>  
>  int main(int argc, char *argv[])
> @@ -59,14 +60,14 @@ int main(int argc, char *argv[])
>       char *regexp;
>       struct lxc_msg msg;
>       regex_t preg;
> -     int fd;
> -     int len, rc;
> +     fd_set rfds, rfds_save;
> +     int len, rc, i, nfds = -1;
>  
>       if (lxc_arguments_parse(&my_args, argc, argv))
>               return -1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return -1;
>  
>       len = strlen(my_args.name) + 3;
> @@ -87,16 +88,33 @@ int main(int argc, char *argv[])
>               return -1;
>       }
>  
> -     lxc_monitord_spawn(my_args.lxcpath);
> +     if (my_args.lxcpath_cnt > FD_SETSIZE) {
> +             ERROR("too many paths requested, only the first %d will be 
> monitored", FD_SETSIZE);
> +             my_args.lxcpath_cnt = FD_SETSIZE;
> +     }
>  
> -     fd = lxc_monitor_open(my_args.lxcpath);
> -     if (fd < 0)
> -             return -1;
> +     FD_ZERO(&rfds);
> +     for (i = 0; i < my_args.lxcpath_cnt; i++) {
> +             int fd;
> +
> +             lxc_monitord_spawn(my_args.lxcpath[i]);
> +
> +             fd = lxc_monitor_open(my_args.lxcpath[i]);
> +             if (fd < 0)
> +                     return -1;
> +             FD_SET(fd, &rfds);
> +             if (fd > nfds)
> +                     nfds = fd;
> +     }
> +     memcpy(&rfds_save, &rfds, sizeof(rfds_save));
> +     nfds++;
>  
>       setlinebuf(stdout);
>  
>       for (;;) {
> -             if (lxc_monitor_read(fd, &msg) < 0)
> +             memcpy(&rfds, &rfds_save, sizeof(rfds));
> +
> +             if (lxc_monitor_read_fdset(&rfds, nfds, &msg, -1) < 0)
>                       return -1;
>  
>               msg.name[sizeof(msg.name)-1] = '\0';
> @@ -118,4 +136,3 @@ int main(int argc, char *argv[])
>  
>       return 0;
>  }
> -
> diff --git a/src/lxc/lxc_restart.c b/src/lxc/lxc_restart.c
> index 77099b1..3b8eedc 100644
> --- a/src/lxc/lxc_restart.c
> +++ b/src/lxc/lxc_restart.c
> @@ -124,7 +124,7 @@ int main(int argc, char *argv[])
>               return -1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return -1;
>  
>       /* rcfile is specified in the cli option */
> @@ -133,7 +133,7 @@ int main(int argc, char *argv[])
>       else {
>               int rc;
>  
> -             rc = asprintf(&rcfile, "%s/%s/config", my_args.lxcpath, 
> my_args.name);
> +             rc = asprintf(&rcfile, "%s/%s/config", my_args.lxcpath[0], 
> my_args.name);
>               if (rc == -1) {
>                       SYSERROR("failed to allocate memory");
>                       return -1;
> @@ -172,7 +172,7 @@ int main(int argc, char *argv[])
>               }
>       }
>  
> -     ret = lxc_restart(my_args.name, sfd, conf, my_args.flags, 
> my_args.lxcpath);
> +     ret = lxc_restart(my_args.name, sfd, conf, my_args.flags, 
> my_args.lxcpath[0]);
>  
>       if (my_args.statefile)
>               close(sfd);
> diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c
> index 12aacb8..490dbad 100644
> --- a/src/lxc/lxc_start.c
> +++ b/src/lxc/lxc_start.c
> @@ -165,7 +165,7 @@ int main(int argc, char *argv[])
>               args = my_args.argv;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return err;
>  
>       /* rcfile is specified in the cli option */
> @@ -174,7 +174,7 @@ int main(int argc, char *argv[])
>       else {
>               int rc;
>  
> -             rc = asprintf(&rcfile, "%s/%s/config", my_args.lxcpath, 
> my_args.name);
> +             rc = asprintf(&rcfile, "%s/%s/config", my_args.lxcpath[0], 
> my_args.name);
>               if (rc == -1) {
>                       SYSERROR("failed to allocate memory");
>                       return err;
> @@ -252,7 +252,7 @@ int main(int argc, char *argv[])
>       if (my_args.close_all_fds)
>               conf->close_all_fds = 1;
>  
> -     err = lxc_start(my_args.name, args, conf, my_args.lxcpath);
> +     err = lxc_start(my_args.name, args, conf, my_args.lxcpath[0]);
>  
>       /*
>        * exec ourself, that requires to have all opened fd
> diff --git a/src/lxc/lxc_stop.c b/src/lxc/lxc_stop.c
> index 0967a15..d7c7283 100644
> --- a/src/lxc/lxc_stop.c
> +++ b/src/lxc/lxc_stop.c
> @@ -55,8 +55,8 @@ int main(int argc, char *argv[])
>               return -1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return -1;
>  
> -     return lxc_stop(my_args.name, my_args.lxcpath);
> +     return lxc_stop(my_args.name, my_args.lxcpath[0]);
>  }
> diff --git a/src/lxc/lxc_unfreeze.c b/src/lxc/lxc_unfreeze.c
> index 44d3cc0..095f290 100644
> --- a/src/lxc/lxc_unfreeze.c
> +++ b/src/lxc/lxc_unfreeze.c
> @@ -54,9 +54,9 @@ int main(int argc, char *argv[])
>               return -1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return -1;
>  
> -     return lxc_unfreeze(my_args.name, my_args.lxcpath);
> +     return lxc_unfreeze(my_args.name, my_args.lxcpath[0]);
>  }
>  
> diff --git a/src/lxc/lxc_wait.c b/src/lxc/lxc_wait.c
> index d21578b..f1a065c 100644
> --- a/src/lxc/lxc_wait.c
> +++ b/src/lxc/lxc_wait.c
> @@ -84,8 +84,9 @@ int main(int argc, char *argv[])
>               return -1;
>  
>       if (lxc_log_init(my_args.name, my_args.log_file, my_args.log_priority,
> -                      my_args.progname, my_args.quiet, my_args.lxcpath))
> +                      my_args.progname, my_args.quiet, my_args.lxcpath[0]))
>               return -1;
>  
> -     return lxc_wait(strdup(my_args.name), my_args.states, my_args.timeout, 
> my_args.lxcpath);
> +     return lxc_wait(strdup(my_args.name), my_args.states, my_args.timeout,
> +                     my_args.lxcpath[0]);
>  }
> diff --git a/src/lxc/monitor.c b/src/lxc/monitor.c
> index 5648b86..c04bb73 100644
> --- a/src/lxc/monitor.c
> +++ b/src/lxc/monitor.c
> @@ -147,33 +147,50 @@ err1:
>       return ret;
>  }
>  
> -int lxc_monitor_read_timeout(int fd, struct lxc_msg *msglxc, int timeout)
> +int lxc_monitor_read_fdset(fd_set *rfds, int nfds, struct lxc_msg *msg,
> +                        int timeout)
>  {
> -     fd_set rfds;
> -     struct timeval tv;
> -     int ret;
> +     struct timeval tval,*tv = NULL;
> +     int ret,i;
>  
>       if (timeout != -1) {
> -             FD_ZERO(&rfds);
> -             FD_SET(fd, &rfds);
> -
> -             tv.tv_sec = timeout;
> -             tv.tv_usec = 0;
> -
> -             ret = select(fd+1, &rfds, NULL, NULL, &tv);
> -             if (ret == -1)
> -                     return -1;
> -             else if (!ret)
> -                     return -2;  // timed out
> +             tv = &tval;
> +             tv->tv_sec = timeout;
> +             tv->tv_usec = 0;
>       }
>  
> -     ret = recv(fd, msglxc, sizeof(*msglxc), 0);
> -     if (ret <= 0) {
> -             SYSERROR("client failed to recv (monitord died?) %s",
> -                      strerror(errno));
> +     ret = select(nfds, rfds, NULL, NULL, tv);
> +     if (ret == -1)
>               return -1;
> +     else if (ret == 0)
> +             return -2;  // timed out
> +
> +     /* only read from the first ready fd, the others will remain ready
> +      * for when this routine is called again
> +      */
> +     for (i = 0; i < nfds; i++) {
> +             if (FD_ISSET(i, rfds)) {
> +                     ret = recv(i, msg, sizeof(*msg), 0);
> +                     if (ret <= 0) {
> +                             SYSERROR("client failed to recv (monitord 
> died?) %s",
> +                                      strerror(errno));
> +                             return -1;
> +                     }
> +                     return ret;
> +             }
>       }
> -     return ret;
> +     SYSERROR("no ready fd found?");
> +     return -1;
> +}
> +
> +int lxc_monitor_read_timeout(int fd, struct lxc_msg *msg, int timeout)
> +{
> +     fd_set rfds;
> +
> +     FD_ZERO(&rfds);
> +     FD_SET(fd, &rfds);
> +
> +     return lxc_monitor_read_fdset(&rfds, fd+1, msg, timeout);
>  }
>  
>  int lxc_monitor_read(int fd, struct lxc_msg *msg)
> -- 
> 1.8.1.4
> 

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and 
their applications. This 200-page book is written by three acclaimed 
leaders in the field. The early access version is available now. 
Download your free book today! http://p.sf.net/sfu/neotech_d2d_may
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to