/* * Disable disk cache */ STATUS flashFsDisableDcache(void) { if (flashFsVerbose) printf("flashFsDisableDcache\n"); /* Disable disk cache - Hack */ taskDelete(dcacheUpdTaskId); dcacheUpdTaskId = 0; #if 0 CBIO_DEV_ID dcacheHandle; void *devHandle; char fullname[20]; /* Set the disk cache sync delay to 0 */ devHandle = iosDevFind("flash:", &fullname); dcacheHandle = *(CBIO_DEV_ID*)((int)devHandle + 24); /* FIXME */ if (flashFsVerbose) { printf("dcacheDevTune - devHandle=0x%x, dcacheHandle=0x%x\n", (int)devHandle, (int)dcacheHandle); } if (dcacheDevTune(dcacheHandle, 0, 0, 0, 0) != OK) { printf("flashFsDisableDcache: dcacheDevTune failed\n"); return ERROR; } dcacheDevDisable(dcacheHandle); /* only for dosFS 2.2 */ #endif /* dcacheShow(dcacheHandle, 0); */ return OK; }
static void vxCmdDestructor(MprCmd *cmd) { MprCmdFile *files; int i; if (cmd->startCond) { semDelete(cmd->startCond); } if (cmd->exitCond) { semDelete(cmd->exitCond); } files = cmd->files; for (i = 0; i < MPR_CMD_MAX_PIPE; i++) { if (files[i].name) { DEV_HDR *dev; #if _WRS_VXWORKS_MAJOR >= 6 cchar *tail; #else char *tail; #endif if ((dev = iosDevFind(files[i].name, &tail)) != NULL) { iosDevDelete(dev); } } } }
/********************************************************************************************************* ** 函数名称: API_PipeDevDelete ** 功能描述: 删除一个管道设备 ** 输 入 : ** pcName 管道名称 ** bForce 强制删除 ** 输 出 : ERROR ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT API_PipeDevDelete (PCHAR pcName, BOOL bForce) { REGISTER PLW_PIPE_DEV p_pipedev; PCHAR pcTail = LW_NULL; if (LW_CPU_GET_CUR_NESTING()) { _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (PX_ERROR); } if (_G_iPipeDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } p_pipedev = (PLW_PIPE_DEV)iosDevFind(pcName, &pcTail); if ((p_pipedev == LW_NULL) || (pcName == pcTail)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "device not found.\r\n"); _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND); return (PX_ERROR); } if (bForce == LW_FALSE) { if (LW_DEV_GET_USE_COUNT(&p_pipedev->PIPEDEV_devhdrHdr)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n"); _ErrorHandle(EBUSY); return (PX_ERROR); } if (SEL_WAKE_UP_LIST_LEN(&p_pipedev->PIPEDEV_selwulList) > 0) { errno = EBUSY; return (PX_ERROR); } } iosDevFileAbnormal(&p_pipedev->PIPEDEV_devhdrHdr); iosDevDelete(&p_pipedev->PIPEDEV_devhdrHdr); SEL_WAKE_UP_LIST_TERM(&p_pipedev->PIPEDEV_selwulList); API_SemaphoreBDelete(&p_pipedev->PIPEDEV_hWriteLock); API_MsgQueueDelete(&p_pipedev->PIPEDEV_hMsgQueue); __SHEAP_FREE((PVOID)p_pipedev); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: API_CanDevRemove ** 功能描述: 移除一个 CAN 设备 ** 输 入 : ** pcName 需要移除的 CAN 设备 ** bForce 模式选择 ** 输 出 : ERROR_NONE or PX_ERROR ** 全局变量: ** 调用模块: ** API 函数 *********************************************************************************************************/ LW_API INT API_CanDevRemove (PCHAR pcName, BOOL bForce) { __PCAN_PORT pDevHdr; PCHAR pcTail = LW_NULL; if (LW_CPU_GET_CUR_NESTING()) { _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (PX_ERROR); } if (_G_iCanDrvNum <= 0) { _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n"); _ErrorHandle(ERROR_IO_NO_DRIVER); return (PX_ERROR); } pDevHdr = (__PCAN_PORT)iosDevFind(pcName, &pcTail); if ((pDevHdr == LW_NULL) || (pcName == pcTail)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "device not found.\r\n"); _ErrorHandle(ERROR_IOS_DEVICE_NOT_FOUND); return (PX_ERROR); } if (bForce == LW_FALSE) { if (LW_DEV_GET_USE_COUNT(&pDevHdr->CANPORT_can.CAN_devhdr)) { _DebugHandle(__ERRORMESSAGE_LEVEL, "too many open files.\r\n"); _ErrorHandle(EBUSY); return (PX_ERROR); } if (SEL_WAKE_UP_LIST_LEN(&pDevHdr->CANPORT_can.CAN_selwulList) > 0) { errno = EBUSY; return (PX_ERROR); } } iosDevFileAbnormal(&pDevHdr->CANPORT_can.CAN_devhdr); iosDevDelete(&pDevHdr->CANPORT_can.CAN_devhdr); SEL_WAKE_UP_LIST_TERM(&pDevHdr->CANPORT_can.CAN_selwulList); __canDevDelete(&pDevHdr->CANPORT_can); __SHEAP_FREE((PVOID)pDevHdr); return (ERROR_NONE); }
int devDelete(char* devName) { myDev * i = first; char * pNameTail; myDev * dev = (myDev*) iosDevFind (devName,&pNameTail); if ((*pNameTail)!='\0' || dev==NULL) //If pNameTail is not '\0', either we don't have an exact match //or we have no match at all { errnoSet(UNKNOWN_DEVICE); semGive(semMAdmin); return -1; } if(semMAdmin==0) { errnoSet(NOT_INSTALLED); return -1; } if(semTake(semMAdmin,WAIT_FOREVER)==-1) { errnoSet(SEM_ERR); return -1; } if (dev->openned != 0) { //There are still openned file descriptors on this device, //we can't delete it, give back semaphores and leave. semGive(dev->semMData); errnoSet(OPENNED_DEV); semGive(semMAdmin); return -1; } iosDevDelete((DEV_HDR*)dev); //This only prevents further oppenings. //Find and delete the device in device list : if (dev==first) { first=dev->next; } else { for (i=first;i->next!=dev;i=i->next); i->next=dev->next; } semTake(dev->semMData,WAIT_FOREVER); //Let pending ops on this dev finish semDelete(dev->semMData); //We don't need to release it to delete it free(dev); semGive(semMAdmin); return 0; }
static void resetCmd(MprCmd *cmd, bool finalizing) { MprCmdFile *files; int i; assert(cmd); files = cmd->files; for (i = 0; i < MPR_CMD_MAX_PIPE; i++) { if (cmd->handlers[i]) { mprDestroyWaitHandler(cmd->handlers[i]); cmd->handlers[i] = 0; } if (files[i].clientFd >= 0) { close(files[i].clientFd); files[i].clientFd = -1; } if (files[i].fd >= 0) { close(files[i].fd); files[i].fd = -1; } #if VXWORKS if (files[i].name) { DEV_HDR *dev; cchar *tail; if ((dev = iosDevFind(files[i].name, &tail)) != NULL) { iosDevDelete(dev); } } #endif } cmd->eofCount = 0; cmd->complete = 0; cmd->status = -1; if (cmd->pid && (!(cmd->flags & MPR_CMD_DETACH) || finalizing)) { mprStopCmd(cmd, -1); reapCmd(cmd, finalizing); cmd->pid = 0; } if (cmd->signal) { mprRemoveSignalHandler(cmd->signal); cmd->signal = 0; } }
fhstatus * mountproc_mnt_1(dirpath * dirpathp, struct svc_req * reqp) { static fhstatus fhstatus; DEV_HDR *dev_hdrp; char *dummy; vxfh_t *vxfhp; nfsd_debug("mount mnt\n"); bzero(&fhstatus, sizeof(fhstatus)); /* * we only export filesystem device at the root. currently no config * file is used. all rt11 and msdos filesystem devices are exported. * no security & option support either. */ if ((dev_hdrp = iosDevFind(*dirpathp, &dummy)) == NULL) { fhstatus.fhs_status = errnoGet(); return (&fhstatus); } if (dev_hdrp->drvNum == rt11FsDrvNum) { fhstatus.fhs_status = NFS_OK; vxfhp = (vxfh_t *) & (fhstatus.fhstatus_u.fhs_fhandle); vxfhp->type = rt11FsDrvNum; strcpy(vxfhp->opaque, (char *) (*dirpathp)); if (nfsd_debug_on) d(vxfhp, sizeof(*vxfhp)); return (&fhstatus); } if (dev_hdrp->drvNum == dosFsDrvNum) { vxfhp = (vxfh_t *) & (fhstatus.fhstatus_u.fhs_fhandle); if (newfh(vxfhp, *dirpathp) == ERROR) { fhstatus.fhs_status = NFSERR_NODEV; return (&fhstatus); } fhstatus.fhs_status = NFS_OK; return (&fhstatus); } fhstatus.fhs_status = NFSERR_NODEV; return (&fhstatus); }
static char_t *getAbsolutePath(char_t *path) { char_t *tail; char_t *dev; /* * Determine if path is relative or absolute. If relative, prepend * the current working directory to the name. Otherwise, use it. * Note the getcwd call below must not be ggetcwd or else we go into * an infinite loop */ if (iosDevFind(path, &tail) != NULL && path != tail) { return bstrdup(B_L, path); } dev = balloc(B_L, LF_PATHSIZE); getcwd(dev, LF_PATHSIZE); strcat(dev, "/"); strcat(dev, path); return dev; }
/* Get absolute path. In VxWorks, functions like chdir, ioctl for mkdir and ioctl for rmdir, require an absolute path. This function will take the path argument and convert it to an absolute path. It is the caller's responsibility to deallocate the returned string. */ static char *getAbsolutePath(char *path) { #if _WRS_VXWORKS_MAJOR >= 6 const char *tail; #else char *tail; #endif char *dev; /* Determine if path is relative or absolute. If relative, prepend the current working directory to the name. Otherwise, use it. Note the getcwd call below must not be getcwd or else we go into an infinite loop */ if (iosDevFind(path, &tail) != NULL && path != tail) { return sclone(path); } dev = walloc(ME_GOAHEAD_LIMIT_FILENAME); getcwd(dev, ME_GOAHEAD_LIMIT_FILENAME); strcat(dev, "/"); strcat(dev, path); return dev; }
statfsres * nfsproc_statfs_2(nfs_fh * fhp, struct svc_req * reqp) { static statfsres statfsres; vxfh_t *vxfhp; char *pathp, *dummy; DEV_HDR *devhdrp; RT_VOL_DESC *rt11devp; DOS_VOL_DESC *dosdevp; BLK_DEV *blkp; nfsd_debug("statfs\n"); bzero(&statfsres, sizeof(statfsres)); vxfhp = (vxfh_t *) fhp; if ((pathp = fh2path(vxfhp)) == NULL) { statfsres.status = errnoGet(); nfsd_debugno(); return (&statfsres); } if ((devhdrp = iosDevFind(pathp, &dummy)) == NULL) { statfsres.status = errnoGet(); nfsd_debugno(); return (&statfsres); } if (vxfhp->type == rt11FsDrvNum) { rt11devp = (RT_VOL_DESC *) devhdrp; statfsres.statfsres_u.reply.tsize = nfsd_optimal_tsize; statfsres.statfsres_u.reply.bsize = RT_BYTES_PER_BLOCK; statfsres.statfsres_u.reply.blocks = rt11devp->vd_nblocks; /* * XXX - bogus vlaues -- make it look like all blocks are * available since there's no easy way to tell */ statfsres.statfsres_u.reply.bfree = rt11devp->vd_nblocks; statfsres.statfsres_u.reply.bavail = rt11devp->vd_nblocks; } else if (vxfhp->type == dosFsDrvNum) { dosdevp = (DOS_VOL_DESC *) devhdrp; blkp = dosdevp->dosvd_pBlkDev; statfsres.statfsres_u.reply.tsize = nfsd_optimal_tsize; statfsres.statfsres_u.reply.bsize = blkp->bd_bytesPerBlk; statfsres.statfsres_u.reply.blocks = blkp->bd_nBlocks; /* * XXX - bogus vlaues -- make it look like all blocks are * available since there's no easy way to tell */ statfsres.statfsres_u.reply.bfree = blkp->bd_nBlocks; statfsres.statfsres_u.reply.bavail = blkp->bd_nBlocks; /* * save this info for later */ msdog_bytes_per_block = blkp->bd_nBlocks; } statfsres.status = NFS_OK; return (&statfsres); }