/*
* Service.c
*
* Copyright (C) 2012 Red Hat, Inc. All rights reserved.
*
* 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 of the License, 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, see .
*
* Based on Syslog_Service.c from sblim-cmpi-syslog written by
* R Sharada , Copyright (c) IBM Corp. 2003, 2009
*
* Red Hat Author(s): Vitezslav Crhonek
*
*/
#include
#include
#include
#include
#include "ServiceUtils.h"
#include "util/serviceutil.h"
#define LOCALCLASSNAME "Linux_Service"
static const CMPIBroker *_broker;
#ifdef CMPI_VER_100
#define ServiceSetInstance ServiceModifyInstance
#endif
/* Instance MI Cleanup */
CMPIStatus
ServiceCleanup(CMPIInstanceMI *mi,
const CMPIContext *ctx,
CMPIBoolean terminate)
{
CMReturn(CMPI_RC_OK);
}
/* Instance MI Functions */
CMPIStatus
ServiceEnumInstanceNames(CMPIInstanceMI *mi,
const CMPIContext *ctx,
const CMPIResult *rslt,
const CMPIObjectPath *ref)
{
CMPIObjectPath *op = NULL;
CMPIStatus st = {CMPI_RC_OK,NULL};
void *enumhdl = NULL;
Service servicebuf;
int i = 0;
SList *slist = NULL;
service_debug(stderr,"ServiceEnumInstanceNames() called, ctx %p, result %p, op %p", ctx, rslt, ref);
memset(&servicebuf, '\0', sizeof(Service));
slist = Service_Find_All();
for(i = 0; i < slist->cnt; i++)
{
enumhdl = Service_Begin_Enum(slist->name[i]);
if (enumhdl == NULL)
{
CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED,
"Could not begin service names enumeration");
Service_Free_SList(slist);
return st;
}
else
{
if (Service_Next_Enum(enumhdl, &servicebuf, slist->name[i]))
{
// build object path from buffer
op = makeServicePath(_broker,
LOCALCLASSNAME,
CMGetCharPtr(CMGetNameSpace(ref, NULL)),
&servicebuf);
if (CMIsNullObject(op))
{
CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED,
"Could not construct object path");
goto label;
}
CMReturnObjectPath(rslt, op);
}
label:
CMReturnDone(rslt);
Service_End_Enum(enumhdl);
}
}
Service_Free_SList(slist);
return st;
}
CMPIStatus
ServiceEnumInstances(CMPIInstanceMI *mi,
const CMPIContext *ctx,
const CMPIResult *rslt,
const CMPIObjectPath *ref,
const char **properties)
{
CMPIInstance *in = NULL;
CMPIStatus st = {CMPI_RC_OK,NULL};
void *enumhdl = NULL;
Service servicebuf;
int i = 0;
SList *slist = NULL;
service_debug(stderr,"ServiceEnumInstances() called, ctx %p, result %p, op %p", ctx, rslt, ref);
memset(&servicebuf, '\0', sizeof(Service));
slist = Service_Find_All();
for(i = 0; i < slist->cnt; i++)
{
enumhdl = Service_Begin_Enum(slist->name[i]);
if (enumhdl == NULL)
{
CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED,
"Could not begin service instances enumeration");
Service_Free_SList(slist);
return st;
}
else
{
if (Service_Next_Enum(enumhdl, &servicebuf, slist->name[i]))
{
// build object instance from buffer
in = makeServiceInstance(_broker,
LOCALCLASSNAME,
CMGetCharPtr(CMGetNameSpace(ref, NULL)),
&servicebuf);
if (CMIsNullObject(in))
{
CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED,
"Could not construct instance");
goto label;
}
CMReturnInstance(rslt, in);
}
label:
CMReturnDone(rslt);
Service_End_Enum(enumhdl);
}
}
Service_Free_SList(slist);
return st;
}
CMPIStatus
ServiceGetInstance(CMPIInstanceMI *mi,
const CMPIContext *ctx,
const CMPIResult *rslt,
const CMPIObjectPath *cop,
const char **properties)
{
CMPIInstance *in = NULL;
CMPIStatus st = {CMPI_RC_OK,NULL};
CMPIData nd;
void *enumhdl = NULL;
Service servicebuf;
char *name = NULL;
int i = 0;
memset(&servicebuf, '\0', sizeof(Service));
service_debug(stderr,"ServiceGetInstance() called, ctx %p, result %p, op %p", ctx, rslt, cop);
nd = CMGetKey(cop, "Name", &st);
name = CMGetCharPtr(nd.value.string);
service_debug(stderr,"Name = %s", name);
enumhdl = Service_Begin_Enum(name);
if (enumhdl == NULL) {
CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED,
"Could not begin service instances enumeration");
return st;
} else {
if (Service_Next_Enum(enumhdl,&servicebuf, name)) {
if (strncmp(name, servicebuf.svName, 6)==0) {
// build object instance from buffer
in = makeServiceInstance(_broker,
LOCALCLASSNAME,
CMGetCharPtr(CMGetNameSpace(cop,NULL)),
&servicebuf);
if (CMIsNullObject(in)) {
CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED,
"Could not construct instance");
goto label;
}
CMReturnInstance(rslt,in);
}
}
label:
CMReturnDone(rslt);
Service_End_Enum(enumhdl);
}
return st;
}
/* Instance MI functions - not supported */
CMPIStatus
ServiceCreateInstance(CMPIInstanceMI *mi,
const CMPIContext *ctx,
const CMPIResult *rslt,
const CMPIObjectPath *cop,
const CMPIInstance *ci)
{
CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
}
CMPIStatus
ServiceSetInstance(CMPIInstanceMI *mi,
const CMPIContext *ctx,
const CMPIResult *rslt,
const CMPIObjectPath *cop,
const CMPIInstance *ci,
const char **properties)
{
CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
}
CMPIStatus
ServiceDeleteInstance(CMPIInstanceMI *mi,
const CMPIContext *ctx,
const CMPIResult *rslt,
const CMPIObjectPath *cop)
{
CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
}
CMPIStatus
ServiceExecQuery(CMPIInstanceMI *mi,
const CMPIContext *ctx,
const CMPIResult *rslt,
const CMPIObjectPath *cop,
const char *lang,
const char *query)
{
CMReturn(CMPI_RC_ERR_NOT_SUPPORTED);
}
/* Method MI Cleanup */
CMPIStatus
ServiceMethodCleanup(CMPIMethodMI *mi,
const CMPIContext *ctx,
CMPIBoolean terminate)
{
CMReturn(CMPI_RC_OK);
}
/* Method MI Functions */
CMPIStatus
ServiceInvokeMethod(CMPIMethodMI *mi,
const CMPIContext *ctx,
const CMPIResult *rslt,
const CMPIObjectPath *cop,
const char *method,
const CMPIArgs *in,
CMPIArgs *out)
{
CMPIStatus st = {CMPI_RC_OK,NULL};
CMPIData dt;
char typebuf[1000];
char *name = NULL;
memset(&typebuf, '\0', sizeof(typebuf));
dt = CMGetKey(cop, "Name", &st);
if (st.rc != CMPI_RC_OK)
{
CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED,
"Could not get instance name");
}
else
{
name = CMGetCharPtr(dt.value.string);
if (Service_Operation(name, method, typebuf, sizeof(typebuf)))
{
/* If the function returns 1, then failure */
CMSetStatusWithChars(_broker, &st, CMPI_RC_ERR_FAILED,
"Could not get instance type");
}
else
{
CMReturnData(rslt, typebuf, CMPI_chars);
CMReturnDone(rslt);
}
}
return st;
}
/* Instance MI Factory */
CMInstanceMIStub(Service,
Service,
_broker,
CMNoHook);
/* Method MI Factory */
CMMethodMIStub(Service,
Service,
_broker,
CMNoHook);