vshost-util-vserver

Build script and sources for util-vserver.
git clone https://ccx.te2000.cz/git/vshost-util-vserver
Log | Files | Refs

vmemctrl.c (4574B)


      1 // $Id$
      2 
      3 // Copyright (C) 2007 Daniel Hokka Zakrisson
      4 //  
      5 // This program is free software; you can redistribute it and/or modify
      6 // it under the terms of the GNU General Public License as published by
      7 // the Free Software Foundation; either version 2, or (at your option)
      8 // any later version.
      9 //  
     10 // This program is distributed in the hope that it will be useful,
     11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13 // GNU General Public License for more details.
     14 //  
     15 // You should have received a copy of the GNU General Public License
     16 // along with this program; if not, write to the Free Software
     17 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
     18 
     19 #ifdef HAVE_CONFIG_H
     20 #  include <config.h>
     21 #endif
     22 
     23 #include "vserver.h"
     24 #include "util.h"
     25 
     26 #include <lib/internal.h>
     27 
     28 #include <stdio.h>
     29 #include <stdlib.h>
     30 #include <string.h>
     31 #include <unistd.h>
     32 #include <errno.h>
     33 #include <getopt.h>
     34 
     35 #define ENSC_WRAPPERS_PREFIX	"vmemctrl: "
     36 #define ENSC_WRAPPERS_VSERVER	1
     37 #define ENSC_WRAPPERS_UNISTD	1
     38 #include "wrappers.h"
     39 
     40 #define CMD_HELP	0x1000
     41 #define CMD_VERSION	0x1001
     42 
     43 #define CMD_SET		0x2000
     44 #define CMD_GET		0x2001
     45 
     46 #define CMD_XID		0x4000
     47 #define CMD_BADNESS	0x4001
     48 
     49 int wrapper_exit_code = 255;
     50 
     51 
     52 static struct option const
     53 CMDLINE_OPTIONS[] = {
     54   { "help",     no_argument,        0, CMD_HELP },
     55   { "version",  no_argument,        0, CMD_VERSION },
     56   { "set",      no_argument,        0, CMD_SET },
     57   { "get",      no_argument,        0, CMD_GET },
     58   { "xid",      required_argument,  0, CMD_XID },
     59   { "badness",  required_argument,  0, CMD_BADNESS },
     60   { 0,0,0,0 }
     61 };
     62 
     63 struct Arguments {
     64   xid_t		xid;
     65   int64_t	badness;
     66   bool		do_set;
     67   bool		do_get;
     68   uint32_t	mask;
     69 };
     70 
     71 static inline int
     72 hasArg(struct Arguments *args, uint32_t arg)
     73 {
     74   return (args->mask & arg) == arg;
     75 }
     76 
     77 static void
     78 showHelp(int fd, char const *cmd, int res)
     79 {
     80   WRITE_MSG(fd, "Usage:\n  ");
     81   WRITE_STR(fd, cmd);
     82   WRITE_MSG(fd,
     83 	    " (--set|--get) [--xid <xid>] [--badness <OOM bias>]\n"
     84 	    "        [--] [<command> <args>*]\n\n"
     85 	    "Please report bugs to " PACKAGE_BUGREPORT "\n");
     86 
     87   exit(res);
     88 }
     89 
     90 static void
     91 showVersion()
     92 {
     93   WRITE_MSG(1,
     94 	    "vmemctrl " VERSION " -- \n"
     95 	    "This program is part of " PACKAGE_STRING "\n\n"
     96 	    "Copyright (C) 2007 Daniel Hokka Zakrisson\n"
     97 	    VERSION_COPYRIGHT_DISCLAIMER);
     98   exit(0);
     99 }
    100 
    101 static inline void
    102 doset(struct Arguments *args)
    103 {
    104   if (hasArg(args, CMD_BADNESS) &&
    105       vc_set_badness(args->xid, args->badness) == -1) {
    106     perror(ENSC_WRAPPERS_PREFIX "vc_set_badness()");
    107     exit(wrapper_exit_code);
    108   }
    109 }
    110 
    111 static inline void
    112 doget(struct Arguments *args)
    113 {
    114   int64_t badness;
    115   char buf[32];
    116   size_t l;
    117   if (vc_get_badness(args->xid, &badness) == -1) {
    118     perror(ENSC_WRAPPERS_PREFIX "vc_get_badness()");
    119     exit(wrapper_exit_code);
    120   }
    121   l = utilvserver_fmt_int64(buf, badness);
    122   buf[l] = '\0';
    123   WRITE_STR(1, buf);
    124   WRITE_MSG(1, "\n");
    125 }
    126 
    127 int main (int argc, char *argv[])
    128 {
    129   struct Arguments args = {
    130     .do_set	= false,
    131     .do_get	= false,
    132     .xid	= VC_NOCTX,
    133     .badness	= 0,
    134     .mask	= 0,
    135   };
    136   
    137   while (1) {
    138     int		c = getopt_long(argc, argv, "+", CMDLINE_OPTIONS, 0);
    139     if (c==-1) break;
    140 
    141     switch (c) {
    142       case CMD_HELP	:  showHelp(1, argv[0], 0);
    143       case CMD_VERSION	:  showVersion();
    144       case CMD_XID	:  args.xid       = Evc_xidopt2xid(optarg,true); break;
    145       case CMD_SET	:  args.do_set    = true; break;
    146       case CMD_GET	:  args.do_get    = true; break;
    147       case CMD_BADNESS	: {
    148 	char *endptr;
    149 	args.badness = strtoll(optarg, &endptr, 0);
    150 	if (*endptr) {
    151 	  WRITE_MSG(2, ENSC_WRAPPERS_PREFIX "Badness '");
    152 	  WRITE_STR(2, optarg);
    153 	  WRITE_MSG(2, "' is not an integer\n");
    154 	  exit(wrapper_exit_code);
    155 	}
    156 	break;
    157       }
    158       default		:
    159 	WRITE_MSG(2, "Try '");
    160 	WRITE_STR(2, argv[0]);
    161 	WRITE_MSG(2, " --help' for more information.\n");
    162 	exit(wrapper_exit_code);
    163 	break;
    164     }
    165     args.mask |= c;
    166   }
    167 
    168   if (args.xid == VC_NOCTX) args.xid = Evc_get_task_xid(0);
    169 
    170   if (!args.do_set && !args.do_get) {
    171     WRITE_MSG(2, "No operation specified; try '--help' for more information\n");
    172     exit(wrapper_exit_code);
    173   }
    174   else if (((args.do_set ? 1 : 0) + (args.do_get ? 1 : 0)) > 1) {
    175     WRITE_MSG(2, "Multiple operations specified; try '--help' for more information\n");
    176     exit(wrapper_exit_code);
    177   }
    178 
    179   if (args.do_set)
    180     doset(&args);
    181   else if (args.do_get)
    182     doget(&args);
    183 
    184   if (optind != argc)
    185     Eexecvp (argv[optind],argv+optind);
    186   return EXIT_SUCCESS;
    187 }