Linux программирование в примерах
Шрифт:
167 register t;
168 register struct lbuf *p;
169 register char *cp;
170
171 p = ap;
172 if (p->lnum == -1)
173 return;
174 if (iflg)
175 printf("%5u ", p->lnum); /* Номер индекса */
176 if (sflg)
177 printf("%4D nblock(p->lsize)); /* Размер в блоках */
Процедура
pentry
lnum
, и если так, функция возвращается. Когда верно 'p->lnum == -1
', структура struct lbuf
недействительна. В противном случае это поле содержит номер индекса файла. Строки 174–175 выводят номер индекса, если действует
– i
. Строки 176–177 выводят общее число блоков, если действует – s
. (Как мы увидим ниже, это число может быть неточным.) 178 if (lflg) { /* Расширенный листинг: */
179 putchar(p->ltype); /* - Тип файла */
180 pmode(p->lflags); /* - Права доступа */
181 printf("%2d ", p->lnl); /* - Число ссылок */
182 t = p->luid;
183 if (gflg)
184 t = p->lgid;
185 if (getname(t, tbuf)==0)
186 printf("%-6.6s", tbuf); /* - Владелец или группа */
187 else
188 printf("%-6d", t);
189 if (p->ltype=='b' || p->ltype=='c') /* - Устройство: старший и младший номера */
190 printf("%3d,%3d", major((int)p->lsize), minor((int)p->lsize));
191 else
192 printf("%71d", p->lsize); /* - Размер в байтах */
193 cp = ctime(&p->lmtime);
194 if (p->lmtime < year) /* - Время изменения */
195 printf(" %-7.7s %-4.4s ", cp+4, cp+20); else
196 printf(" %-12.12s ", cp+4);
197 }
198 if (p->lflags & ISARG) /* - Имя файла */
199 printf("%s\n", p->ln.namep);
200 else
201 printf("%.14s\n", p->ln.lname);
202 }
Строки 178–197 обрабатывают опцию
– l
. Строки 179–181 выводят тип файла, права доступа и число ссылок. Строки 182–184 устанавливают t
на ID владельца или группы, в зависимости от опции – g
. Строки 185–188 получают соответствующее имя и выводят его, если оно доступно. В противном случае программа выводит числовое значение. Строки 189–192 проверяют, является ли файл блочным или символьным устройством. Если да, они выводят старшее и младшее номера устройств, извлеченные с помощью макросов
major
и minor
. В противном случае они выводят размер файла. Строки 193–196 выводят соответствующее
time
см. раздел 6.1.3.1 «Простое форматирование времени: asctime
и ctime
»). Наконец, строки 198–201 выводят имя файла. Мы знаем, что для аргумента командной строки это завершающаяся нулем строка, и может быть использована
%s
. Для файла, прочитанного из каталога, оно может не завершаться нулем, поэтому должна использоваться явно указанная точность, %.14s
. 204 getname(uid, buf) /* int getname(int uid, char buf[]) */
205 int uid;
206 char buf[];
207 {
208 int j, c, n, i;
209
210 if (uid==lastuid) /* Простое кэширование, см. текст */
211 return(0);
212 if (pwdf == NULL) /* Проверка безопасности */
213 return(-1);
214 rewind(pwdf); /* Начать с начала файла */
215 lastuid = -1;
216 do {
217 i = 0; /* Индекс в массиве buf */
218 j = 0; /* Число полей в строке */
219 n = 0; /* Преобразование числового значения */
220 while ((c=fgetc(pwdf)) != '\n') { /* Прочесть строки */
221 if (c==EOF)
222 return(-1);
223 if (c==':') { /* Число полей*/
224 j++;
225 c = '0';
226 }
227 if (j==0) /* первое поле - имя */
228 buf[i++] = c;
229 if (j==2) /* Третье поле - числовой ID */
230 n = n*10 + c - '0';
231 }
232 } while (n != uid); /* Продолжать до обнаружения ID */
233 buf[i++] = '\0';
234 lastuid = aid;
235 return(0);
236 }
Функция
getname
преобразует ID владельца или группы в соответствующее имя. Она реализует простую схему кэширования; если переданное uid
то же самое, которое находится в глобальной переменной lastuid
, функция возвращает 0 (все нормально), буфер уже содержит имя (строки 210–211). lastuid
инициализируется в -1 (строка 33), поэтому этот тест не проходит, когда getname
вызывается первый раз. pwdf
уже открыт либо в /etc/passwd
, либо в /etc/group
(см. строки 126–130). Код здесь проверяет, что открытие было успешным, и если нет, возвращает -1 (строки 212–213).
Поделиться:
Популярные книги
Курсант: назад в СССР
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Чужая семья генерала драконов
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Пышка и Герцог
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 5
5. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имя нам Легион. Том 7
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Возвышение Меркурия
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 11
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Вираж бытия
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Отмороженный 11.0
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
История "не"мощной графини
1. Истории неунывающих попаданок
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Крестоносец
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Газлайтер. Том 15
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Призыватель нулевого ранга
1. Эпоха Гардара
Фантастика:
аниме
фэнтези
фантастика: прочее
5.00