On Wed, Oct 31, 2018 at 12:25:48PM -0700, justinpopo6@xxxxxxxxx wrote: > From: Justin Chen <justinpopo6@xxxxxxxxx> > > Some systems do not have the shutdown command. Use poweroff as an > alternative. > > Signed-off-by: Justin Chen <justinpopo6@xxxxxxxxx> > --- > include/pathnames.h | 1 + > sys-utils/rtcwake.c | 38 +++++++++++++++++++++++++++----------- > 2 files changed, 28 insertions(+), 11 deletions(-) > > diff --git a/include/pathnames.h b/include/pathnames.h > index 3d5052e..ed8ea33 100644 > --- a/include/pathnames.h > +++ b/include/pathnames.h > @@ -53,6 +53,7 @@ > # define _PATH_LOGIN "/bin/login" > #endif > #define _PATH_SHUTDOWN "/sbin/shutdown" > +#define _PATH_POWEROFF "/sbin/poweroff" > > #define _PATH_TERMCOLORS_DIRNAME "terminal-colors.d" > #define _PATH_TERMCOLORS_DIR "/etc/" _PATH_TERMCOLORS_DIRNAME > diff --git a/sys-utils/rtcwake.c b/sys-utils/rtcwake.c > index b63c646..b79adbe 100644 > --- a/sys-utils/rtcwake.c > +++ b/sys-utils/rtcwake.c > @@ -28,6 +28,7 @@ > #include <stdlib.h> > #include <string.h> > #include <sys/ioctl.h> > +#include <sys/stat.h> > #include <sys/time.h> > #include <sys/types.h> > #include <termios.h> > @@ -579,20 +580,35 @@ int main(int argc, char **argv) > break; > case OFF_MODE: > { > + struct stat buf; > char *arg[5]; > int i = 0; > > - if (ctl.verbose) > - printf(_("suspend mode: off; executing %s\n"), > - _PATH_SHUTDOWN); > - arg[i++] = _PATH_SHUTDOWN; > - arg[i++] = "-h"; > - arg[i++] = "-P"; > - arg[i++] = "now"; > - arg[i] = NULL; > - if (!ctl.dryrun) { > - execv(arg[0], arg); > - warn(_("failed to execute %s"), _PATH_SHUTDOWN); > + if (!stat(_PATH_SHUTDOWN, &buf)) { what about if (access(_PATH_SHUTDOWN, X_OK) == 0) to avoid copy unnecessary struct stat from kernel to userspace? ;-) Karel > + arg[i++] = _PATH_SHUTDOWN; > + arg[i++] = "-h"; > + arg[i++] = "-P"; > + arg[i++] = "now"; > + arg[i] = NULL; > + } else if (!stat(_PATH_POWEROFF, &buf)) { > + arg[i++] = _PATH_POWEROFF; > + arg[i] = NULL; > + } else { > + arg[i] = NULL; > + } > + > + if (arg[0]) { > + if (ctl.verbose) > + printf(_("suspend mode: off; executing %s\n"), > + arg[0]); > + if (!ctl.dryrun) { > + execv(arg[0], arg); > + warn(_("failed to execute %s"), arg[0]); > + rc = EXIT_FAILURE; > + } > + } else { > + /* Failed to find shutdown command */ > + warn(_("failed to find shutdown command")); > rc = EXIT_FAILURE; > } > break; > -- > 2.7.4 > -- Karel Zak <kzak@xxxxxxxxxx> http://karelzak.blogspot.com