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;
}
Example #2
0
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;
}
Example #3
0
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);
}