Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 85

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

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) */