42: exit(1);
43: }
44: }
45:
46: int main(int argc, const char ** argv) {
47: pam_handle_t * pamh;
48: struct passwd * pw;
49: char * username=NULL, * service=NULL;
50: int account = 1, session = 0;
51: int c;
52: poptContext optCon;
53: struct poptOption optionsTable[] = {
54: { "username", 'u', POPT_ARG_STRING, &username, 0,
55: "ΠΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄Π»Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ", "<ΠΈΠΌΡ_ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ>" },
56: { "service", 'S', Π ΠPT_ARG_STRING, &service, 0,
57: "ΠΠΌΡ ΡΠ»ΡΠΆΠ±Ρ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ°ΠΊ (pamsample)",
58: "<ΡΠ»ΡΠΆΠ±Π°>" },
59: { "account", 'a', POPT_ARG_NONE|POPT_ARGFLAG_XOR,
60: &account, 0,
61: "Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅/Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΡΠ΅ΡΠ½ΡΠΌΠΈ Π·Π°ΠΏΠΈΡΡΠΌΠΈ (Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ)", "" },
62: { "session", 's', POPT_ARG_NONE|POPT_ARGFLAG_XOR,
63: &session, 0,
64: "Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅/Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅Π°Π½ΡΠ° (Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΎ)", "" },
65: POPT_AUTOHELP
66: POPT_TABLEEND
67: };
68:
69: optCon = poptGetContext("pamexample", argc, argv,
70: optionsTable, 0);
71: if ((c = poptGetNextOpt(optCon)) < -1) {
72: fprintf(stderr, "%s: %s\n",
73: poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
74: poptStrerror(c));
75: return 1;
76: }
77: poptFreeContext(optCon);
78:
79: if (!service) {
80: /* ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ
81: * ΡΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ; ΠΎΠ½ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ Π·Π΄Π΅ΡΡ, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ
82: * ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅,
83: * ΡΡΠ΅Π±ΡΡΡΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° root.
84: */
85: service = "pamexample";
86: }
87:
88: if (!username) {
89: /* ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ */
90: if (!(pw = getpwuid (getuid())) ) {
91: fprintf(stderr, "ΠΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ");
92: exit(1);
93: }
94: username = strdup(pw->pw_name);
95: }
96:
97: Ρ = pam_start(service, username, &my_conv, &pamh);
98: check_success(pamh, c);
99:
100: Ρ = pam_authenticate(pamh, 0);
101: check_success(pamh, c);
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"
20:
21: struct jobSet {
22: struct job * head; /* Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΡ ΡΡ Π·Π°Π΄Π°Π½ΠΈΠΉ */
23: struct job * fg; /* ΡΠ΅ΠΊΡΡΠ΅Π΅ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ */
24: };
25:
26: enum redirectionType { REDIRECT_INPUT, REDIRECT_OVERWRITE,
27: REDIRECT_APPEND };
28:
29: struct redirectionSpecifier {
30: enum redirectionType type; /* ΡΠΈΠΏ ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΠΈ */
31: int fd; /* ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΡ fd */
32: char * filename; /* ΡΠ°ΠΉΠ», Π² ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠΎΠ²Π°Π½ΠΎ fd */
33: };
34:
35: struct childProgram {
36: pid_t pid; /* 0 Π² ΡΠ»ΡΡΠ°Π΅ Π²ΡΡ ΠΎΠ΄Π° */
37: char ** argv; /* ΠΈΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ */
38: int numRedirections; /* ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΠΈ */
39: struct redirectionSpecifier* redirections; /* ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° */
40: glob_t globResult; /* ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° */
41: int freeGlob; /* Π½ΡΠΆΠ½ΠΎ Π»ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ globResult? */
42: int isStopped; /* Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π»ΠΈ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°?*/
43: };
44:
45: struct job {
46: int jobId; /* Π½ΠΎΠΌΠ΅Ρ Π·Π°Π΄Π°Π½ΠΈΡ */
47: int numProgs; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ */
48: int runningProgs; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΡ ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ */
49: char * text; /* ΠΈΠΌΡ Π·Π°Π΄Π°Π½ΠΈΡ */
50: char * cmdBuf; /* Π±ΡΡΠ΅Ρ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ»Π°ΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Ρ argv */
51: pid_t pgrp; /* ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π³ΡΡΠΏΠΏΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ */
52: struct childProgram* progs; /* ΠΌΠ°ΡΡΠΈΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π² Π·Π°Π΄Π°Π½ΠΈΠΈ */
53: struct job* next; /* Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠΎΠ½ΠΎΠ²ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ */
54: int stoppedProgs; /* ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π°ΠΊΡΠΈΠ²Π½ΡΡ , Π½ΠΎ ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ */
55: };
56:
57: void freeJob (struct job * cmd) {
58: int i;
59:
60: for (i = 0; i <cmd->numProgs; i++) {
61: free(cmd->progs[i].argv);
62: if (cmd->progs[i].redirections)
63: free(cmd->progs[i].redirections);
64: if (cmd->progs[i].freeGlob)
65: globfree(&cmd->progs[i].globResult);
66: }
67: free(cmd->progs);
68: if (cmd->text) free(cmd->text);
69: free(cmd->cmdBuf);
70: }
71:
72: int getCommand(FILE * source, char * command) {
73: if (source == stdin) {
74: printf("# ");
75: fflush(stdout);
76: }
77:
78: if (!fgets(command, MAX_COMMAND_LEN, source)) {
79: if (source == stdin) printf("\n");
80: return 1;
81: }
82:
83: /* ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ Π²ΠΎΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ */
84: command[strlen(command) - 1] = '\0';
85:
86: return 0;
87: }
88:
89: void globLastArgument(struct childProgram * prog, int * argcPtr,
90: int * argcAllocedPtr) {
91: int argc = *argcPtr;
92: int argcAlloced = *argcAllocedPtr;
93: int rc;
94: int flags;
95: int i;
96: char * src, * dst;
98: if (argc>1) { /* cmd->globResult ΡΠΆΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ */
99: flags = GLOB_APPEND;
100: i = prog->globResult.gl_pathc;
101: } else {
102: prog->freeGlob = 1;
103: flags = 0;