📄 stdfs.c
字号:
/* Confirmation of buffer size */ if ( nl >= maxlnk ) { maxlnk += LINKBUF_UNIT; temp = Vrealloc(link, maxlnk * sizeof(UH)); if ( temp == NULL ) { Vfree(link); goto err_ret1; } link = temp; } /* Save of link */ if ( err >= E_OK ) { /* File ID storage */ link[nl] = lnk.f_id; /* File type */ err = tkse_fil_sts(&lnk, NULL, &stat, NULL); if ( err < E_OK ) { goto err_ret2; } if (( lnk.f_id == 0 )|| ((stat.f_atype == ATYPE_DIR )||( stat.f_nlink > 0))) { /* Directory */ type = DT_DIR; for ( ; *np == '/'; np++ ) { ; } } else { /* Regular file */ type = DT_REG; if ( *np == '/' ) { err = toERUX(ENOTDIR); goto err_ret2; } } } else { /* Nonexistent file */ for ( ; *np == '/'; np++ ) { ; } if ( *np != '\0' ) { err = E_NOEXS; goto err_ret2; } } /* Next link location */ nl++; } /* Acquisition of file reference node */ inode = Vmalloc(sizeof(SFNODE)); if ( inode == NULL ) { err = E_NOMEM; goto err_ret2; } memset(inode, 0, (size_t)sizeof(SFNODE)); if ( err >= E_OK ) { /* Existent file */ inode->c.ino = SFFS_INO(lnk.f_id); inode->c.type = (UB)type; inode->link = lnk; } else { /* Nonexisitent file */ inode->c.ino = NOEXS_INO; /* File system name save */ tc_strncpy(inode->link.fs_name, lnk.fs_name, L_FSNM); } inode->c.exinf = link; inode->nlnk = nl; lp->inode = (INODE*)inode; lp->flag = LOOKUP_DONE; lp->path = p; return E_OK;err_ret2: Vfree(link);err_ret1: DEBUG_PRINT(("sf_lookup err=%#x\n", err)); return err;}/* --------------------------------------------------------------------------- *//* * Modification of file size * Return 1 to return value if present record is decided. Return 0 to retun value if present record is not decided. */LOCAL WER btTruncateFile( SFNODE *inode, W sffd, off_t length, BOOL currec ){ UB *buf; W rsz, recsz, wsz; ER err = E_OK; /* Transfer to operation object record */ if ( !currec ) { err = tkse_fnd_rec(sffd, F_TOPEND, TSD_STD_TFR_0X80000000, 0U, NULL); if (( err < E_OK )&&( err != E_REC )) { goto err_ret1; } } if ( err < E_OK ) { /* Record addition */ /* No size modification */ if ( length <= 0 ) { return 0; } /* Writing data creation */ buf = malloc((UW)length); if ( buf == NULL ) { err = E_NOMEM; goto err_ret1; } memset(buf, 0, (size_t)length); /* Writing into new record */ err = tkse_apd_rec(sffd, (B*)buf, length, TSD_STD_TAR_31, 0, 0); if ( err < E_OK ) { goto err_ret2; } free(buf); /* A new record in a present record */ err = tkse_fnd_rec(sffd, F_ENDTOP, TSD_STD_TFR_0X80000000, 0U, NULL); if ( err < E_OK ) { goto err_ret1; } } else { /* Present record */ /* Acquisition of record size */ err = tkse_rea_rec(sffd, 0, NULL, 0, &recsz, NULL); if ( err < E_OK ) { goto err_ret1; } if ( recsz == length ) { /* No size modification */ return 1; } else if ( recsz > length ) { /* Reduce the size */ err = tkse_trc_rec(sffd, length); if ( err < E_OK ) { goto err_ret1; } } else { /* Extend the size */ wsz = length - recsz; buf = malloc((UW)wsz); if ( buf == NULL ) { err = E_NOMEM; goto err_ret1; } memset(buf, 0, (size_t)wsz); /* Data writing */ err = tkse_wri_rec(sffd, TSD_STD_TWR_M1, (B*)buf, wsz, &rsz, NULL, 0); if ( err < E_OK ) { goto err_ret2; } free(buf); } } return 1;err_ret2: free(buf);err_ret1: DEBUG_PRINT(("btTruncateFile err=%#x\n", err)); return err;}/* * Configure file size to the designated length */EXPORT ER sf_truncate( INODE *_inode, off_t length ){ SFNODE *inode = (SFNODE*)_inode; W sffd; ER err; /* File open */ sffd = tkse_opn_fil(&inode->link, F_UPDATE, NULL); if ( sffd < E_OK ) { err = sffd; goto err_ret1; } /* File size modification */ err = btTruncateFile(inode, sffd, length, FALSE); if ( err < E_OK ) { goto err_ret2; } /* File close */ err = tkse_cls_fil(sffd); if ( err < E_OK ) { goto err_ret1; } return E_OK;err_ret2: (void)tkse_cls_fil(sffd);err_ret1: DEBUG_PRINT(("sf_truncate err=%#x\n", err)); return err;}EXPORT ER sf_ftruncate( FDPkt *fdp, off_t length ){ SFFD *fd = (SFFD*)fdp->fd; SFNODE *inode = (SFNODE*)fd->c.inode; W sffd = fd->sffd; ER err; /* File size modification */ err = btTruncateFile(inode, sffd, length, fd->currec); if ( err < E_OK ) { goto err_ret; } fd->currec = err; return E_OK;err_ret: DEBUG_PRINT(("sf_ftruncate err=%#x\n", err)); return err;}/* --------------------------------------------------------------------------- *//* * File mode modification */EXPORT ER sf_chmod( INODE *_inode, mode_t mode ){ SFNODE *inode = (SFNODE*)_inode; ER err; /* Access attribute modification */ if ( !(mode & (S_IWUSR|S_IWGRP|S_IWOTH)) ) { /* Unwritable attribute set */ err = tkse_chg_fat(&inode->link, F_SETRONLY); if (( err < E_OK )&&( err != E_RONLY )) { goto err_ret; } if ( err == E_RONLY ) { /* Unwritable file system is error */ err = tkse_chg_fat(&inode->link, F_RSTRONLY); if ( err < E_OK ) { goto err_ret; } /* Retry at unwritable state */ err = tkse_chg_fat(&inode->link, F_SETRONLY); if ( err < E_OK ) { goto err_ret; } } } else { /* Unwritable attribute reset */ err = tkse_chg_fat(&inode->link, F_RSTRONLY); if ( err < E_OK ) { goto err_ret; } } return E_OK;err_ret: DEBUG_PRINT(("sf_chmod err=%#x\n", err)); return err;}EXPORT ER sf_fchmod( FDPkt *fdp, mode_t mode ){ SFFD *fd = (SFFD*)fdp->fd; SFNODE *inode = (SFNODE*)fd->c.inode; ER err; /* Access attribute modification */ if ( !(mode & (S_IWUSR|S_IWGRP|S_IWOTH)) ) { /* unwritable attribute set */ err = tkse_chg_fat(&inode->link, F_SETRONLY); if (( err < E_OK )&&( err != E_RONLY )) { goto err_ret; } if ( err == E_RONLY ) { /* Unwritable file system is error*/ err = tkse_chg_fat(&inode->link, F_RSTRONLY); if ( err < E_OK ) { goto err_ret; } /* Retry at unwritable state */ err = tkse_chg_fat(&inode->link, F_SETRONLY); if ( err < E_OK ) { goto err_ret; } } } else { /* Unwritable attribute reset*/ err = tkse_chg_fat(&inode->link, F_RSTRONLY); if ( err < E_OK ) { goto err_ret; } } return E_OK;err_ret: DEBUG_PRINT(("sf_fchmod err=%#x\n", err)); return err;}/* --------------------------------------------------------------------------- *//* * Modification of access time and correction time */EXPORT ER sf_utimes( INODE *_inode, const struct timeval times[TSD_SUT_TIM_2] ){ SFNODE *inode = (SFNODE*)_inode; F_TIME ftime; STIME stime; ER err; /* File date and hour configuration */ ftime.f_ltime = 0; if ( times != NULL ) { /* Designated time */ ftime.f_atime = (STIME)times[0].tv_sec; ftime.f_mtime = (STIME)times[1].tv_sec; } else { /* Present time */ err = tkse_get_tim2(&stime, NULL); if ( err < E_OK ) { goto err_ret; } ftime.f_atime = ftime.f_mtime = stime; } /* File date and hour modification */ err = tkse_chg_ftm(&inode->link, &ftime); if ( err < E_OK ) { goto err_ret; } return E_OK;err_ret: DEBUG_PRINT(("sf_utimes err=%#x\n", err)); return err;}/* --------------------------------------------------------------------------- *//* * Modification of file name */EXPORT ER sf_rename( INODE *_from, INODE *_to, const char *fname ){ SFNODE *from = (SFNODE*)_from, *to = (SFNODE*)_to; UH *src = (UH*)from->c.exinf, *dst = (UH*)to->c.exinf; LINK sl, spl, dl, dpl; W len, sfd, dfd; F_STATE dstat; TC tcname[L_FNM + 1];const B *p, *np; ER err; /* Nonexistent connection name error */ if (( to->c.ino == NOEXS_INO )&&( to->nlnk < TSD_STD_NLN_2 )) { err = toERUX(EXDEV); goto err_ret1; } /* Root directory designation error*/ if (( from->nlnk < TSD_STD_NLN_2 )||( to->nlnk < TSD_STD_NLN_2 )) { err = E_FACV; goto err_ret1; } /* Check of file system */ if ( tc_strncmp(from->link.fs_name, to->link.fs_name, L_FSNM) != 0 ) { err = toERUX(EXDEV); goto err_ret1; } /* File name appearace order */ for ( p = np = fname; (np = strchr(np + 1, ':')) != NULL; p = np ) { ; } if ( p != fname ) { /* Confirmation of appearance order */ for ( np = p + 1;( *np >= '0' )&&( *np <= '9'); np++ ) { ; } /* File name and file type */ if (( *np == '/' )&&( from->c.type != DT_DIR )) { err = E_FNAME; goto err_ret1; } /* Keep as it is when it is not in appearance order */ if (((*np != '\0' )&&( *np != '/')) ||( np == (p + 1) )) { p = fname; } } /* Check of file name */ if ( p == fname ) { p = strchr(fname, '/'); if ( p == NULL ) { p = strchr(fname, '\0'); } else if ( from->c.type != DT_DIR ) { err = E_FNAME; goto err_ret1; } /* File name length */ len = p - fname; } else { /* File name length */ len = p - fname; if (((len == 1 )&&( strncmp(fname, ".", (size_t)1) == 0)) || ((len == TSD_STD_LEN_2 )&&( strncmp(fname, "..", (size_t)TSD_STD_SNC_2) == 0))) { err = E_FNAME; goto err_ret1; } } /* Link of "from" file */ sl = from->link; /* "from" file access attribute check */ err = tkse_chk_fil(&sl, F_WRITE, NULL); if ( err < E_OK ) { goto err_ret1; } /* Link of "from" parent file */ tc_strncpy(spl.fs_name, from->link.fs_name, L_FSNM); spl.f_id = src[from->nlnk - TSD_STD_NLN_2]; /* "from" parent file access attribute check */ err = tkse_chk_fil(&spl, F_WRITE, NULL); if ( err < E_OK ) { goto err_ret1; } /* Link of "to" parent file */ tc_strncpy(dpl.fs_name, to->link.fs_name, L_FSNM); dpl.f_id = dst[to->nlnk - TSD_STD_NLN_2]; /* "to" parent file access attribute check */ err = tkse_chk_fil(&dpl, F_WRITE, NULL); if ( err < E_OK ) { goto err_ret1; } if ( to->c.ino != NOEXS_INO ) { /* Link of "to" file */ dl = to->link; /* "to" open (Exclusive open) */ dfd = tkse_opn_fil(&dl, F_READ|F_EXCL, NULL); if ( dfd < E_OK ) { err = dfd; goto err_ret1; } /* Acquire "to" file information */ err = tkse_ofl_sts(dfd, NULL, &dstat, NULL); if ( err < E_OK ) { goto err_ret2; } /* Error if it is not empty */ if (dstat.f_nlink > 0 ) { err = E_OBJ; goto err_ret2; } /* "to" close */ err = tkse_cls_fil(dfd); if ( err < E_OK ) { goto err_ret1; } } /* "to" parent file open */ dfd = tkse_opn_fil(&dpl, F_UPDATE, NULL); if ( dfd < E_OK ) { err = dfd; goto err_ret1; } /* "from" parent file open */ sfd = tkse_opn_fil(&spl, F_UPDATE, NULL); if ( sfd < E_OK ) { err = sfd; goto err_ret2; } /* "from" link record search */ err = tkse_fnd_lnk(sfd, F_SFILE, &sl, 0, NULL); if ( err < E_OK ) { goto err_ret3; } if ( to->c.ino != NOEXS_INO ) { /* "to" link record search */ err = tkse_fnd_lnk(dfd, F_SFILE, &dl, 0, NULL); if ( err < E_OK ) { goto err_ret3; } /* Insert "from" link record */ err = tkse_ins_rec(dfd, (B*)&sl, sizeof(LINK), 0, 0, 0); if ( err < E_OK ) { goto err_ret3; } /* Delete "from" link record */ err = tkse_del_rec(sfd); if ( err < E_OK ) { goto err_ret3; } /* It is evacuated by a record now in a terminal */ err = tkse_see_rec(dfd, 0, TSD_STD_TSR_M1, NULL); if ( err < E_OK ) { goto err_ret3; } /* "to" deletion */ err = tkse_del_fil(&dpl, &dl, 0); if ( err < E_OK ) { goto err_ret3; } } else { /* Add "to" link record to the termination */ err = tkse_apd_rec(dfd, (B*)&sl, sizeof(LINK), 0, 0, 0); if ( err < E_OK ) { goto err_ret3; } /* It is evacuated by a record now in a terminal */ err = tkse_see_rec(dfd, 0, TSD_STD_TSR_M1, NULL); if ( err < E_OK ) { goto err_ret3; } /* Delete "from" link record */ err = tkse_del_rec(sfd); if ( err < E_OK ) { goto err_ret3; } } /* "from" parent file close */ err = tkse_cls_fil(sfd); if ( err < E_OK ) { goto err_ret2; } /* "to" parent file close */ err = tkse_cls_fil(dfd); if ( err < E_OK ) { goto err_ret1; } /* File name conversion */ err = btConvName_toTC((UB*)fname, len, tcname, L_FNM + 1, TRUE); if ( err < E_OK ) { goto err_ret1; } /* Rename of file */ err = tkse_chg_fnm(&sl, tcname); if ( err < E_OK ) { goto err_ret1; } return E_OK;err_ret3: (void)tkse_cls_fil(sfd);err_ret2: (void)tkse_cls_fil(dfd);err_ret1: DEBUG_PRINT(("sf_rename err=%#x\n", err)); return err;}/* * Deletion of file */EXPORT ER sf_unlink( INODE *_inode ){ SFNODE *inode = (SFNODE*)_inode; UH *path = (UH*)inode->c.exinf; LINK pl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -