亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? namei.c

?? linux下的源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/** linux/fs/namei.c** (C) 1991 Linus Torvalds*//** Some corrections by tytso.*//** tytso 作了一些糾正。*/#include <linux/sched.h>	// 調(diào)度程序頭文件,定義了任務(wù)結(jié)構(gòu)task_struct、初始任務(wù)0 的數(shù)據(jù),// 還有一些有關(guān)描述符參數(shù)設(shè)置和獲取的嵌入式匯編函數(shù)宏語句。#include <linux/kernel.h>	// 內(nèi)核頭文件。含有一些內(nèi)核常用函數(shù)的原形定義。#include <asm/segment.h>	// 段操作頭文件。定義了有關(guān)段寄存器操作的嵌入式匯編函數(shù)。#include <string.h>		// 字符串頭文件。主要定義了一些有關(guān)字符串操作的嵌入函數(shù)。#include <fcntl.h>		// 文件控制頭文件。用于文件及其描述符的操作控制常數(shù)符號的定義。#include <errno.h>		// 錯誤號頭文件。包含系統(tǒng)中各種出錯號。(Linus 從minix 中引進的)。#include <const.h>		// 常數(shù)符號頭文件。目前僅定義了i 節(jié)點中i_mode 字段的各標志位。#include <sys/stat.h>		// 文件狀態(tài)頭文件。含有文件或文件系統(tǒng)狀態(tài)結(jié)構(gòu)stat{}和常量。// 訪問模式宏。x 是include/fcntl.h 第7 行開始定義的文件訪問標志。// 根據(jù)x 值索引對應(yīng)數(shù)值(數(shù)值表示rwx 權(quán)限: r, w, rw, wxrwxrwx)(數(shù)值是8 進制)。#define ACC_MODE(x) ( "\004\002\006\377"[(x)&O_ACCMODE])/** comment out this line if you want names > NAME_LEN chars to be* truncated. Else they will be disallowed.*//** 如果想讓文件名長度>NAME_LEN 的字符被截掉,就將下面定義注釋掉。*//* #define NO_TRUNCATE */#define MAY_EXEC 1		// 可執(zhí)行(可進入)。#define MAY_WRITE 2		// 可寫。#define MAY_READ 4		// 可讀。/** permission()** is used to check for read/write/execute permissions on a file.* I don't know if we should look at just the euid or both euid and* uid, but that should be easily changed.*//** permission()* 該函數(shù)用于檢測一個文件的讀/寫/執(zhí)行權(quán)限。我不知道是否只需檢查euid,還是* 需要檢查euid 和uid 兩者,不過這很容易修改。*///// 檢測文件訪問許可權(quán)限。// 參數(shù):inode - 文件對應(yīng)的i 節(jié)點;mask - 訪問屬性屏蔽碼。// 返回:訪問許可返回1,否則返回0。static intpermission (struct m_inode *inode, int mask){  int mode = inode->i_mode;	// 文件訪問屬性/* special case: not even root can read/write a deleted file *//* 特殊情況:即使是超級用戶(root)也不能讀/寫一個已被刪除的文件 */// 如果i 節(jié)點有對應(yīng)的設(shè)備,但該i 節(jié)點的連接數(shù)等于0,則返回。  if (inode->i_dev && !inode->i_nlinks)    return 0;// 否則,如果進程的有效用戶id(euid)與i 節(jié)點的用戶id 相同,則取文件宿主的用戶訪問權(quán)限。  else if (current->euid == inode->i_uid)    mode >>= 6;// 否則,如果進程的有效組id(egid)與i 節(jié)點的組id 相同,則取組用戶的訪問權(quán)限。  else if (current->egid == inode->i_gid)    mode >>= 3;// 如果上面所取的的訪問權(quán)限與屏蔽碼相同,或者是超級用戶,則返回1,否則返回0。  if (((mode & mask & 0007) == mask) || suser ())    return 1;  return 0;}/** ok, we cannot use strncmp, as the name is not in our data space.* Thus we'll have to use match. No big problem. Match also makes* some sanity tests.** NOTE! unlike strncmp, match returns 1 for success, 0 for failure.*//** ok,我們不能使用strncmp 字符串比較函數(shù),因為名稱不在我們的數(shù)據(jù)空間(不在內(nèi)核空間)。* 因而我們只能使用match()。問題不大。match()同樣也處理一些完整的測試。** 注意!與strncmp 不同的是match()成功時返回1,失敗時返回0。*///// 指定長度字符串比較函數(shù)。// 參數(shù):len - 比較的字符串長度;name - 文件名指針;de - 目錄項結(jié)構(gòu)。// 返回:相同返回1,不同返回0。static intmatch (int len, const char *name, struct dir_entry *de){  register int same __asm__ ("ax");// 如果目錄項指針空,或者目錄項i 節(jié)點等于0,或者要比較的字符串長度超過文件名長度,則返回0。  if (!de || !de->inode || len > NAME_LEN)    return 0;// 如果要比較的長度len 小于NAME_LEN,但是目錄項中文件名長度超過len,則返回0。  if (len < NAME_LEN && de->name[len])    return 0;// 下面嵌入?yún)R編語句,在用戶數(shù)據(jù)空間(fs)執(zhí)行字符串的比較操作。// %0 - eax(比較結(jié)果same);%1 - eax(eax 初值0);%2 - esi(名字指針);%3 - edi(目錄項名指針);// %4 - ecx(比較的字節(jié)長度值len)。  __asm__ ("cld\n\t"		// 清方向位。	   "fs ; repe ; cmpsb\n\t"	// 用戶空間執(zhí)行循環(huán)比較[esi++]和[edi++]操作,	   "setz %%al"		// 若比較結(jié)果一樣(z=0)則設(shè)置al=1(same=eax)。: "=a" (same): "" (0), "S" ((long) name), "D" ((long) de->name), "c" (len):"cx", "di",	   "si");  return same;			// 返回比較結(jié)果。}/** find_entry()** finds an entry in the specified directory with the wanted name. It* returns the cache buffer in which the entry was found, and the entry* itself (as a parameter - res_dir). It does NOT read the inode of the* entry - you'll have to do that yourself if you want to.** This also takes care of the few special cases due to '..'-traversal* over a pseudo-root and a mount point.*//** find_entry()* 在指定的目錄中尋找一個與名字匹配的目錄項。返回一個含有找到目錄項的高速* 緩沖區(qū)以及目錄項本身(作為一個參數(shù) - res_dir)。并不讀目錄項的i 節(jié)點 - 如* 果需要的話需自己操作。** '..'目錄項,操作期間也會對幾種特殊情況分別處理 - 比如橫越一個偽根目錄以* 及安裝點。*///// 查找指定目錄和文件名的目錄項。// 參數(shù):dir - 指定目錄i 節(jié)點的指針;name - 文件名;namelen - 文件名長度;// 返回:高速緩沖區(qū)指針;res_dir - 返回的目錄項結(jié)構(gòu)指針;static struct buffer_head *find_entry (struct m_inode **dir,	    const char *name, int namelen, struct dir_entry **res_dir){  int entries;  int block, i;  struct buffer_head *bh;  struct dir_entry *de;  struct super_block *sb;// 如果定義了NO_TRUNCATE,則若文件名長度超過最大長度NAME_LEN,則返回。#ifdef NO_TRUNCATE  if (namelen > NAME_LEN)    return NULL;//如果沒有定義NO_TRUNCATE,則若文件名長度超過最大長度NAME_LEN,則截短之。#else  if (namelen > NAME_LEN)    namelen = NAME_LEN;#endif// 計算本目錄中目錄項項數(shù)entries。置空返回目錄項結(jié)構(gòu)指針。  entries = (*dir)->i_size / (sizeof (struct dir_entry));  *res_dir = NULL;// 如果文件名長度等于0,則返回NULL,退出。  if (!namelen)    return NULL;/* check for '..', as we might have to do some "magic" for it *//* 檢查目錄項'..',因為可能需要對其特別處理 */  if (namelen == 2 && get_fs_byte (name) == '.'      && get_fs_byte (name + 1) == '.')    {/* '..' in a pseudo-root results in a faked '.' (just change namelen) *//* 偽根中的'..'如同一個假'.'(只需改變名字長度) */// 如果當前進程的根節(jié)點指針即是指定的目錄,則將文件名修改為'.',      if ((*dir) == current->root)	namelen = 1;// 否則如果該目錄的i 節(jié)點號等于ROOT_INO(1)的話,說明是文件系統(tǒng)根節(jié)點。則取文件系統(tǒng)的超級塊。      else if ((*dir)->i_num == ROOT_INO)	{/* '..' over a mount-point results in 'dir' being exchanged for the mounteddirectory-inode. NOTE! We set mounted, so that we can iput the new dir *//* 在一個安裝點上的'..'將導致目錄交換到安裝到文件系統(tǒng)的目錄i 節(jié)點。注意!由于設(shè)置了mounted 標志,因而我們能夠取出該新目錄 */	  sb = get_super ((*dir)->i_dev);// 如果被安裝到的i 節(jié)點存在,則先釋放原i 節(jié)點,然后對被安裝到的i 節(jié)點進行處理。// 讓*dir 指向該被安裝到的i 節(jié)點;該i 節(jié)點的引用數(shù)加1。	  if (sb->s_imount)	    {	      iput (*dir);	      (*dir) = sb->s_imount;	      (*dir)->i_count++;	    }	}    }// 如果該i 節(jié)點所指向的第一個直接磁盤塊號為0,則返回NULL,退出。  if (!(block = (*dir)->i_zone[0]))    return NULL;// 從節(jié)點所在設(shè)備讀取指定的目錄項數(shù)據(jù)塊,如果不成功,則返回NULL,退出。  if (!(bh = bread ((*dir)->i_dev, block)))    return NULL;// 在目錄項數(shù)據(jù)塊中搜索匹配指定文件名的目錄項,首先讓de 指向數(shù)據(jù)塊,并在不超過目錄中目錄項數(shù)// 的條件下,循環(huán)執(zhí)行搜索。  i = 0;  de = (struct dir_entry *) bh->b_data;  while (i < entries)    {// 如果當前目錄項數(shù)據(jù)塊已經(jīng)搜索完,還沒有找到匹配的目錄項,則釋放當前目錄項數(shù)據(jù)塊。      if ((char *) de >= BLOCK_SIZE + bh->b_data)	{	  brelse (bh);	  bh = NULL;// 在讀入下一目錄項數(shù)據(jù)塊。若這塊為空,則只要還沒有搜索完目錄中的所有目錄項,就跳過該塊,// 繼續(xù)讀下一目錄項數(shù)據(jù)塊。若該塊不空,就讓de 指向該目錄項數(shù)據(jù)塊,繼續(xù)搜索。	  if (!(block = bmap (*dir, i / DIR_ENTRIES_PER_BLOCK)) ||	      !(bh = bread ((*dir)->i_dev, block)))	    {	      i += DIR_ENTRIES_PER_BLOCK;	      continue;	    }	  de = (struct dir_entry *) bh->b_data;	}// 如果找到匹配的目錄項的話,則返回該目錄項結(jié)構(gòu)指針和該目錄項數(shù)據(jù)塊指針,退出。      if (match (namelen, name, de))	{	  *res_dir = de;	  return bh;	}// 否則繼續(xù)在目錄項數(shù)據(jù)塊中比較下一個目錄項。      de++;      i++;    }// 若指定目錄中的所有目錄項都搜索完還沒有找到相應(yīng)的目錄項,則釋放目錄項數(shù)據(jù)塊,返回NULL。  brelse (bh);  return NULL;}/** add_entry()** adds a file entry to the specified directory, using the same* semantics as find_entry(). It returns NULL if it failed.** NOTE!! The inode part of 'de' is left at 0 - which means you* may not sleep between calling this and putting something into* the entry, as someone else might have used it while you slept.*//** add_entry()* 使用與find_entry()同樣的方法,往指定目錄中添加一文件目錄項。* 如果失敗則返回NULL。** 注意??!'de'(指定目錄項結(jié)構(gòu)指針)的i 節(jié)點部分被設(shè)置為0 - 這表示* 在調(diào)用該函數(shù)和往目錄項中添加信息之間不能睡眠,因為若睡眠那么其它* 人(進程)可能會已經(jīng)使用了該目錄項。*///// 根據(jù)指定的目錄和文件名添加目錄項。// 參數(shù):dir - 指定目錄的i 節(jié)點;name - 文件名;namelen - 文件名長度;// 返回:高速緩沖區(qū)指針;res_dir - 返回的目錄項結(jié)構(gòu)指針;static struct buffer_head *add_entry (struct m_inode *dir,	   const char *name, int namelen, struct dir_entry **res_dir){  int block, i;  struct buffer_head *bh;  struct dir_entry *de;  *res_dir = NULL;// 如果定義了NO_TRUNCATE,則若文件名長度超過最大長度NAME_LEN,則返回。#ifdef NO_TRUNCATE  if (namelen > NAME_LEN)    return NULL;//如果沒有定義NO_TRUNCATE,則若文件名長度超過最大長度NAME_LEN,則截短之。#else  if (namelen > NAME_LEN)    namelen = NAME_LEN;#endif// 如果文件名長度等于0,則返回NULL,退出。  if (!namelen)    return NULL;// 如果該目錄i 節(jié)點所指向的第一個直接磁盤塊號為0,則返回NULL 退出。  if (!(block = dir->i_zone[0]))    return NULL;// 如果讀取該磁盤塊失敗,則返回NULL 并退出。  if (!(bh = bread (dir->i_dev, block)))    return NULL;// 在目錄項數(shù)據(jù)塊中循環(huán)查找最后未使用的目錄項。首先讓目錄項結(jié)構(gòu)指針de 指向高速緩沖的數(shù)據(jù)塊// 開始處,也即第一個目錄項。  i = 0;  de = (struct dir_entry *) bh->b_data;  while (1)    {// 如果當前判別的目錄項已經(jīng)超出當前數(shù)據(jù)塊,則釋放該數(shù)據(jù)塊,重新申請一塊磁盤塊block。如果// 申請失敗,則返回NULL,退出。      if ((char *) de >= BLOCK_SIZE + bh->b_data)	{	  brelse (bh);	  bh = NULL;	  block = create_block (dir, i / DIR_ENTRIES_PER_BLOCK);	  if (!block)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕av一区二区三区免费看| 欧美一区二区三区性视频| 午夜在线电影亚洲一区| 久久久久久久久久电影| 欧美午夜精品一区| 成人小视频在线观看| 日精品一区二区三区| 亚洲三级免费电影| 久久美女艺术照精彩视频福利播放| 欧美日韩精品高清| 99九九99九九九视频精品| 经典三级一区二区| 免费在线观看视频一区| 一级特黄大欧美久久久| 国产精品对白交换视频| 国产午夜精品福利| 久久综合丝袜日本网| 欧美美女一区二区三区| 在线观看中文字幕不卡| 91免费看片在线观看| 国产99久久久久久免费看农村| 久久精品久久久精品美女| 午夜久久久久久久久| 亚洲午夜在线视频| 亚洲乱码中文字幕| 亚洲三级电影网站| 自拍偷拍亚洲欧美日韩| 国产精品传媒在线| 国产精品成人免费| 久久精品水蜜桃av综合天堂| 欧美大片日本大片免费观看| 欧美一卡2卡三卡4卡5免费| 欧美日韩精品欧美日韩精品| 欧美日韩国产中文| 欧美美女bb生活片| 欧美色中文字幕| 成人丝袜高跟foot| 国产尤物一区二区| 国产一区二区三区久久悠悠色av| 青青草成人在线观看| 久久黄色级2电影| 美女高潮久久久| 久久av资源网| 国产精品1区2区3区| 国产suv一区二区三区88区| 国产一区二区女| 国产夫妻精品视频| 国产69精品久久99不卡| 成人黄色在线网站| 大白屁股一区二区视频| 国产精品自在在线| 国产不卡在线播放| 91亚洲精华国产精华精华液| 色先锋久久av资源部| 精品视频免费在线| 欧美va亚洲va国产综合| 久久众筹精品私拍模特| 中文字幕制服丝袜成人av | 成人精品小蝌蚪| 成人av电影在线网| 欧美色图天堂网| 欧美一区二区福利视频| 亚洲成人av一区二区| 日韩不卡一区二区| 国产精品2024| 欧美伊人精品成人久久综合97| 4hu四虎永久在线影院成人| 久久老女人爱爱| 亚洲手机成人高清视频| 丝袜美腿亚洲综合| 国产精品123区| 在线观看三级视频欧美| 欧美tickling挠脚心丨vk| 国产精品久久久久久久久动漫| 亚洲三级久久久| 捆绑紧缚一区二区三区视频| 99久久精品免费看国产免费软件| 欧美日韩国产在线观看| 国产蜜臀av在线一区二区三区| 一区二区三区在线免费观看| 天天综合天天综合色| 国产成人亚洲综合色影视| 色诱视频网站一区| 欧美日韩国产系列| 日本一区二区视频在线| 亚洲电影第三页| 成人免费看的视频| 在线影院国内精品| 精品日韩99亚洲| 亚洲一区影音先锋| 国产aⅴ综合色| 日韩欧美在线1卡| 一区二区三区电影在线播| 狠狠色丁香九九婷婷综合五月| 91麻豆蜜桃一区二区三区| 精品国产一二三| 亚洲成人免费电影| 99久久婷婷国产综合精品电影| 日韩欧美中文一区二区| 亚洲国产日韩一区二区| 国产成a人亚洲精| 精品国产一区二区在线观看| 亚洲18女电影在线观看| 91蜜桃婷婷狠狠久久综合9色| 精品国产一区二区三区av性色| 亚洲mv在线观看| 色综合天天综合网国产成人综合天| 精品国产精品网麻豆系列| 午夜久久久久久| 在线影视一区二区三区| 自拍偷自拍亚洲精品播放| 91免费视频网址| 久久久亚洲国产美女国产盗摄 | 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 亚洲精品综合在线| 成人免费视频播放| 精品88久久久久88久久久| 亚洲国产一区二区a毛片| 一本一本久久a久久精品综合麻豆| 久久亚洲综合色一区二区三区| 一区二区三区在线视频观看| 成人一级视频在线观看| 久久久精品国产免费观看同学| 久久精品国产亚洲a| 欧美伦理电影网| 偷拍日韩校园综合在线| 欧美日韩激情一区二区三区| 亚洲综合色视频| 欧美色精品天天在线观看视频| 亚洲乱码国产乱码精品精98午夜 | 国产在线精品一区在线观看麻豆| 91麻豆精品国产91久久久久久| 香蕉成人啪国产精品视频综合网| 91成人免费在线| 国产精品视频一二三区| 免费成人小视频| 欧美一级片免费看| 激情久久五月天| 国产日韩高清在线| 精品在线你懂的| 国产日韩亚洲欧美综合| 成人免费观看男女羞羞视频| 中文字幕亚洲电影| 色屁屁一区二区| 亚洲精品欧美综合四区| 欧美少妇一区二区| 亚洲最新视频在线播放| 春色校园综合激情亚洲| 日韩毛片视频在线看| 欧美中文字幕一区二区三区 | 欧美日本一区二区在线观看| 成人免费在线播放视频| 色噜噜狠狠成人中文综合| 亚洲高清一区二区三区| 日韩免费性生活视频播放| 国产一区二区91| 亚洲欧洲成人av每日更新| 捆绑紧缚一区二区三区视频| 国产日韩欧美一区二区三区综合| 不卡av免费在线观看| 亚洲成人三级小说| 久久综合视频网| 99久久伊人网影院| 1024精品合集| 色哟哟一区二区三区| 国产农村妇女精品| 欧美三级日韩在线| 国产在线精品视频| 亚洲精品一二三区| 欧美大片在线观看一区二区| 99久久99久久精品国产片果冻| 偷偷要91色婷婷| 国产精品另类一区| 欧美高清视频www夜色资源网| 国产精一品亚洲二区在线视频| 专区另类欧美日韩| 精品国产乱码久久久久久免费| 91视频国产资源| 久久99国产精品久久99| 亚洲宅男天堂在线观看无病毒| 日韩欧美一区二区三区在线| 国产激情一区二区三区| 亚洲成人在线免费| 国产精品系列在线| 欧美一级日韩不卡播放免费| 99久久免费视频.com| 久久国产综合精品| 亚洲一二三四久久| 国产欧美精品一区二区三区四区| 欧美日韩一区视频| 国产91对白在线观看九色| 琪琪久久久久日韩精品| 亚洲欧美日韩国产手机在线 | 成人高清av在线| 日韩精品每日更新| 一区二区三区欧美在线观看| 久久女同性恋中文字幕| 欧美人妇做爰xxxⅹ性高电影| www.66久久| 国产精品白丝jk白祙喷水网站|