/* * fence_zvm.c: SMAPI interface for managing zVM Guests * * Copyright (C) 2012 Sine Nomine Associates * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . * * Authors: * Neale Ferguson * */ #ifdef __s390__ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "fence_zvm.h" #define MIN(a,b) ((a) < (b) ? (a) : (b)) #define DEFAULT_TIMEOUT 300 #define DEFAULT_DELAY 0 #define ACT_OFFON 0 #define ACT_OFF 1 #define ACT_ON 2 #define ACT_METADATA 3 #define ACT_STATUS 4 #define ACT_MONITOR 5 #define ACT_LIST 6 #define ACT_HELP 7 static int zvm_smapi_reportError (void *, void *); static struct option longopts[] = { {"action", required_argument, NULL, 'o'}, {"delay", required_argument, NULL, 'h'}, {"help", no_argument, NULL, 'h'}, {"ip", required_argument, NULL, 'a'}, {"plug", required_argument, NULL, 'n'}, {"timeout", required_argument, NULL, 'T'}, {"zvmsys", required_argument, NULL, 'z'}, {NULL, 0, NULL, 0} }; static const char *optString = "a:ho:n:T:"; static int zvm_metadata (void); static int usage (void); /** * zvm_smapi_open: * @zvm: z/VM driver information * * Opens a connection with the z/VM SMAPI server */ int zvm_smapi_open (zvm_driver_t * zvm) { int rc = -1, sockaddrlen; static char iucvprog[9] = "DMSRSRQU\0"; struct sockaddr_iucv siucv_addr; const struct sockaddr *siucv_ptr = (void *) &siucv_addr; if ((zvm->sd = socket (AF_IUCV, SOCK_STREAM, IPPROTO_IP)) != -1) { memset (&siucv_addr, 0, sizeof (siucv_addr)); siucv_addr.siucv_family = AF_IUCV; siucv_addr.siucv_port = 0; siucv_addr.siucv_addr = 0; memset (&siucv_addr.siucv_nodeid, ' ', 8); memset (&siucv_addr.siucv_user_id, ' ', 8); memset (&siucv_addr.siucv_name, ' ', 8); sockaddrlen = sizeof (siucv_addr); if ((rc = bind (zvm->sd, siucv_ptr, sockaddrlen)) != -1) { memcpy (&siucv_addr.siucv_user_id, zvm->smapiSrv, strlen (zvm->smapiSrv)); memcpy (&siucv_addr.siucv_name, &iucvprog, 8); memcpy (&siucv_addr.siucv_nodeid, zvm->node, strlen (zvm->node)); rc = connect (zvm->sd, (__CONST_SOCKADDR_ARG) siucv_ptr, sockaddrlen); } if (rc == -1) { syslog (LOG_ERR, "Error connecting to %s - %m", zvm->smapiSrv); close (zvm->sd); } } return (rc); } /** * zvm_smapi_imageRecycle * @zvm: z/VM driver information * * Deactivates a virtual image */ int zvm_smapi_imageRecycle (zvm_driver_t * zvm) { struct _inPlist { int32_t lPlist; int32_t lFName; char fName[13]; int32_t lUser; int32_t lPass; int32_t lTarget; char target[0]; } __attribute__((__packed__)) * inPlist; int32_t lInPlist; struct _outPlist { smapiOutHeader_t hdr; int32_t nActive; int32_t nInActive; int32_t lFail; char failArray[0]; } *outPlist = NULL; void *pOut = NULL; int32_t lRsp; uint32_t reqId; int rc; /* * Implement any delay */ if (zvm->delay > 0) sleep (zvm->delay); lInPlist = sizeof (*inPlist) + strlen (zvm->target); inPlist = malloc (lInPlist); if (inPlist != NULL) { inPlist->lPlist = lInPlist - sizeof (inPlist->lPlist); inPlist->lFName = sizeof (inPlist->fName); memcpy (inPlist->fName, Image_Recycle, sizeof (inPlist->fName)); inPlist->lUser = inPlist->lPass = 0; inPlist->lTarget = strlen (zvm->target); memcpy (inPlist->target, zvm->target, inPlist->lTarget); if ((rc = zvm_smapi_send (zvm, inPlist, &reqId, lInPlist)) != -1) { if ((rc = zvm_smapi_recv (zvm, &pOut, &lRsp)) != -1) { outPlist = pOut; if (outPlist->hdr.rc == 0) { syslog (LOG_INFO, "Recycling of %s successful", zvm->target); rc = 0; } else { if ((outPlist->hdr.rc == RCERR_IMAGEOP) & ((outPlist->hdr. reason == RS_NOT_ACTIVE) | (outPlist-> hdr. reason == RS_BEING_DEACT))) { syslog (LOG_INFO, "Recycling of %s successful", zvm->target); rc = 0; } else { rc = outPlist->hdr.rc; zvm->reason = outPlist->hdr.reason; (void) zvm_smapi_reportError (inPlist, outPlist); } } } } free (inPlist); free (outPlist); } else { syslog (LOG_ERR, "%s - cannot allocate parameter list", __func__); rc = -1; } return (rc); } /** * zvm_smapi_imageDeactivate * @zvm: z/VM driver information * * Deactivates a virtual image */ int zvm_smapi_imageDeactivate (zvm_driver_t * zvm) { struct _inPlist { int32_t lPlist; int32_t lFName; char fName[16]; int32_t lUser; int32_t lPass; int32_t lTarget; char target[0]; } __attribute__((__packed__)) * inPlist; struct _deactTime { int32_t lForceTime; char forceTime[5]; } __attribute__((__packed__)) * deactTime; int32_t lInPlist; struct _outPlist { smapiOutHeader_t hdr; int32_t nActive; int32_t nInActive; int32_t lFail; char failArray[0]; } *outPlist = NULL; void *pOut = NULL; int32_t lRsp; uint32_t reqId; int rc; /* * Implement any delay */ if (zvm->delay > 0) sleep (zvm->delay); lInPlist = sizeof (*inPlist) + strlen (zvm->target) + sizeof (*deactTime); inPlist = malloc (lInPlist); if (inPlist != NULL) { inPlist->lPlist = lInPlist - sizeof (inPlist->lPlist); inPlist->lFName = sizeof (inPlist->fName); memcpy (inPlist->fName, Image_Deactivate, sizeof (inPlist->fName)); deactTime = (void *) ((intptr_t) inPlist + sizeof (*inPlist) + strlen (zvm->target)); deactTime->lForceTime = sizeof (deactTime->forceTime); memcpy (deactTime->forceTime, "IMMED", sizeof (deactTime->forceTime)); inPlist->lUser = inPlist->lPass = 0; inPlist->lTarget = strlen (zvm->target); memcpy (inPlist->target, zvm->target, inPlist->lTarget); if ((rc = zvm_smapi_send (zvm, inPlist, &reqId, lInPlist)) != -1) { if ((rc = zvm_smapi_recv (zvm, &pOut, &lRsp)) != -1) { outPlist = pOut; if (outPlist->hdr.rc == 0) { syslog (LOG_INFO, "Deactivation of %s successful", zvm->target); rc = 0; } else { if ((outPlist->hdr.rc == RCERR_IMAGEOP) & ((outPlist->hdr. reason == RS_NOT_ACTIVE) | (outPlist-> hdr. reason == RS_BEING_DEACT))) { syslog (LOG_INFO, "Deactivation of %s successful", zvm->target); rc = 0; } else { rc = outPlist->hdr.rc; zvm->reason = outPlist->hdr.reason; (void) zvm_smapi_reportError (inPlist, outPlist); } } } } free (inPlist); free (outPlist); } else { syslog (LOG_ERR, "%s - cannot allocate parameter list", __func__); rc = -1; } return (rc); } /** * zvm_smapi_imageActivate * @zvm: z/VM driver information * * Deactivates a virtual image */ int zvm_smapi_imageActivate (zvm_driver_t * zvm) { struct _inPlist { int32_t lPlist; int32_t lFName; char fName[14]; int32_t lUser; int32_t lPass; int32_t lTarget; char target[0]; } __attribute__((__packed__)) * inPlist; int32_t lInPlist; struct _outPlist { smapiOutHeader_t hdr; int32_t nActive; int32_t nInActive; int32_t lFail; char failArray[0]; } *outPlist = NULL; void *pOut = NULL; int32_t lRsp; uint32_t reqId; int rc; /* * Implement any delay */ if (zvm->delay > 0) sleep (zvm->delay); lInPlist = sizeof (*inPlist) + strlen (zvm->target); inPlist = malloc (lInPlist); if (inPlist != NULL) { inPlist->lPlist = lInPlist - sizeof (inPlist->lPlist); inPlist->lFName = sizeof (inPlist->fName); memcpy (inPlist->fName, Image_Activate, sizeof (inPlist->fName)); inPlist->lUser = inPlist->lPass = 0; inPlist->lTarget = strlen (zvm->target); memcpy (inPlist->target, zvm->target, inPlist->lTarget); if ((rc = zvm_smapi_send (zvm, inPlist, &reqId, lInPlist)) != -1) { if ((rc = zvm_smapi_recv (zvm, &pOut, &lRsp)) != -1) { outPlist = pOut; if (outPlist->hdr.rc == 0) { syslog (LOG_INFO, "Activation of %s successful", zvm->target); rc = 0; } else { if ((outPlist->hdr.rc == RCERR_IMAGEOP) & (outPlist->hdr. reason == RS_ALREADY_ACTIVE)) { syslog (LOG_INFO, "Activation of %s successful", zvm->target); rc = 0; } else { rc = outPlist->hdr.rc; zvm->reason = outPlist->hdr.reason; (void) zvm_smapi_reportError (inPlist, outPlist); } } } } free (inPlist); free (outPlist); } else { syslog (LOG_ERR, "%s - cannot allocate parameter list", __func__); rc = -1; } return (rc); } /** * zvm_smapi_imageQuery * @zvm: z/VM driver information * * Queries the state of a virtual image */ int zvm_smapi_imageQuery (zvm_driver_t * zvm) { struct _inPlist { int32_t lPlist; int32_t lFName; char fName[18]; int32_t lUser; int32_t lPass; int32_t lTarget; char target[0]; } __attribute__((__packed__)) * inPlist; int32_t lInPlist; struct _outPlist { smapiOutHeader_t hdr; int32_t lNames; char nameArray[0]; } *outPlist = NULL; void *pOut = NULL; int32_t lRsp; uint32_t reqId; int rc; /* * Implement any delay */ if (zvm->delay > 0) sleep (zvm->delay); lInPlist = sizeof (*inPlist) + strlen (zvm->target); inPlist = malloc (lInPlist); if (inPlist != NULL) { inPlist->lPlist = lInPlist - sizeof (inPlist->lPlist); inPlist->lFName = sizeof (inPlist->fName); memcpy (inPlist->fName, Image_Status_Query, sizeof (inPlist->fName)); inPlist->lUser = inPlist->lPass = 0; inPlist->lTarget = strlen (zvm->target); memcpy (inPlist->target, zvm->target, inPlist->lTarget); if ((rc = zvm_smapi_send (zvm, inPlist, &reqId, lInPlist)) != -1) { if ((rc = zvm_smapi_recv (zvm, &pOut, &lRsp)) != -1) { outPlist = pOut; if (outPlist->hdr.rc == 0) { if (outPlist->hdr.reason == 0) { syslog (LOG_INFO, "Node %s is active", zvm->target); rc = 0; } else { syslog (LOG_INFO, "Node %s is inactive", zvm->target); rc = 2; } } else { rc = 1; zvm->reason = outPlist->hdr.reason; (void) zvm_smapi_reportError (inPlist, outPlist); } } } free (inPlist); free (outPlist); } else { syslog (LOG_ERR, "%s - cannot allocate parameter list", __func__); rc = -1; } return (rc); } /** * zvm_smapi_send: * @zvm: z/VM driver information * @reqid: Returned request id * @req: Request parameter list * @lSend: Length of request * * Send a request to the SMAPI server and retrieve the request id */ int zvm_smapi_send (zvm_driver_t * zvm, void *req, uint32_t * reqId, int32_t lSend) { int rc, nFds; fd_set readFds; struct timeval timeout; timeout.tv_sec = 30; timeout.tv_usec = 0; zvm->reason = -1; if ((rc = zvm_smapi_open (zvm)) == 0) { rc = send (zvm->sd, req, lSend, 0); if (rc != -1) { FD_ZERO (&readFds); FD_SET (zvm->sd, &readFds); nFds = zvm->sd + 1; if ((rc = select (nFds, &readFds, NULL, NULL, &timeout)) != -1) { /* * Get request ID */ rc = recv (zvm->sd, reqId, sizeof (*reqId), 0); if (rc == -1) syslog (LOG_ERR, "Error receiving from SMAPI - %m"); } } else syslog (LOG_ERR, "Error sending to SMAPI - %m"); } return (rc); } /** * zvm_smapi_recv: * @zvm: z/VM driver information * @req: Returned response parameter list * @lRsp: Length of response * * Receive a response from the SMAPI server */ int zvm_smapi_recv (zvm_driver_t * zvm, void **rsp, int32_t * lRsp) { int rc, lRem = 0, nFds; void *pRecv = rsp; fd_set readFds; smapiOutHeader_t *out; struct timeval timeout; timeout.tv_sec = 30; timeout.tv_usec = 0; FD_ZERO (&readFds); FD_SET (zvm->sd, &readFds); nFds = zvm->sd + 1; zvm->reason = -1; if ((rc = select (nFds, &readFds, NULL, NULL, &timeout)) != -1) { /* * Get response length */ if ((rc = recv (zvm->sd, lRsp, sizeof (*lRsp), 0)) != -1) { lRem = *lRsp; if (*rsp == NULL) *rsp = malloc (*lRsp + sizeof (out->outLen)); out = *rsp; out->outLen = *lRsp; pRecv = &out->reqId; while (lRem > 0) { if ((rc = recv (zvm->sd, pRecv, lRem, 0)) != -1) { lRem -= rc; pRecv = (void *) ((uintptr_t) pRecv + rc); } else syslog (LOG_ERR, "Error receiving from SMAPI - %m"); (void) zvm_smapi_close (zvm); return (rc); } zvm->reason = out->reason; } } else syslog (LOG_ERR, "Error receiving from SMAPI - %m"); (void) zvm_smapi_close (zvm); return (rc); } /** * zvm_smapi_close: * @zvm: z/VM driver information * * Close a connection with the z/VM SMAPI server */ int zvm_smapi_close (zvm_driver_t * zvm) { close (zvm->sd); return (0); } /** * zvm_smapi_reportError * @inHdr - Input parameter list header * @outHdr - Output parameter list header * * Report an error from the SMAPI server */ static int zvm_smapi_reportError (void *inHdr, void *oHdr) { struct _inParm { int32_t lPlist; int32_t lFName; char fName[0]; } *inParm = inHdr; smapiOutHeader_t *outHdr = oHdr; char fName[64]; memset (fName, 0, sizeof (fName)); memcpy (fName, inParm->fName, inParm->lFName); syslog (LOG_ERR, "%s - returned (%d,%d)", fName, outHdr->rc, outHdr->reason); return (-1); } /** * trim - Trim spaces from string * @str - Pointer to string * */ static int trim (char *str) { char *p; int len; if (!str) return (0); len = strlen (str); while (len--) { if (isspace (str[len])) { str[len] = 0; } else { break; } } for (p = str; *p && isspace (*p); p++); memmove (str, p, strlen (p) + 1); return (strlen (str)); } /** * zvm_metadata - Show fence metadata * @self - Path to this executable * */ static int zvm_metadata () { fprintf (stdout, "\n"); fprintf (stdout, "\n"); fprintf (stdout, ""); fprintf (stdout, "The fence_zvm agent is intended to be used with with z/VM SMAPI service."); fprintf (stdout, "\n"); fprintf (stdout, "http://www.ibm.com\n"); fprintf (stdout, "\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t%s\n", "Name of the Virtual Machine to be fenced"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t%s\n", "Name of the SMAPI IUCV Server Virtual Machine"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t%s\n", "Node of the SMAPI IUCV Server Virtual Machine"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t%s\n", "Fencing action"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t%s\n", "Time to delay fencing action in seconds"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t\n"); fprintf (stdout, "\t\t%s\n", "Print usage"); fprintf (stdout, "\t\n"); fprintf (stdout, "\n"); fprintf (stdout, "\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\t\n"); fprintf (stdout, "\n"); fprintf (stdout, "\n"); return (0); } /** * get_options_stdin - get options from stdin * @zvm - Pointer to driver information * */ static int get_options_stdin (zvm_driver_t * zvm) { char buf[1024], *endPtr, *opt, *arg; int32_t lSrvName, lSrvNode, lTarget; int fence = ACT_OFFON; while (fgets (buf, sizeof (buf), stdin) != 0) { if (trim (buf) == 0) { continue; } if (buf[0] == '#') { continue; } opt = buf; if ((arg = strchr (opt, '=')) != 0) { *arg = 0; arg++; } else { continue; } if (trim (arg) == 0) continue; if (!strcasecmp (opt, "action")) { if (strcasecmp (arg, "reboot") == 0) { fence = ACT_OFFON; } else if (strcasecmp (arg, "off") == 0) { fence = ACT_OFF; } else if (strcasecmp (arg, "on") == 0) { fence = ACT_ON; } else if (strcasecmp (arg, "metadata") == 0) { fence = ACT_METADATA; } else if (strcasecmp (arg, "status") == 0) { fence = ACT_STATUS; } else if (strcasecmp (arg, "monitor") == 0) { fence = ACT_MONITOR; } else if (strcasecmp (arg, "list") == 0) { fence = ACT_LIST; } else { fence = ACT_HELP; } } else if (!strcasecmp (opt, "ipaddr")) { lSrvName = MIN (strlen (arg), sizeof (zvm->smapiSrv)); memcpy (zvm->smapiSrv, arg, lSrvName); continue; } else if (!strcasecmp (opt, "port")) { lTarget = MIN (strlen (arg), sizeof (zvm->target) - 1); strncpy (zvm->target, arg, lTarget); continue; } else if (!strcasecmp (opt, "timeout")) { zvm->timeOut = strtoul (arg, &endPtr, 10); if (*endPtr != 0) { syslog (LOG_WARNING, "Invalid timeout value specified %s " "defaulting to %d", arg, DEFAULT_DELAY); zvm->timeOut = DEFAULT_DELAY; } } else if (!strcasecmp (opt, "zvmsys")) { lSrvNode = MIN (strlen (arg), sizeof (zvm->node)); memcpy (zvm->node, arg, lSrvNode); continue; } else if (!strcasecmp (opt, "delay")) { zvm->delay = strtoul (arg, &endPtr, 10); if (*endPtr != 0) { syslog (LOG_WARNING, "Invalid delay value specified %s " "defaulting to %d", arg, DEFAULT_DELAY); zvm->delay = DEFAULT_DELAY; } } else if (!strcasecmp (opt, "help")) { fence = ACT_HELP; } } return (fence); } /** * get_options - get options from the command line * @argc - Count of arguments * @argv - Array of character strings * @zvm - Pointer to driver information * */ static int get_options (int argc, char **argv, zvm_driver_t * zvm) { int c, fence = ACT_OFFON; int32_t lSrvName, lSrvNode, lTarget; char *endPtr; while ((c = getopt_long (argc, argv, optString, longopts, NULL)) != -1) { switch (c) { case 'n': lTarget = MIN (strlen (optarg), sizeof (zvm->target)); memcpy (zvm->target, optarg, lTarget); break; case 'o': if (strcasecmp (optarg, "reboot") == 0) { fence = ACT_OFFON; } else if (strcasecmp (optarg, "off") == 0) { fence = ACT_OFF; } else if (strcasecmp (optarg, "on") == 0) { fence = ACT_ON; } else if (strcasecmp (optarg, "metadata") == 0) { fence = ACT_METADATA; } else if (strcasecmp (optarg, "status") == 0) { fence = ACT_STATUS; } else if (strcasecmp (optarg, "monitor") == 0) { fence = ACT_MONITOR; } else if (strcasecmp (optarg, "list") == 0) { fence = ACT_LIST; } else { fence = ACT_HELP; } break; case 'a': lSrvName = MIN (strlen (optarg), sizeof (zvm->smapiSrv)); memcpy (zvm->smapiSrv, optarg, lSrvName); break; case 'T': zvm->timeOut = strtoul (optarg, &endPtr, 10); if (*endPtr != 0) { syslog (LOG_WARNING, "Invalid timeout value specified: %s - " "defaulting to %d", optarg, DEFAULT_TIMEOUT); zvm->timeOut = DEFAULT_TIMEOUT; } break; case 'd': zvm->delay = strtoul (optarg, &endPtr, 10); if (*endPtr != 0) { syslog (LOG_WARNING, "Invalid delay value specified: %s - " "defaulting to %d", optarg, DEFAULT_DELAY); zvm->delay = DEFAULT_DELAY; } break; case 'z': lSrvNode = MIN (strlen (optarg), sizeof (zvm->node)); memcpy (zvm->node, optarg, lSrvNode); break; default: fence = ACT_HELP; } } return (fence); } /** * usage - display command syntax and parameters * */ static int usage () { printf ("Usage: fence_zvm [options]\n\n" "\tWhere [options] =\n" "\t-o --action [action] - \"off\", \"on\", \"list\", \"metadata\", " "\"monitor\", \"reboot\", \"status\"\n" "\t--delay [seconds] - Time to delay fencing action in seconds\n" "\t-n --plug [target] - Name of virtual machine to fence\n" "\t-a --ip [server] - Name of SMAPI IUCV Request server\n" "\t-T --timeout [secs] - Time to wait for fence in seconds - currently ignored\n" "\t--zvmsys [node] - z/VM Node on which SMAPI server lives\n" "\t-h --help - Display this usage information\n"); return (0); } /** * check_param - Check that mandatory parameters have been specified * @zvm - Pointer to driver information * */ static int check_parm (zvm_driver_t * zvm) { int rc; if (zvm->smapiSrv[0] != 0) { if (zvm->target[0] != 0) { rc = 0; } else { syslog (LOG_ERR, "Missing fence target name"); rc = 2; } } else { syslog (LOG_ERR, "Missing SMAPI server name"); rc = 1; } return (rc); } int main (int argc, char **argv) { zvm_driver_t zvm; int fence, rc = 0; openlog ("fence_zvm", LOG_CONS | LOG_PID, LOG_DAEMON); memset (&zvm, 0, sizeof (zvm)); zvm.timeOut = DEFAULT_TIMEOUT; zvm.delay = DEFAULT_DELAY; if (argc > 1) fence = get_options (argc, argv, &zvm); else fence = get_options_stdin (&zvm); switch (fence) { case ACT_OFFON: // OFFON if ((rc = check_parm (&zvm)) == 0) rc = zvm_smapi_imageRecycle (&zvm); break; case ACT_OFF: // OFF if ((rc = check_parm (&zvm)) == 0) rc = zvm_smapi_imageDeactivate (&zvm); break; case ACT_ON: // ON if ((rc = check_parm (&zvm)) == 0) rc = zvm_smapi_imageActivate (&zvm); break; case ACT_METADATA: // METADATA rc = zvm_metadata (); break; case ACT_STATUS: // STATUS if ((rc = check_parm (&zvm)) == 0) rc = zvm_smapi_imageQuery (&zvm); break; case ACT_MONITOR: // MONITOR rc = 0; break; case ACT_LIST: // LIST printf ("N/A"); rc = 0; break; case ACT_HELP: rc = usage (); } closelog (); return (rc); } #else #include int main (int argc, char **argv) { openlog ("fence_zvm", LOG_CONS | LOG_PID, LOG_DAEMON); syslog (LOG_ERR, "Fencing of a z/VM agent is not possible on this platform\n"); closelog (); return (-1); } #endif