Троан Эрик В.
Шрифт:
102:
103: if (account) {
104: /* если аутентификация не была закончена, управление
105: * учетной записью не определено
106: */
107: с = pam_acct_mgmt(pamh, 0);
108: check_success(pamh, с);
109: }
110:
111: if (session) {
112: /* В случае необходимости мы могли бы организовывать здесь ветвление */
113: с = pam_open_session(pamh, 0);
114: check_success(pamh, с);
115:
116: /* Обратите внимание, что здесь не устанавливается uid, gid
117: или дополнительные группы */
118: с = pam_setcred(pamh, 0);
119:
120: /* В случае необходимости мы могли бы закрыть здесь полномочия */
121:
122: /* Вызов оболочки, которая была "аутентифицирована" */
123: printf("Запуск оболочки...\n");
124: system("exec bash -");
125:
126: /* Здесь мы могли бы использовать wait4, если бы организовывали
127: ветвление вместо вызова system */
128: с = pam_close_session(pamh, 0);
129: check_success(pamh, с);
130: }
131:
132: /* Реальные приложения могли бы сообщать о сбое вместо
133: * выхода, что мы и делали в check_success на каждой стадии,
134: * поэтому в таких случаях с может иметь значения, отличные
135: * от PAM_SUCCESS.
136: */
137: с = pam_end(pamh, с);
138: check_success(pamh, с);
139:
140: return 0;
141: }
Приложения
Приложение A
Заголовочные файлы
В этом приложении показаны все локальные заголовочные файлы для исходного кода, рассмотренного в книге.
1: /* libhello.h */
2:
3: #ifndef LIBHELLO_H_
4: #define LIBHELLO_H_
5:
6: void print_hello(void);
7:
8: #endif /* LIBHELLO_H_ */
1: /* ptypair.h */
2:
3: #ifndef _PTYPAIR_H
4: #define _PTYPAIR_H
5: int get_master_pty(char **name);
6: int get_slave_pty(char *name);
7: #endif /* _PTYPAIR_H */
1: /* sockutil.h */
2:
3: void die(char * message);
4: void copyData(int from, int to);
5: #ifndef CMSG_DATA
6: #define CMSG_DATA (cmsg) ((cmsg)->cmsg_data)
7: #endif
Приложение Б
Исходный код
ladsh
1: /* ladsh4.c */
2:
3: #define _GNU_SOURCE
4:
5: #include <ctype.h>
6: #include <errno.h>
7: #include <fcntl.h>
8: #include <glob.h>
9: #include <signal.h>
10: #include <stdio.h>
11: #include <stdlib.h>
12: #include <string.h>
13: #include <sys/ioctl.h>
14: #include <sys/wait.h>
15: #include <unistd.h>
16:
17: #define MAX_COMMAND_LEN 250 /* максимальная длина одной
18: командной строки */
19: #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n"