📄 fileio.c
字号:
err_ret: inode_Free(fs, inode); DEBUG_PRINT(("_u_chmod err=%#x\n", err)); return err;}LOCAL ER _u_fchmod( FS *fs, CmdPkt *pkt ){ SF_FCHMOD_PARA *para = pkt->cmd.para; FDPkt fdp; ER err; /* Search of file descriptor */ fdp.fd = searchFileDescriptor(pkt->uxinfo, para->fd); if (( fdp.fd == NULL )||( fdp.fd->fs != fs )) { err = E_FD; goto err_ret; } fdp.fdno = para->fd; /* Check of file system */ if ( fs == (FS*)&STDIO_FS ) { err = E_FD; goto err_ret; } else if ( fs == (FS*)&ROOT_FS ) { err = E_RONLY; goto err_ret; } /* Modification of file mode */ if ( fs == (FS*)&STD_FS ) { err = sf_fchmod(&fdp, para->mode); } else { /* Writing access of file system */ if ( fs->rdonly != 0 ) { err = E_RONLY; goto err_ret; } err = (*fs->u_fchmod)(&fdp, para->mode); } if ( err < E_OK ) { goto err_ret; } return err;err_ret: DEBUG_PRINT(("_u_fchmod err=%#x\n", err)); return err;}/* * Creation of directory */LOCAL ER _u_mkdir( FS *fs, CmdPkt *pkt ){ SF_MKDIR_PARA *para = pkt->cmd.para; LPINF *lp = pkt->exinf; INODE *inode = lp->inode; mode_t mode; ER err; /* Check of file system */ if ( fs == (FS*)&STDIO_FS ) { err = E_PAR; goto err_ret; } else if ( fs == (FS*)&ROOT_FS ) { err = E_OBJ; goto err_ret; } /* Existence of directory */ if ( inode->ino != NOEXS_INO ) { err = E_OBJ; goto err_ret; } /* File creation mode */ mode = (mode_t)para->mode & ~(pkt->uxinfo->cmask); /* Directory creation */ if ( fs == (FS*)&STD_FS ) { err = sf_mkdir(inode, lp->path, mode); if ( err < E_OK ) { goto err_ret; } } else { /* Writing access of file system */ if ( fs->rdonly != 0 ) { err = E_RONLY; goto err_ret; } err = (*fs->u_mkdir)(fs, inode, lp->path, mode); if ( err < E_OK ) { goto err_ret; } (void)SyncFS(fs->diskid, NULL); err = CheckDiskError(fs, NULL); if ( err < E_OK ) { goto err_ret; } } /* Deletion of file reference node */ inode_Free(fs, inode); return E_OK;err_ret: inode_Free(fs, inode); DEBUG_PRINT(("_u_mkdir err = %#x\n", err)); return err;}/* * Deletion of directory */LOCAL ER _u_rmdir( FS *fs, CmdPkt *pkt ){ LPINF *lp = pkt->exinf; INODE *inode = lp->inode; B *sp, *ep; ER err; /* Check of file system */ if ( fs == (FS*)&STDIO_FS ) { err = E_PAR; goto err_ret; } else if ( fs == (FS*)&ROOT_FS ) { err = E_BUSY; goto err_ret; } /* Existence of directory */ if ( inode->ino == NOEXS_INO ) { err = E_NOEXS; goto err_ret; } /* Check of file type */ if (( fs != (FS*)&STD_FS )&&( inode->type != DT_DIR )) { err = toERUX(ENOTDIR); goto err_ret; } /* Root directory of file system */ if ( fs != (FS*)&STD_FS ) { if ( inode->ino == fs->rootino ) { err = E_FACV; goto err_ret; } } else { if ( inode->ino == SROOT_INO ) { err = E_FACV; goto err_ret; } } /* Check of file name */ sp = lp->path; ep = strchr(sp, '/'); if ( ep == NULL ) { ep = strchr(sp, '\0'); } if (( ep == NULL )|| (((ep - sp) == 1 )&&( strncmp(sp, ".", (size_t)1) == 0)) || (((ep - sp) == TSD_FIO_VAL_2 )&&( strncmp(sp, "..", (size_t)TSD_FIO_SZT_2) == 0) )) { err = E_PAR; goto err_ret; } /* Check of the number of references */ if ( inode->refcnt > 0 ) { err = E_BUSY; goto err_ret; } /* Deletion of directory */ if ( fs == (FS*)&STD_FS ) { err = sf_rmdir(inode); if ( err < E_OK ) { goto err_ret; } } else { /* Writing access of file system */ if ( fs->rdonly != 0 ) { err = E_RONLY; goto err_ret; } err = (*fs->u_rmdir)(fs, inode); if ( err < E_OK ) { goto err_ret; } (void)SyncFS(fs->diskid, NULL); err = CheckDiskError(fs, NULL); if ( err < E_OK ) { goto err_ret; } } /* Deletion of file reference node */ inode_Free(fs, inode); return E_OK;err_ret: inode_Free(fs, inode); DEBUG_PRINT(("_u_rmdir err = %#x\n", err)); return err;}/* * Creation of file */LOCAL WER _u_creat( FS *fs, CmdPkt *pkt ){ SF_CREAT_PARA *para = pkt->cmd.para; LPINF *lp = pkt->exinf; INODE *inode = lp->inode; FDPkt fdp; mode_t mode; W fildes; ER err; /* Check of file system */ if ( fs == (FS*)&STDIO_FS ) { err = E_PAR; goto err_ret1; } else if ( fs == (FS*)&ROOT_FS ) { err = E_RONLY; goto err_ret1; } /* Creation of file descriptor */ err = new_FileDescriptor(fs, &fdp, pkt->uxinfo); if ( err < E_OK ) { goto err_ret1; } /* File creation mode */ mode = (mode_t)para->mode & ~(pkt->uxinfo->cmask); /* Creation of file */ fdp.fd->inode = inode; if ( fs == (FS*)&STD_FS ) { fildes = sf_open(&fdp, lp->path, (O_CREAT | O_WRONLY | O_TRUNC), mode); if ( fildes < E_OK ) { err = fildes; goto err_ret2; } } else { /* Writing access of file system */ if ( fs->rdonly != 0 ) { err = E_RONLY; goto err_ret2; } fildes = (*fs->u_open)(&fdp, lp->path, (O_CREAT | O_WRONLY | O_TRUNC), mode); if ( fildes < E_OK ) { err = fildes; goto err_ret2; } (void)SyncFS(fs->diskid, NULL); err = CheckDiskError(fs, NULL); if ( err < E_OK ) { goto err_ret2; } } /* Registration of file reference node */ inode_Register(fs, inode, O_WRONLY); return fildes;err_ret2: fdp.fd->inode = NULL; (void)del_FileDescriptor(pkt->uxinfo, &fdp);err_ret1: inode_Free(fs, inode); DEBUG_PRINT(("_u_creat err=%#x\n", err)); return err;}/* * Modification of access time and correction time */LOCAL ER _u_utimes( FS *fs, CmdPkt *pkt ){ SF_UTIMES_PARA *para = pkt->cmd.para; LPINF *lp = pkt->exinf; INODE *inode = lp->inode; ER err; /* Check of file system */ if ( fs == (FS*)&STDIO_FS ) { err = E_PAR; goto err_ret; } else if ( fs == (FS*)&ROOT_FS ) { err = E_RONLY; goto err_ret; } if ( para->times != NULL ) { /* Parameter check */ err = CheckSpaceRW((VP)para->times, sizeof(struct timeval) * TSD_UUT_VAL_2); if ( err < E_OK ) { goto err_ret; } } /* Existence of file */ if ( inode->ino == NOEXS_INO ) { err = E_NOEXS; goto err_ret; } /* Modification of time */ if ( fs == (FS*)&STD_FS ) { err = sf_utimes(inode, para->times); if ( err < E_OK ) { goto err_ret; } } else { /* Writing access of file system */ if ( fs->rdonly != 0 ) { err = E_RONLY; goto err_ret; } err = (*fs->u_utimes)(fs, inode, para->times); if ( err < E_OK ) { goto err_ret; } (void)SyncFS(fs->diskid, NULL); err = CheckDiskError(fs, NULL); if ( err < E_OK ) { goto err_ret; } } /* Deletion of file reference node */ inode_Free(fs, inode); return E_OK;err_ret: inode_Free(fs, inode); DEBUG_PRINT(("_u_utimes err=%#x\n", err)); return err;}/* * Configuration of file creation mask * No calling from task */LOCAL WER _u_umask( FS *fs, CmdPkt *pkt ){ SF_UMASK_PARA *para = pkt->cmd.para; UXINFO *uxinfo = pkt->uxinfo; W oldm; oldm = (W)uxinfo->cmask; uxinfo->cmask = para->cmask; return oldm;}/* * Configure the file size to the designated length */LOCAL ER _u_truncate( FS *fs, CmdPkt *pkt ){ SF_TRUNCATE_PARA *para = pkt->cmd.para; LPINF *lp = pkt->exinf; INODE *inode = lp->inode; ER err; /* Check of file system */ if (( fs == (FS*)&ROOT_FS )||( fs == (FS*)&STDIO_FS )) { err = E_PAR; goto err_ret; } else if ( fs == (FS*)&ROOT_FS ) { err = toERUX(EISDIR); goto err_ret; } /* Existence of file */ if ( inode->ino == NOEXS_INO ) { err = E_NOEXS; goto err_ret; } /* Check of file type */ if ( inode->type != DT_REG ) { err = toERUX(EISDIR); goto err_ret; } /* Configure the file size to the designated length */ if ( fs == (FS*)&STD_FS ) { err = sf_truncate(inode, para->length); if ( err < E_OK ) { goto err_ret; } } else { /* Writing access of file system */ if ( fs->rdonly != 0 ) { err = E_RONLY; goto err_ret; } err = (*fs->u_truncate)(fs, inode, para->length); if ( err < E_OK ) { goto err_ret; } (void)SyncFS(fs->diskid, NULL); err = CheckDiskError(fs, NULL); if ( err < E_OK ) { goto err_ret; } } /* Deletion of file reference node */ inode_Free(fs, inode); return E_OK;err_ret: inode_Free(fs, inode); DEBUG_PRINT(("_u_truncate err=%#x\n", err)); return err;}LOCAL ER _u_ftruncate( FS *fs, CmdPkt *pkt ){ SF_FTRUNCATE_PARA *para = pkt->cmd.para; FD *fd; FDPkt fdp; ER err; /* Search of file descriptor */ fd = searchFileDescriptor(pkt->uxinfo, para->fildes); if (( fd == NULL )||( fd->fs != fs )) { err = E_FD; goto err_ret; } fdp.fd = fd; fdp.fdno = para->fildes; /* Check of file type */ if (( fs == (FS*)&ROOT_FS )|| ((fd->inode != NULL )&&( fd->inode->type != DT_REG))) { err = toERUX(EISDIR); goto err_ret; } /* Check of open mode */ if ( (fd->omode & O_ACCMODE) == O_RDONLY ) { err = E_FD; goto err_ret; } /* Check of file system */ if ( fs == (FS*)&STDIO_FS ) { err = E_FD; goto err_ret; } /* Modification of file mode */ if ( fs == (FS*)&STD_FS ) { err = sf_ftruncate(&fdp, para->length); } else { err = (*fs->u_ftruncate)(&fdp, para->length); } if ( err < E_OK ) { goto err_ret; } return err;err_ret: DEBUG_PRINT(("_u_ftruncate err=%#x\n", err)); return err;}/* * Synchronization of disk */LOCAL ER _u_sync( FS *fs, CmdPkt *pkt ){ ER err; if ( fs == (FS*)&STD_FS ) { err = tkse_syn_fls(); if ( err < E_OK ) { goto err_ret; } } else { (void)SyncFS(fs->diskid, NULL); err = CheckDiskError(fs, NULL); if ( err < E_OK ) { goto err_ret; } } return E_OK;err_ret: DEBUG_PRINT(("_u_sync err=%#x\n", err)); return err;}/* * Acquisition of file information */LOCAL ER _u_stat( FS *fs, CmdPkt *pkt ){ SF_STAT_PARA *para = pkt->cmd.para; LPINF *lp = pkt->exinf; INODE *inode = lp->inode; ER err; /* Parameter check */ err = CheckSpaceRW((VP)para->sb, sizeof(struct stat)); if ( err < E_OK ) { goto err_ret; } /* Existence of file */ if (( fs != (FS*)&ROOT_FS )&&( fs != (FS*)&STDIO_FS )) { if ( inode->ino == NOEXS_INO ) { err = E_NOEXS; goto err_ret; } } /* Acquisition of file information */ if ( fs == (FS*)&STD_FS ) { err = sf_stat(inode, para->sb); if ( err < E_OK ) { goto err_ret; } } else if ( fs == (FS*)&ROOT_FS ) { err = rt_stat(para->sb); if ( err < E_OK ) { goto err_ret; } } else if ( fs == (FS*)&STDIO_FS ) { err = E_NOSPT; goto err_ret; } else { err = (*fs->u_stat)(fs, inode, para->sb); if ( err < E_OK ) { goto err_ret; } (void)SyncFS(fs->diskid, NULL); err = CheckDiskError(fs, NULL); if ( err < E_OK ) { goto err_ret; } } /* Deletion of file reference node */ inode_Free(fs, inode); return E_OK;err_ret: inode_Free(fs, inode); DEBUG_PRINT(("_u_stat err=%#x\n", err)); return err;}LOCAL ER _u_lstat( FS *fs, CmdPkt *pkt ){ SF_LSTAT_PARA *para = pkt->cmd.para; LPINF *lp = pkt->exinf; INODE *inode = lp->inode; ER err; /* Parameter check */ err = CheckSpaceRW((VP)para->sb, sizeof(struct stat)); if ( err < E_OK ) { goto err_ret; } /* Existence of file */ if (( fs != (FS*)&ROOT_FS )&&( fs != (FS*)&STDIO_FS )) { if ( inode->ino == NOEXS_INO ) { err = E_NOEXS; goto err_ret; } } /* Acqusition of file information */ if ( fs == (FS*)&STD_FS ) { err = sf_lstat(inode, para->sb); if ( err < E_OK ) { goto err_ret; } } else if ( fs == (FS*)&ROOT_FS ) { err = rt_lstat(para->sb); if ( err < E_OK ) { goto err_ret; } } else if ( fs == (FS*)&STDIO_FS ) { err = E_NOSPT; goto err_ret; } else { err = (*fs->u_lstat)(fs, inode, para->sb); if ( err < E_OK ) { goto err_ret; } (void)SyncFS(fs->diskid, NULL); err = CheckDiskError(fs, NULL); if ( err < E_OK ) { goto err_ret; } } /* Deletion of file reference node */ inode_Free(fs, inode); return E_OK;err_ret: inode_Free(fs, inode); DEBUG_PRINT(("_u_lstat err=%#x\n", err)); return err;}LOCAL ER _u_fstat( FS *fs, CmdPkt *pkt ){ SF_FSTAT_PARA *para = pkt->cmd.para; FDPkt fdp; ER err; /* Parameter check */ err = CheckSpaceRW((VP)para->sb, sizeof(struct stat)); if ( err < E_OK ) { goto err_ret; } /* Search of file descriptor */ fdp.fd = searchFileDescriptor(pkt->uxinfo, para->fd); if (( fdp.fd == NULL )||( fdp.fd->fs != fs )) { err = E_FD; goto err_ret; } fdp.fdno = para->fd; /* Acquisition of file information */ if ( fs == (FS*)&STD_FS ) { err = sf_fstat(&fdp, para->sb); } else if ( fs == (FS*)&ROOT_FS ) { err = rt_fstat(&fdp, para->sb); } else if ( fs == (FS*)&STDIO_FS ) { err = std_fstat(&fdp, para->sb); } else { err = (*fs->u_fstat)(&fdp, para->sb); } if ( err < E_OK ) { goto err_ret; } return err;err_ret: DEBUG_PRINT(("_u_fstat err=%#x\n", err)); return err;}/* * Acquisition of file system list */LOCAL ER _u_getfsstat( FS *fs, CmdPkt *pkt ){ SF_GETFSSTAT_PARA *para = pkt->cmd.para; W fscnt; ER err; if ( fs == (FS*)&STD_FS ) { /* Standard file system In the case buffer is NULL, acquire the number of file systems only */ fscnt = sf_getfsstat(para->buf, para->bufsize, para->flags); if ( fscnt < E_OK ) { err = fscnt; goto err_ret; } } else { struct statfs *sfs; W bufsz; /* Other file systems In the case buffer is NULL, update only the number of file systems */ fscnt = pkt->cmd.ret; /* Check of buffer size */ if ( para->buf != NULL ) { /* Location to store file system */ sfs = para->buf + fscnt; bufsz = para->bufsize - (fscnt * (W)sizeof(struct statfs)); /* Check of buffer size */ if ( bufsz < (W)sizeof(struct statfs) ) { return fscnt; /* buffer shortage */ } /* Acquisition of file system information */ err = (*fs->u_getfsstat)(fs, sfs, para->flags); if ( err < E_OK ) { goto err_ret; } } fscnt++; } return fscnt;err_ret: DEBUG_PRINT(("_u_getfsstat err=%#x\n", err)); return err;}/* * Acquisition of file "LINK" */LOCAL ER _u_getlink( FS *fs, CmdPkt *pkt ){ SF_GETLINK_PARA *para = pkt->cmd.para; LPINF *lp = pkt->exinf;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -