124
static void handleSigterm(int sig)
126
mlogf(M_ERROR,M_SHOW, "%s: exiting due to signal %d\n", "provider", sig);
130
static void handleSigSegv(int sig)
132
mlogf(M_ERROR,M_SHOW, "()%d): exiting due to a SIGSEGV signal %d - %s(%d)\n",
133
currentProc, sig, __FILE__, __LINE__);
141
125
* Instance Provider support
182
* Find the provider for className residing in nameSpace
183
* If none is found for that specific class, try the parent class
184
* If still none, return DefaultProvider
197
187
static ProviderInfo *lookupProvider(long type, char *className, char *nameSpace,
383
372
for (info = providers->ft->getFirst(providers); info;
384
373
info = providers->ft->getNext(providers), n--) {
385
374
if (info->type!=FORCE_PROVIDER_NOTFOUND &&
386
(rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
375
(rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
387
376
_SFCB_TRACE(1,("--- responding with %s %p %d",info->providerName,info,count));
388
377
spSendCtlResult(requestor, &info->providerSockets.send,
389
378
MSG_X_PROVIDER, count--, getProvIds(info).ids, req->options);
423
410
if ((info = lookupProvider(type,className,nameSpace,&st)) != NULL) {
424
411
if (info->type!=FORCE_PROVIDER_NOTFOUND &&
425
(rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
412
(rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
426
413
spSendCtlResult(requestor, &info->providerSockets.send, MSG_X_PROVIDER,
427
414
0, getProvIds(info).ids, req->options);
430
417
spSendCtlResult(requestor, &sfcbSockets.send, MSG_X_PROVIDER_NOT_FOUND, 0,
431
418
NULL, req->options);
611
596
for (info = providers->ft->getFirst(providers); info;
612
597
info = providers->ft->getNext(providers)) {
613
598
if (info->type!=FORCE_PROVIDER_NOTFOUND &&
614
(rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
599
(rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
615
600
_SFCB_TRACE(1,("--- responding with %s %p %d",info->providerName,info,count));
616
601
spSendCtlResult(requestor, &info->providerSockets.send,
617
602
MSG_X_PROVIDER, count--, getProvIds(info).ids, req->options);
634
617
/* When there is no provider for an assocClass we do not want to produce
635
618
* an error message. So we return the default provider and expect it
636
619
* to produce a nice and empty result */
637
if((rc = forkProvider(defaultProvInfoPtr, req, &msg)) == CMPI_RC_OK) {
620
if((rc = forkProvider(defaultProvInfoPtr, req, NULL)) == CMPI_RC_OK) {
638
621
_SFCB_TRACE(1,("--- responding with %s %p %d",
639
622
defaultProvInfoPtr->providerName,
640
623
defaultProvInfoPtr,count));
642
625
MSG_X_PROVIDER, count--, getProvIds(defaultProvInfoPtr).ids,
630
/* Oops, even creation of the default provider failed */
631
mlogf(M_ERROR,M_SHOW,"--- forkProvider failed for defaultProvider\n");
632
/* spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND, 0,
633
NULL, req->options); */
706
697
static void classProvider(int *requestor, OperationHdr * req)
710
700
_SFCB_ENTER(TRACE_PROVIDERMGR, "classProvider");
711
forkProvider(classProvInfoPtr, req, &msg);
701
rc = forkProvider(classProvInfoPtr, req, NULL);
702
if (rc != CMPI_RC_OK)
704
mlogf(M_ERROR,M_SHOW,"--- forkProvider failed in classProvider\n");
705
/* spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND, 0,
706
NULL, req->options); */
712
710
_SFCB_TRACE(1,("--- result %d-%lu to with %d-%lu",
713
711
*requestor,getInode(*requestor),
714
712
classProvInfoPtr->providerSockets.send,
717
715
spSendCtlResult(requestor, &classProvInfoPtr->providerSockets.send, MSG_X_PROVIDER,
718
716
0, getProvIds(classProvInfoPtr).ids, req->options);
723
720
static void qualiProvider(int *requestor, OperationHdr * req)
727
723
_SFCB_ENTER(TRACE_PROVIDERMGR, "qualiProvider");
728
forkProvider(qualiProvInfoPtr, req, &msg);
724
rc = forkProvider(qualiProvInfoPtr, req, NULL);
725
if (rc != CMPI_RC_OK)
727
mlogf(M_ERROR,M_SHOW,"--- forkProvider failed in qualiProvider\n");
728
/* spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND, 0,
729
NULL, req->options); */
729
732
_SFCB_TRACE(1,("--- result %d-%lu to with %d-%lu",
730
733
*requestor,getInode(*requestor),
731
734
qualiProvInfoPtr->providerSockets.send,
748
750
if (strcmp(className, "$ClassProvider$") == 0)
749
751
classProvider(requestor, req);
750
752
else if ((info = getMethodProvider(className,nameSpace)) != NULL) {
751
754
if (info->type!=FORCE_PROVIDER_NOTFOUND &&
752
(rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
755
(rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
753
756
_SFCB_TRACE(1,("--- responding with %s %p",info->providerName,info));
754
757
spSendCtlResult(requestor, &info->providerSockets.send, MSG_X_PROVIDER,
755
758
0, getProvIds(info).ids, req->options);
758
spSendCtlResult(requestor, &sfcbSockets.send, MSG_X_PROVIDER_NOT_FOUND,
761
if (rc != CMPI_RC_OK)
763
mlogf(M_ERROR,M_SHOW,"--- forkProvider failed in methProvider\n");
766
spSendCtlResult(requestor, &sfcbSockets.send, MSG_X_PROVIDER_NOT_FOUND,
759
767
0, NULL, req->options);
773
781
char *nameSpace = (char *) req->nameSpace.data;
774
782
ProviderInfo *info;
778
785
ctx->chunkedMode=ctx->xmlAs=0;
779
786
if (strcmp(className, "$ClassProvider$") == 0) {
780
forkProvider(classProvInfoPtr, req, &msg);
787
rc = forkProvider(classProvInfoPtr, req, NULL);
788
if (rc != CMPI_RC_OK)
790
mlogf(M_ERROR,M_SHOW,"--- forkProvider failed in _methProvider (%s)\n", className);
791
/* spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND, 0,
792
NULL, req->options); */
781
795
ctx->provA.ids = getProvIds(classProvInfoPtr);
782
796
ctx->provA.socket = classProvInfoPtr->providerSockets.send;
784
798
_SFCB_RETURN(MSG_X_PROVIDER);
786
800
else if (strcmp(className, "$InterOpProvider$") == 0) {
787
forkProvider(interOpProvInfoPtr, req, &msg);
801
rc = forkProvider(interOpProvInfoPtr, req, NULL);
802
if (rc != CMPI_RC_OK)
804
mlogf(M_ERROR,M_SHOW,"--- forkProvider failed in _methProvider (%s)\n", className);
805
/* spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND, 0,
806
NULL, req->options); */
788
809
ctx->provA.ids = getProvIds(interOpProvInfoPtr);
789
810
ctx->provA.socket = interOpProvInfoPtr->providerSockets.send;
791
812
_SFCB_RETURN(MSG_X_PROVIDER);
793
814
else if ((info = getMethodProvider(className,nameSpace)) != NULL) {
794
if ((rc = forkProvider(info, req, &msg)) == CMPI_RC_OK) {
815
if ((rc = forkProvider(info, req, NULL)) == CMPI_RC_OK) {
795
816
ctx->provA.ids = getProvIds(info);
796
817
ctx->provA.socket = info->providerSockets.send;
798
819
_SFCB_RETURN(MSG_X_PROVIDER);
822
mlogf(M_ERROR,M_SHOW,"--- _methProvider NOT FOUND\n");
823
/* spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND, 0,
824
NULL, req->options); */
802
825
_SFCB_RETURN(MSG_X_PROVIDER_NOT_FOUND);
828
mlogf(M_ERROR,M_SHOW,"--- _methProvider INVALID\n");
805
829
_SFCB_RETURN(MSG_X_INVALID_CLASS);
912
936
static void setInuseSem(void *id)
916
_SFCB_ENTER(TRACE_PROVIDERMGR, "setInuseSem");
918
semAcquire(sfcbSem,(ids.procId*3)+provProcGuardId+provProcBaseId);
919
semAcquire(sfcbSem,(ids.procId*3)+provProcInuseId+provProcBaseId);
920
semReleaseUnDo(sfcbSem,(ids.procId*3)+provProcInuseId+provProcBaseId);
921
semRelease(sfcbSem,(ids.procId*3)+provProcGuardId+provProcBaseId);
941
_SFCB_ENTER(TRACE_PROVIDERMGR, "setInuseSem");
942
if (sfcbSem < 0) { //Semaphore Not initialized.
943
semKey=ftok(SFCB_BINARY,'S');
944
sfcbSem=semget(semKey,1, 0600);
949
semAcquire(sfcbSem,PROV_GUARD(ids.procId));
950
semAcquire(sfcbSem,PROV_INUSE(ids.procId));
951
semReleaseUnDo(sfcbSem,PROV_INUSE(ids.procId));
952
semRelease(sfcbSem,PROV_GUARD(ids.procId));
955
986
_SFCB_TRACE(1,("--- Sending mgr request - to %d from %d", sfcbSockets.send,
957
spSendReq(&sfcbSockets.send, &sockets.send, buf, l, localMode);
988
rc = spSendReq(&sfcbSockets.send, &sockets.send, buf, l, localMode);
992
mlogf(M_ERROR,M_SHOW,"--- spSendReq/spSendMsg failed to send on %d (%d)\n", sfcbSockets.send, rc);
994
close (sockets.send);
995
close (sockets.receive);
960
999
_SFCB_TRACE(1, ("--- Sending mgr request done"));
962
1001
ctx->rc = spRecvCtlResult(&sockets.receive, &ctx->provA.socket, &ctx->provA.ids.ids, &l);
1326
1364
req.nameSpace = setCharsMsgSegment((char *) ns);
1327
1365
req.className = setCharsMsgSegment((char *) cn);
1329
forkProvider(classProvInfoPtr, &req, &msg);
1367
irc = forkProvider(classProvInfoPtr, &req, NULL);
1368
if (irc != CMPI_RC_OK)
1370
mlogf(M_ERROR,M_SHOW,"--- forkProvider failed in _getConstClass(%s:%s)\n", ns, cn);
1371
/* spSendCtlResult(requestor, &dmy, MSG_X_PROVIDER_NOT_FOUND, 0,
1372
NULL, req->options); */
1331
1376
memset(&binCtx,0,sizeof(BinRequestContext));
1332
1377
binCtx.oHdr = &req;
1333
1378
binCtx.bHdr = &sreq.hdr;
1425
1470
irc = _methProvider(&binCtx, &req);
1472
if (irc == MSG_X_PROVIDER) {
1428
1473
localInvokeMethod(&binCtx, path, "ischild", in, &out, &rc,0);
1429
1474
irc=(rc.rc==CMPI_RC_OK);
1455
1500
irc = _methProvider(&binCtx, &req);
1502
if (irc == MSG_X_PROVIDER) {
1458
1503
localInvokeMethod(&binCtx, path, "_startup", in, &out, &rc, 1);
1459
1504
irc=(rc.rc==CMPI_RC_OK);
1491
1536
irc = _methProvider(&binCtx, &req);
1538
if (irc == MSG_X_PROVIDER) {
1494
1539
data = localInvokeMethod(&binCtx, path, "getchildren", in, &out, &rc, 0);
1496
1541
ar = CMGetArg(out, "children", &rc).value.array;
1532
1577
memset(&binCtx,0,sizeof(BinRequestContext));
1533
1578
irc = _methProvider(&binCtx, &req);
1580
if (irc == MSG_X_PROVIDER) {
1536
1581
data = localInvokeMethod(&binCtx, path, "getassocs", in, &out, &rc,0);
1538
1583
ar = CMGetArg(out, "assocs", &rc).value.array;