222
222
extern void setEnumArray(CMPIEnumeration * enumeration,CMPIArray * array);
224
223
static CMPIEnumeration *cpyEnumResponses(BinRequestContext * binCtx,
225
224
BinResponseHdr ** resp,
230
CMPIObjectPath *path;
230
233
CMPIArray *ar,*art;
231
234
CMPIEnumeration *enm;
234
237
_SFCB_ENTER(TRACE_CIMXMLPROC, "genEnumResponses");
236
239
ar = NewCMPIArray(arrLen, binCtx->type, NULL);
237
240
art = NewCMPIArray(0, binCtx->type, NULL);
239
242
for (c = 0, i = 0; i < binCtx->rCount; i++) {
240
243
for (j = 0; j < resp[i]->count; c++, j++) {
241
244
if (binCtx->type == CMPI_ref)
242
relocateSerializedObjectPath(resp[i]->object[j].data);
245
object.path = relocateSerializedObjectPath(resp[i]->object[j].data);
243
246
else if (binCtx->type == CMPI_instance)
244
relocateSerializedInstance(resp[i]->object[j].data);
247
object.inst = relocateSerializedInstance(resp[i]->object[j].data);
245
248
else if (binCtx->type == CMPI_class) {
246
relocateSerializedConstClass(resp[i]->object[j].data);
249
object.cls = relocateSerializedConstClass(resp[i]->object[j].data);
248
// inst=CMClone(inst,NULL);
249
rc=CMSetArrayElementAt(ar,c, (CMPIValue*)&inst, binCtx->type);
251
// object.inst=CMClone(object.inst,NULL);
252
rc=CMSetArrayElementAt(ar,c, (CMPIValue*)&object.inst, binCtx->type);
253
256
enm = NewCMPIEnumeration(art, NULL);
254
257
setEnumArray(enm,ar);
255
258
art->ft->release(art);
257
260
_SFCB_RETURN(enm);
1514
1519
extern int setupControl(char *fn);
1515
1520
extern int errno;
1522
static int localConnectCount = 0;
1523
static pthread_mutex_t lcc_mutex = PTHREAD_MUTEX_INITIALIZER;
1525
#define CONNECT_LOCK() pthread_mutex_lock(&lcc_mutex)
1526
#define CONNECT_UNLOCK() pthread_mutex_unlock(&lcc_mutex)
1527
#define CONNECT_UNLOCK_RETURN(rc) { pthread_mutex_unlock(&lcc_mutex); return (rc);}
1517
1529
int localConnect(ClientEnv* ce, CMPIStatus *st)
1519
1531
static struct sockaddr_un serverAddr;
1520
int sock,rc,sfcbSocket;
1532
int sock,rc=0,sfcbSocket;
1522
1534
unsigned long int l;
1534
if ((sock=socket(PF_UNIX, SOCK_STREAM, 0))<0) {
1547
if (localConnectCount == 0) {
1548
if ((sock=socket(PF_UNIX, SOCK_STREAM, 0))<0) {
1537
1550
st->rc=CMPI_RC_ERR_FAILED;
1538
1551
st->msg=ce->ft->newString(ce,strerror(errno),NULL);
1543
if (socketName==NULL) {
1545
rc=getControlChars("localSocketPath", &socketName);
1553
CONNECT_UNLOCK_RETURN(-1);
1556
if (socketName==NULL) {
1558
rc=getControlChars("localSocketPath", &socketName);
1562
st->rc=CMPI_RC_ERR_FAILED;
1563
st->msg=ce->ft->newString(ce,"failed to open sfcb local socket",NULL);
1548
1565
fprintf(stderr,"--- Failed to open sfcb local socket (%d)\n",rc);
1567
CONNECT_UNLOCK_RETURN(-2);
1571
serverAddr.sun_family=AF_UNIX;
1572
strcpy(serverAddr.sun_path,socketName);
1574
if (connect(sock,(struct sockaddr*)&serverAddr,
1575
sizeof(serverAddr.sun_family)+strlen(serverAddr.sun_path))<0) {
1577
st->rc=CMPI_RC_ERR_FAILED;
1578
st->msg=ce->ft->newString(ce,strerror(errno),NULL);
1581
CONNECT_UNLOCK_RETURN(-1);
1584
msg.size=sizeof(msg)-sizeof(msg.size);
1587
user=getenv("USER");
1588
strncpy(msg.id, (user) ? user : "", sizeof(msg.id)-1);
1589
msg.id[sizeof(msg.id)-1]=0;
1591
l=write(sock, &msg, sizeof(msg));
1593
rc = spRecvCtlResult(&sock, &sfcbSocket,&idData, &l);
1594
if (rc < 0 || sfcbSocket <= 0) {
1596
st->rc=CMPI_RC_ERR_FAILED;
1597
st->msg=ce->ft->newString(ce,"failed to get socket fd for local connect",NULL);
1599
fprintf(stderr,"--- Failed to get socket fd for local connect (%d, %d, %lu)\n", rc, sfcbSocket, l);
1601
CONNECT_UNLOCK_RETURN(-3);
1603
sfcbSockets.send=sfcbSocket;
1553
serverAddr.sun_family=AF_UNIX;
1554
strcpy(serverAddr.sun_path,socketName);
1556
if (connect(sock,(struct sockaddr*)&serverAddr,
1557
sizeof(serverAddr.sun_family)+strlen(serverAddr.sun_path))<0) {
1559
st->rc=CMPI_RC_ERR_FAILED;
1560
st->msg=ce->ft->newString(ce,strerror(errno),NULL);
1565
msg.size=sizeof(msg)-sizeof(msg.size);
1568
user=getenv("USER");
1569
strncpy(msg.id, (user) ? user : "", sizeof(msg.id)-1);
1570
msg.id[sizeof(msg.id)-1]=0;
1572
l=write(sock, &msg, sizeof(msg));
1574
rc = spRecvCtlResult(&sock, &sfcbSocket,&idData, &l);
1576
sfcbSockets.send=sfcbSocket;
1607
localConnectCount += 1;
1611
return (rc == 0) ? rc : sfcbSocket;
1583
1614
static void* release(ClientEnv* ce)
1585
1616
void *lib=ce->hdl;
1586
close(sfcbSockets.send);
1618
if (localConnectCount > 0) localConnectCount -= 1;
1619
if (localConnectCount == 0) {
1620
close(sfcbSockets.send);
1621
sfcbSockets.send = -1;
1588
1625
uninitGarbageCollector();