DllExport int call_conv closeConnection(void) { int (*disconnectDriver)(struct xsb_connectionHandle *); int (*closeStmtDriver)(struct xsb_queryHandle *); char* (*errorMesgDriver)(); char* handle; int val, i, j; handle = ptoc_string(CTXTc 1); for (i = 0 ; i < numCHandles ; i++) { if (!strcmp(CHandles[i]->handle, handle)) { if (getDriverFunction(CHandles[i]->driver, DISCONNECT) != NULL) disconnectDriver = getDriverFunction(CHandles[i]->driver, DISCONNECT)->disconnectDriver; else return FALSE; val = disconnectDriver(CHandles[i]); if (val == FAILURE) { errorMesgDriver = getDriverFunction(CHandles[i]->driver, ERROR_MESG)->errorMesgDriver; errorMesg = errorMesgDriver(); return FALSE; } for (j = 0 ; j < numQHandles ; j++) { if (!strcmp(QHandles[j]->connHandle->handle, handle)) { if (getDriverFunction(CHandles[i]->driver, ERROR_MESG) != NULL) closeStmtDriver = getDriverFunction(CHandles[i]->driver, ERROR_MESG)->closeStmtDriver; else return FALSE; val = closeStmtDriver(QHandles[j]); if (val == FAILURE) { errorMesgDriver = getDriverFunction(CHandles[i]->driver, ERROR_MESG)->errorMesgDriver; errorMesg = errorMesgDriver(); return FALSE; } freeQueryHandle(QHandles[j], j); j--; } } freeConnectionHandle(CHandles[i], i); return TRUE; } } errorMesg = "XSB_DBI ERROR: Connection handle does not exist"; errorNumber = "XSB_DBI_004"; return FALSE; }
int doUnregisterDriver(sceUsbdLddOps *drv) { sceUsbdLddOps *pos; for (pos = drvListStart; pos != NULL; pos = pos->next) if (pos == drv) { if (drv->next) drv->next->prev = drv->prev; else drvListEnd = drv->prev; if (drv->prev) drv->prev->next = drv->next; else drvListStart = drv->next; disconnectDriver(memPool.deviceTreeRoot, drv); return 0; } return USB_RC_BADDRIVER; }
void disconnectDriver(Device *tree, sceUsbdLddOps *drv) { Endpoint *ep, *nextEp; if (tree->devDriver == drv) { if (tree->endpointListStart) { ep = tree->endpointListStart->next; while (ep) { nextEp = ep->next; removeEndpointFromDevice(tree, ep); ep = nextEp; } } tree->devDriver = NULL; tree->privDataField = NULL; } for (tree = tree->childListStart; tree != NULL; tree = tree->next) disconnectDriver(tree, drv); }