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
выводит сведения о файле. Строки 172–173 проверяют, установлен ли -1 в поле 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).
Поделиться:
Популярные книги
Кодекс Крови. Книга ХII
12. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Наследие Маозари 3
3. Наследие Маозари
Фантастика:
рпг
аниме
5.00
рейтинг книги
Тринадцатый
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.80
рейтинг книги
Эволюционер из трущоб. Том 12
12. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Жена со скидкой, или Случайный брак
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Лейтенант. Часть 2. Назад в СССР
9. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Большая книга о новой жизни, которую никогда не поздно начать (сборник)
Дом и Семья:
здоровье и красота
5.00
рейтинг книги
Наномашины, сынок! Том 1
1. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Укус скорпиона
Фантастика:
киберпанк
5.00
рейтинг книги
Вечная Война. Книга II
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Изгой Проклятого Клана. Том 3
3. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда IX
9. Гримуар темного лорда
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Камень
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
География растений
Классики естествознания
Научно-образовательная:
ботаника
7.50