245 int m1[] = { 1, S_IREAD>>0, 'r', '-' };
246 int m2[] = { 1, S_IWRITE>>0, 'w', '-' };
247 int m3[] = { 2, S_ISUID, 's', S_IEXEC>>0, 'x', '-' };
248 int m4[] = { 1, S_IREAD>>3, 'r', '-' };
249 int m5[] = { 1, S_IWRITE>>3, 'w', '-' };
250 int m6[] = { 2, S_ISGID, 's', S_IEXEC>>3, 'x', '-' };
251 int m7[] = { 1, S_IREAD>>6, 'r', '-' };
252 int m8[] = { 1, S_IWRITE>>6, 'w', '-' };
253 int m9[] = { 2, S_ISVTX, ' t', S_IEXEC>>6, 'x', '-' };
254
255 int *m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9 };
256
257 pmode(aflag) /* void pmode(int aflag) */
258 {
259Β register int **mp;
260
261Β flags = aflag;
262Β for (mp = &m[0]; mp < &m[sizeof(m)/sizeof(m[0])];)
263Β Β select(*mp++);
264 }
265
266 select(pairp) /* void select(register int *pairp) */
267 register int *pairp;
268 {
269Β register int n;
270
271Β n = *pairp++;
272Β while (--n>=0 && (flags&*pairp++)==0)
273Β Β pairp++;
274Β putchar(*pairp);
275 }
Π‘ΡΡΠΎΠΊΠΈ 245β275 Π²ΡΠ΄Π°ΡΡ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ°ΠΉΠ»Ρ. ΠΠΎΠ΄ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ΅Π½ ΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ»Π΅Π³Π°Π½ΡΠ΅Π½, ΠΎΠ½ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ.
β’Β Π‘ΡΡΠΎΠΊΠΈ 245β253: ΠΌΠ°ΡΡΠΈΠ²Ρ Ρ
m1
ΠΏΠΎ
m9
ΠΊΠΎΠ΄ΠΈΡΡΡΡ Π±ΠΈΡΡ ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ° Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ Π±ΡΠΊΠ²Π°ΠΌΠΈ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π°. ΠΠ° ΠΊΠ°ΠΆΠ΄ΡΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌΡΡ Π±ΡΠΊΠ²Ρ ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠ°ΠΉΠ»Π° ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠ°ΡΡΠΈΠ². ΠΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΠ»ΠΎΠΌ ΠΏΠ°Ρ (ΠΏΡΠ°Π²ΠΎ Π΄ΠΎΡΡΡΠΏΠ°, Π±ΡΠΊΠ²Π°), Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΡΠΊΠ²ΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΡΠ²Π΅Π΄Π΅Π½Π° Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π±ΠΈΡΠΎΠ² ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ°.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠ°Π²Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½Ρ ΠΊΠ°ΠΊ '
I_READ>>0
', '
I_READ>>3
', '
I_READ>>6
' ΠΈ Ρ.Π΄. ΠΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΡΠ° (
S_IRUSR
,
S_IRGRP
ΠΈ Ρ.ΠΏ.) Π½Π΅ Π±ΡΠ»ΠΈ Π΅ΡΠ΅ ΠΏΡΠΈΠ΄ΡΠΌΠ°Π½Ρ. (Π‘ΠΌ. ΡΠ°Π±Π». 4.5 Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 4 6.1 Β«Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π°ΡΠ°Π»ΡΠ½ΡΡ
ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ°ΠΉΠ»ΡΒ».)
β’Β Π‘ΡΡΠΎΠΊΠ° 255: ΠΌΠ°ΡΡΠΈΠ²
m
ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Ρ
m1
ΠΏΠΎ
m9
.
β’Β Π‘ΡΡΠΎΠΊΠΈ 257β264: ΡΡΠ½ΠΊΡΠΈΡ
pmode()
ΡΠ½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
flags
ΡΠ°Π²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠΌΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
aflag
. ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½Π° ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π² ΡΠΈΠΊΠ»Π΅ ΠΌΠ°ΡΡΠΈΠ²
m
, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ
select()
. ΠΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Ρ
m1
ΠΏΠΎ
m9
.
β’Β Π‘ΡΡΠΎΠΊΠΈ 266β275: ΡΡΠ½ΠΊΡΠΈΡ
select()
ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² Ρ
m1
ΠΏΠΎ
m9
.
n
ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΠ»ΠΎΠΌ ΠΏΠ°Ρ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ (ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ); Π΅Π³ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΡΡΠΎΠΊΠ° 271. Π‘ΡΡΠΎΠΊΠΈ 272β273 ΠΈΡΡΡ Π±ΠΈΡΡ ΠΏΡΠ°Π² Π΄ΠΎΡΡΡΠΏΠ°, ΠΏΡΠΎΠ²Π΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΡΠ°Π½Π΅Π΅ Π² ΡΡΡΠΎΠΊΠ΅ 261 Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
flags
.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°
++
ΠΊΠ°ΠΊ Π² ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΡΠΈΠΊΠ»Π°, ΡΠ°ΠΊ ΠΈ Π² ΡΠ΅Π»Π΅ ΡΠΈΠΊΠ»Π°. Π Π΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΏΡΡΠΊ ΠΏΠ°ΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅, Π΅ΡΠ»ΠΈ Π²
flags
Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ Π±ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅ ΠΏΠ°ΡΡ.
ΠΠΎΠ³Π΄Π° ΡΠΈΠΊΠ» Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π»ΠΈΠ±ΠΎ Π±ΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π±ΡΠ» Π½Π°ΠΉΠ΄Π΅Π½, Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
pairp
ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π²ΡΠΎΡΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΠ°ΡΡ, ΡΠ²Π»ΡΡΡΠΈΠΉΡΡ Π½ΡΠΆΠ½ΡΠΌ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ, Π»ΠΈΠ±ΠΎ ΠΎΠ½ Π½Π΅ Π±ΡΠ» Π½Π°ΠΉΠ΄Π΅Π½, Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
pairp
ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΡΠΎΠΊΠ° 274 Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ», Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ
pairp
.
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΡΡΠΎΡΡΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ Π½Π° Π‘ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ (ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ '
x
') ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΏ
int
, Π° Π½Π΅
char
[75]. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠΈΡ
ΠΊΠΎΠ½ΡΡΠ°Π½Ρ Π² ΠΌΠ°ΡΡΠΈΠ² ΡΠ΅Π»ΡΡ
Π½Π΅Ρ; Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ.
277 char* /* char *makename(char *dir, char *file) */
278 makename(dir, file)
279 char *dir, *file;
280 {
281Β static char dfile[100];
282Β register char *dp, *fp;
283Β register int i;
284
285Β dp = dfile;
286Β fp = dir;
287Β while (*fp)
288Β Β *dp++ = *fp++;
289Β *dp++ = '/';
290Β fp = file;
291Β for (i=0; i<DIRSIZ; i++)
292Β Β *dp++ = * fp++;
293Β *dp = 0;
294Β return(dfile);
295 }
Π‘ΡΡΠΎΠΊΠΈ 277β295 ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ
makename()
. ΠΠ΅ ΡΠ°Π±ΠΎΡΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠ°ΠΉΠ»Π°, ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΊΠΎΡΠΎΠΉ ΡΠ΅ΡΡΡ, Ρ ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ. ΠΠ½Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΡΠΎ Π²
static
Π±ΡΡΠ΅ΡΠ΅
dfile
. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ
dfile
Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ 100 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΈ ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ.
Π‘Π°ΠΌ ΠΊΠΎΠ΄ ΠΏΡΠΎΡΡ, ΠΎΠ½ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π·Π° ΡΠ°Π·.
makename()
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ
readdir()
.
297 readdir(dir) /* void readdir(char *dir) */