<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dipplum.com &#187; fat</title>
	<atom:link href="http://dipplum.com/tag/fat/feed/" rel="self" type="application/rss+xml" />
	<link>http://dipplum.com</link>
	<description>Be  the change you wanna see in the world</description>
	<lastBuildDate>Sat, 12 Nov 2011 07:38:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Linux 下读写 FAT 属性信息</title>
		<link>http://dipplum.com/2009/03/22/linux-fat-attributes/</link>
		<comments>http://dipplum.com/2009/03/22/linux-fat-attributes/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 17:09:41 +0000</pubDate>
		<dc:creator>li</dc:creator>
				<category><![CDATA[开源软件]]></category>
		<category><![CDATA[fat]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://dipplum.com/2009/03/22/linux-fat-attributes/</guid>
		<description><![CDATA[FAT 是 Windows 下的文件系统格式。每个 FAT 下的文件都包含 ARHIVE，SYSTEM，HIDDEN，READ-ONLY 等属性。而 Linux 下面缺乏读写 FAT 属性信息的命令，难以读出，或者设置这些 FAT 属性。 而实际上 Linux 内核的 vfat 模块包含相应的 ioctl 命令，可以修改文件的属性。在 &#60;linux/msdos_fs.h&#62; 定义如下： #define FAT_IOCTL_GET_ATTRIBUTES _IOR('r', 0x10, __u32) #define FAT_IOCTL_SET_ATTRIBUTES _IOW('r', 0x11, __u32) 上述两个 ioctl 命令接受一个 int 类型，该 int 值的不同 bit 位，按照下面的定义表示不同的文件属性： #define ATTR_RO 1 /* read-only */ #define ATTR_HIDDEN 2 /* hidden */ #define [...]]]></description>
			<content:encoded><![CDATA[<p>FAT 是 Windows 下的文件系统格式。每个 FAT 下的文件都包含 ARHIVE，SYSTEM，HIDDEN，READ-ONLY 等属性。而 Linux 下面缺乏读写 FAT 属性信息的命令，难以读出，或者设置这些 FAT 属性。</p>
<p>而实际上 Linux 内核的 vfat 模块包含相应的 ioctl 命令，可以修改文件的属性。在 &lt;linux/msdos_fs.h&gt; 定义如下：</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define FAT_IOCTL_GET_ATTRIBUTES	_IOR('r', 0x10, __u32)</span>
<span style="color: #339933;">#define FAT_IOCTL_SET_ATTRIBUTES	_IOW('r', 0x11, __u32)</span></pre></div></div>

<p>上述两个 ioctl 命令接受一个 int 类型，该 int 值的不同 bit 位，按照下面的定义表示不同的文件属性：</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define ATTR_RO		1	/* read-only */</span>
<span style="color: #339933;">#define ATTR_HIDDEN	2	/* hidden */</span>
<span style="color: #339933;">#define ATTR_SYS	4	/* system */</span>
<span style="color: #339933;">#define ATTR_VOLUME	8	/* volume label */</span>
<span style="color: #339933;">#define ATTR_DIR	16	/* directory */</span>
<span style="color: #339933;">#define ATTR_ARCH	32	/* archived */</span></pre></div></div>

<p>由于没有发现有命令可以利用上述 ioctl 接口，操作 FAT 文件的属性，我自己写了一个 attrib.py 文件，代码在最后。该命令接收两个参数，说明如下</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Usage: .<span style="color: #000000; font-weight: bold;">/</span>attrib.py dir_or_file dump<span style="color: #000000; font-weight: bold;">|</span>load</pre></div></div>

<p>下面的命令将 /mnt/fat 目录下所有子目录和文件的属性输出到文件 attributes.dump 文件中</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>attrib.py <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span>fat dump <span style="color: #000000; font-weight: bold;">&gt;</span> attributes.dump</pre></div></div>

<p>./attrib.py dump 输出的部分内容如下：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">A..SHR     .<span style="color: #000000; font-weight: bold;">/</span>ntldr
A..SHR     .<span style="color: #000000; font-weight: bold;">/</span>NTDETECT.COM
A..SHR     .<span style="color: #000000; font-weight: bold;">/</span>boot.ini
A..SHR     .<span style="color: #000000; font-weight: bold;">/</span>IO.SYS
A..SHR     .<span style="color: #000000; font-weight: bold;">/</span>MSDOS.SYS
.D..H.     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>inf
.D.S.R     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>Fonts
.D.SH.     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>Installer
.D.S..     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>Tasks
.D.S..     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>Downloaded Program Files
...SH.     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>winnt.bmp
...SH.     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>winnt256.bmp
A...HR     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>WindowsShell.Manifest
A..S..     .<span style="color: #000000; font-weight: bold;">/</span>WINDOWS<span style="color: #000000; font-weight: bold;">/</span>bootstat.dat</pre></div></div>

<p>下面的命令将根据 attributes.dump 文件中包含的属性信息，给 /mnt/fat 目录下所有子目录和文件设置相应的属性</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>attrib.py <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span>fat load <span style="color: #000000; font-weight: bold;">&lt;</span> attributes.dump</pre></div></div>

<p>下面是 attrib.py 的源码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">fcntl</span>
<span style="color: #ff7700;font-weight:bold;">import</span> posixpath
&nbsp;
ATTR_ARCH = 0x20
ATTR_DIR = 0x10
ATTR_VOLUME = 0x08
ATTR_SYSTEM = 0x04
ATTR_HIDDEN = 0x02
ATTR_RO = 0x01
&nbsp;
AttrBitName = <span style="color: black;">&#123;</span>
    ATTR_ARCH: <span style="color: #483d8b;">'A'</span>,
    ATTR_DIR: <span style="color: #483d8b;">'D'</span>,
    ATTR_VOLUME: <span style="color: #483d8b;">'V'</span>,
    ATTR_SYSTEM: <span style="color: #483d8b;">'S'</span>,
    ATTR_HIDDEN: <span style="color: #483d8b;">'H'</span>,
    ATTR_RO: <span style="color: #483d8b;">'R'</span>,
<span style="color: black;">&#125;</span>
&nbsp;
AttrBits = AttrBitName.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
AttrBits.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
AttrBits.<span style="color: black;">reverse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
FAT_GETATTR_IOCTL = 0x80047210
FAT_SETATTR_IOCTL = 0x40047211
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> fat_getattr<span style="color: black;">&#40;</span>filename<span style="color: black;">&#41;</span>:
  fd = <span style="color: #dc143c;">os</span>.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>filename, <span style="color: #dc143c;">os</span>.<span style="color: black;">O_RDONLY</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    word = <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">ioctl</span><span style="color: black;">&#40;</span>fd, FAT_GETATTR_IOCTL, <span style="color: #483d8b;">'    '</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #dc143c;">os</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span>fd<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">raise</span>
  <span style="color: #dc143c;">os</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span>fd<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>word<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> fat_setattr<span style="color: black;">&#40;</span>filename, attr<span style="color: black;">&#41;</span>:
  fd = <span style="color: #dc143c;">os</span>.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span>filename, <span style="color: #dc143c;">os</span>.<span style="color: black;">O_RDONLY</span><span style="color: black;">&#41;</span>
  word = <span style="color: #483d8b;">'%s<span style="color: #000099; font-weight: bold;">\0</span><span style="color: #000099; font-weight: bold;">\0</span><span style="color: #000099; font-weight: bold;">\0</span>'</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>attr<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    <span style="color: #dc143c;">fcntl</span>.<span style="color: black;">ioctl</span><span style="color: black;">&#40;</span>fd, FAT_SETATTR_IOCTL, word<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    <span style="color: #dc143c;">os</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span>fd<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">raise</span>
  <span style="color: #dc143c;">os</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span>fd<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> fat_attrstr<span style="color: black;">&#40;</span>attr<span style="color: black;">&#41;</span>:
  bit_to_name = <span style="color: #ff7700;font-weight:bold;">lambda</span> bit: bit <span style="color: #66cc66;">&amp;</span>amp<span style="color: #66cc66;">;</span> attr <span style="color: #ff7700;font-weight:bold;">and</span> AttrBitName<span style="color: black;">&#91;</span>bit<span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #483d8b;">'.'</span>
  <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">map</span><span style="color: black;">&#40;</span>bit_to_name, AttrBits<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> fat_strattr<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span>:
  str_to_bin = <span style="color: #ff7700;font-weight:bold;">lambda</span> x: x<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == x<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #483d8b;">'1'</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #483d8b;">'0'</span>
  bin = <span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">map</span><span style="color: black;">&#40;</span>str_to_bin, <span style="color: #008000;">zip</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ADVSHR'</span>, <span style="color: #008000;">str</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>bin, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> fat_dumpattr<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">for</span> cur, dirs, files <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">walk</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'.'</span><span style="color: black;">&#41;</span>:
    items = dirs + files
    <span style="color: #ff7700;font-weight:bold;">for</span> item <span style="color: #ff7700;font-weight:bold;">in</span> items:
      <span style="color: #ff7700;font-weight:bold;">try</span>:
        filename = <span style="color: #483d8b;">'%s/%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>cur, item<span style="color: black;">&#41;</span>
        attr = fat_getattr<span style="color: black;">&#40;</span>filename<span style="color: black;">&#41;</span>
        <span style="color: #008000;">str</span> = fat_attrstr<span style="color: black;">&#40;</span>attr<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'%s     %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">str</span>, filename<span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>, e:
        <span style="color: #ff7700;font-weight:bold;">print</span> e
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> fat_loadattr<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">stdin</span>.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #008000;">str</span> = line<span style="color: black;">&#91;</span>:<span style="color: #ff4500;">6</span><span style="color: black;">&#93;</span>
    <span style="color: #008000;">file</span> = line<span style="color: black;">&#91;</span><span style="color: #ff4500;">6</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> posixpath.<span style="color: black;">exists</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#41;</span>:
      newattr = fat_strattr<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#41;</span>
      oldattr = fat_getattr<span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">if</span> newattr == oldattr:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'ignore same attribute %s[0x%02x]: %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">str</span>, newattr, <span style="color: #008000;">file</span><span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">else</span>:
        oldstr = fat_attrstr<span style="color: black;">&#40;</span>oldattr<span style="color: black;">&#41;</span>
        fat_setattr<span style="color: black;">&#40;</span><span style="color: #008000;">file</span>, newattr<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'-%s[0x%02X] +%s[0x%02X] %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>oldstr, oldattr, <span style="color: #008000;">str</span>, newattr, <span style="color: #008000;">file</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'ignore not existing file: %s'</span> <span style="color: #66cc66;">%</span> <span style="color: #008000;">file</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> usage<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Usage: %s dir_or_file dump|load'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
  exit<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">3</span>:
  usage<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
target_dir = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
old_dir = <span style="color: #dc143c;">os</span>.<span style="color: black;">getcwd</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">try</span>:
  <span style="color: #dc143c;">os</span>.<span style="color: black;">chdir</span><span style="color: black;">&#40;</span>target_dir<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Bad directory: %s'</span> <span style="color: #66cc66;">%</span> target_dir
  usage<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
op = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">if</span> op == <span style="color: #483d8b;">'dump'</span>:
  fat_dumpattr<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">elif</span> op == <span style="color: #483d8b;">'load'</span>:
  fat_loadattr<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Bad option: %s'</span> <span style="color: #66cc66;">%</span> op
  usage<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #dc143c;">os</span>.<span style="color: black;">chdir</span><span style="color: black;">&#40;</span>old_dir<span style="color: black;">&#41;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://dipplum.com/2009/03/22/linux-fat-attributes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

