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

📄 stdfs.c

📁 T-kernel 的extension源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		/* 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 + -