This commit was generated by cvs2svn to compensate for changes in r120,
[util-vserver.git] / src / vreboot.c
diff --git a/src/vreboot.c b/src/vreboot.c
new file mode 100644 (file)
index 0000000..baeaa74
--- /dev/null
@@ -0,0 +1,105 @@
+// $Id: vreboot.c,v 1.1 2003/09/29 22:01:57 ensc Exp $
+
+// Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
+// based on vreboot.cc by Jacques Gelinas
+//  
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//  
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//  
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+/*
+       Used to send a reboot message to the reboot manager. It opens /dev/reboot
+       and write "reboot\n".
+*/
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdbool.h>
+
+/*
+       Connect to a unix domain socket
+*/
+static int vreboot_connect (const char *sockpath, bool showerror)
+{
+       int ret = -1;
+       int fd =  socket (AF_UNIX,SOCK_STREAM,0);
+       if (fd == -1){
+               if (showerror) perror("socket client");
+       }else{
+               struct sockaddr_un un;
+               int s;
+               
+               un.sun_family = AF_UNIX;
+               strcpy (un.sun_path,sockpath);
+               s = connect(fd,(struct sockaddr*)&un,sizeof(un));
+               if (s == -1){
+                       if (showerror) fprintf (stderr,"connect %s (%s)\n"
+                               ,sockpath,strerror(errno));
+               }else{
+                       ret = fd;
+               }
+       }
+       return ret;
+}
+
+static void usage()
+{
+       fprintf (stderr,"vreboot version %s\n",VERSION);
+       fprintf (stderr,"\n");
+       fprintf (stderr,"vreboot [ --socket path ]\n");
+       fprintf (stderr,"vhalt   [ --socket path ]\n");
+       fprintf (stderr,"vreboot request a reboot or a halt of a virtual server\n");
+}
+
+int main (int argc, char *argv[])
+{
+       int ret = -1;
+       int i;
+       const char *sockpath = "/dev/reboot";
+       for (i=1; i<argc; i++){
+               const char *arg = argv[i];
+               const char *opt = argv[i+1];
+               if (strcmp(arg,"--socket")==0){
+                       sockpath = opt;
+                       i++;
+               }else if (strcmp(arg,"--help")==0){
+                       break;
+
+               }else{
+                       fprintf (stderr,"Invalid option %s\n",arg);
+                       break;
+               }
+       }
+       if (argc != i){
+               usage();
+       }else{
+               int fd = vreboot_connect (sockpath,true);
+               if (fd != -1){
+                       if (strstr(argv[0],"halt")!=NULL){
+                               write (fd,"halt\n",5);
+                       }else{
+                               write (fd,"reboot\n",7);
+                       }
+                       close (fd);
+                       ret = 0;
+               }
+       }
+       return ret;
+}
+