⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wrudf-cmnd.c

📁 linux下的DVD格式udf文件读取库
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -