Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
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', '-' };254255 int *m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9 };256257 pmode(aflag) /* void pmode(int aflag) */258 {259 register int **mp;260261 flags = aflag;262 for (mp = &m[0]; mp < &m[sizeof(m)/sizeof(m[0])];)263 select(*mp++);264 }265266 select(pairp) /* void select(register int *pairp) */267 register int *pairp;268 {269 register int n;270271 n = *pairp++;272 while (--n>=0 && (flags&*pairp++)==0)273 pairp++;274 putchar(*pairp);275 }Строки 245–275 выдают права доступа к файлу. Код компактен и довольно элегантен, он требует тщательного изучения.
• Строки 245–253: массивы с
m1m9Обратите также внимание, что права доступа обозначены как '
I_READ>>0I_READ>>3I_READ>>6S_IRUSRS_IRGRP• Строка 255: массив
mm1m9• Строки 257–264: функция
pmode()flagsaflagmselect()m1m9• Строки 266–275: функция
select()m1m9nflagsОбратите внимание на использование оператора
++flagsКогда цикл завершается, либо бит разрешения был найден, в этом случае
pairppairppairpПоследним стоящим внимания моментом является то, что на С символьные константы (такие как '
xintchar277 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;284285 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()staticdfiledfileСам код прост, он копирует по одному символу за раз.
makename()readdir()297 readdir(dir) /* void readdir(char *dir) */