📄 wrudf-cmnd.c
字号:
if( strcmp(comp, "..") == 0 ) { if( !curDir->parent ) return DIR_INVALID; curDir = curDir->parent; return EXISTING_DIR; } *fid = findFileIdentDesc(curDir, comp); if( *fid == NULL ) return DOES_NOT_EXIST; if( (*fid)->fileCharacteristics & FID_FILE_CHAR_DIRECTORY ) { if( (*fid)->fileCharacteristics & FID_FILE_CHAR_DELETED ) return DELETED_DIR; else { curDir = readDirectory(curDir, &(*fid)->icb, comp); return EXISTING_DIR; } } else { if( (*fid)->fileCharacteristics & FID_FILE_CHAR_DELETED ) return DELETED_FILE; } return EXISTING_FILE; }int cpCommand(void) { int i, rv; enum RV state; char *srcname, *name, *p; Directory *cpyDir; struct fileIdentDesc *fid, *newFid; struct stat fileStat; if( cmndc < 2 ) return WRONG_NO_ARGS; name = NULL; state = analyzeDest(cmndv[cmndc-1], &fid, &name); if( state == DIR_INVALID ) return DIR_INVALID; if( state == DELETED_DIR ) { printf("Cannot reuse deleted directory name yet\n"); return CMND_FAILED; } if( state == DELETED_FILE ) { removeFID(curDir, fid); state = DOES_NOT_EXIST; } if( state == EXISTING_FILE ) { if( questionOverwrite(curDir, fid, name) ) return CMND_FAILED; state = DOES_NOT_EXIST; } /* do I have write permission for the destination directory ? */ /* process source arguments */ for( i = 0; i < cmndc - 1; i++ ) { p = strrchr(cmndv[i], '/'); if( p && p > cmndv[i] && *(p+1) == 0 ) *p = 0; // remove any trailing slash (except in "/") p = strrchr(cmndv[i], '/'); if( p ) { srcname = p+1; } else srcname = cmndv[i]; if( (rv = lstat(cmndv[i], &fileStat)) < 0 ) { // do not follow soft links printf("stat failed on %s\n", cmndv[i]); continue; } if( S_ISDIR(fileStat.st_mode) ) { if( state == EXISTING_DIR ) { newFid = findFileIdentDesc(curDir, srcname); if( newFid == NULL ) { cpyDir = makeDir(curDir, srcname); newFid = findFileIdentDesc(curDir, srcname); } else { if( newFid->fileCharacteristics != FID_FILE_CHAR_DIRECTORY ) { printf("Destination is not a directory\n"); return CMND_FAILED; } cpyDir = readDirectory(curDir, &newFid->icb, srcname); } chdir(cmndv[i]); copyDirectory(cpyDir, "."); } else printf("Destination is not a directory\n"); chdir(hdWorkingDir); continue; } if( !S_ISREG(fileStat.st_mode) ) { printf("Can only copy regular files or directories\n"); return CMND_FAILED; } if( state == DOES_NOT_EXIST || state == EXISTING_DIR ) name = srcname; copyFile(curDir, cmndv[i], name, &fileStat); } return CMND_OK;}int rmCommand(void) { enum RV state; int i; struct fileIdentDesc *fid; char* name; if( cmndc < 1 ) return CMND_ARG_INVALID; for( i = 0; i < cmndc; i++ ) { state = analyzeDest(cmndv[i], &fid, &name); if( state == EXISTING_FILE ) { deleteFID(curDir, fid); continue; } if( state != EXISTING_DIR ) return state; if( options & OPT_RECURSIVE ) { deleteDirectory(curDir, fid); continue; } else printf("Cannot delete directory '%s' without -r option\n", cmndv[i]); } return CMND_OK;}intmkdirCommand(void) { int rv; char *name; struct fileIdentDesc *fid; Directory *newDir; if( cmndc != 1 ) return WRONG_NO_ARGS; rv = analyzeDest(cmndv[0], &fid, &name); if( rv == DIR_INVALID ) return DIR_INVALID; if( rv == EXISTING_FILE || rv == EXISTING_DIR ) { if( fid->fileCharacteristics & FID_FILE_CHAR_DELETED ) { removeFID(curDir, fid); } else return rv; } newDir = makeDir(curDir, name); if( !newDir ) return CMND_FAILED; curDir = newDir; return CMND_OK;}intrmdirCommand(void) { int state; struct fileIdentDesc *fid; char* name; if( cmndc != 1 ) return WRONG_NO_ARGS; state = analyzeDest(cmndv[0], &fid, &name); if( state != EXISTING_DIR ) return state; if( !directoryIsEmpty(curDir) ) return DIR_NOT_EMPTY; if( !curDir->parent ) { printf("Cannot remove root directory\n"); return CMND_FAILED; } return deleteFID(curDir, fid);}int cdcCommand() { int state; struct fileIdentDesc *fid; char* name; if( cmndc != 1 ) return WRONG_NO_ARGS; state = analyzeDest(cmndv[0], &fid, &name); if( state != EXISTING_DIR ) return state; return CMND_OK;}int lscCommand(void) { struct fileIdentDesc *fid; struct fileEntry *fe; char *name, filename[512]; int i, state; if( cmndc > 1 ) return WRONG_NO_ARGS; if( cmndc == 1 ) { state = analyzeDest(cmndv[0], &fid, &name); if( state != EXISTING_DIR ) return state; } for( i = 0; i < curDir->fe.informationLength; i += ((sizeof(struct fileIdentDesc) + fid->lengthOfImpUse + fid->lengthFileIdent + 3) & ~3) ) { fid = (struct fileIdentDesc*)(curDir->data + i); if( fid->fileCharacteristics & FID_FILE_CHAR_DELETED ) continue; if( fid->fileCharacteristics & FID_FILE_CHAR_PARENT ) strcpy(filename, ".."); else { memset(filename, 0, sizeof(filename)); strncpy(filename, fid->fileIdent + fid->lengthOfImpUse + 1, fid->lengthFileIdent - 1); /* Look at udf filesystem how to convert dstring to ordinary characters */ } fe = readTaggedBlock( fid->icb.extLocation.logicalBlockNum, fid->icb.extLocation.partitionReferenceNum); printf("%s %6d:%c%c%c%c%c %6d:%c%c%c%c%c other:%c%c%c%c%c links:%2d info:%12d %s\n", fe->icbTag.fileType == ICBTAG_FILE_TYPE_DIRECTORY ? "DIR" : " ", fe->uid, fe->permissions & FE_PERM_U_READ ? 'r' : '-', fe->permissions & FE_PERM_U_WRITE ? 'w' : '-', fe->permissions & FE_PERM_U_EXEC ? 'x' : '-', fe->permissions & FE_PERM_U_CHATTR ? 'a' : '-', fe->permissions & FE_PERM_U_DELETE ? 'd' : '-', fe->gid, fe->permissions & FE_PERM_G_READ ? 'r' : '-', fe->permissions & FE_PERM_G_WRITE ? 'w' : '-', fe->permissions & FE_PERM_G_EXEC ? 'x' : '-', fe->permissions & FE_PERM_G_CHATTR ? 'a' : '-', fe->permissions & FE_PERM_G_DELETE ? 'd' : '-', fe->permissions & FE_PERM_O_READ ? 'r' : '-', fe->permissions & FE_PERM_O_WRITE ? 'w' : '-', fe->permissions & FE_PERM_O_EXEC ? 'x' : '-', fe->permissions & FE_PERM_O_CHATTR ? 'a' : '-', fe->permissions & FE_PERM_O_DELETE ? 'd' : '-', fe->fileLinkCount, (uint32_t)fe->informationLength, filename); } return CMND_OK;}int cdhCommand() { if( cmndc > 1 ) return WRONG_NO_ARGS; chdir(cmndv[0]); if( hdWorkingDir ) free(hdWorkingDir); hdWorkingDir = getcwd(NULL, 0); printf("Harddisk working directory set to %s\n", cmndv[0]); return CMND_OK;}int lshCommand() { char cmnd[128]; if( cmndc > 1 ) return WRONG_NO_ARGS; strcpy(cmnd, "ls -l "); if( cmndc == 1 ) strcat(cmnd, cmndv[0]); system(cmnd); return CMND_OK;}/* directoryIsEmpty() * Return 1 if a directory contains only a parent dir entry and, possibly 0, deleted entries; * Otherwise return 0; */intdirectoryIsEmpty(Directory *dir) { int i; struct fileIdentDesc *fid; for( i = 0; i < dir->fe.informationLength; i += ((sizeof(struct fileIdentDesc) + fid->lengthOfImpUse + fid->lengthFileIdent + 3) & ~3) ) { fid = (struct fileIdentDesc*)(dir->data + i); if( fid->fileCharacteristics & (FID_FILE_CHAR_DELETED | FID_FILE_CHAR_PARENT) ) continue; return 0; } return 1;}/* questionOverwrite() * Query whether to overwrite existing file. * Remove the FID entry from the directory if reply was 'y' and return 0. * Return 1 if don't overwrite. */intquestionOverwrite(Directory *dir, struct fileIdentDesc *fid, char* name){ printf("File %s already exists. Overwrite ? (y/N) : ", name);#ifdef _GNU_SOURCE readLine(NULL);#else fgets(line, 256, stdin);#endif if( (line[0] | 0x20) != 'y' ) return 1; deleteFID(dir, fid); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -