|
|
1.1 root 1: /* lookup.c - password lookup service -- initiator */
2:
3: #include <stdio.h>
4: #include "ryinitiator.h" /* for generic interctive initiators */
5: #include "PasswordLookup-ops.h" /* operation definitions */
6: #include "PasswordLookup-types.h" /* type definitions */
7:
8: /* DATA */
9:
10: static char *myservice = "passwdstore";
11:
12: static char *mycontext = "isode passwd lookup demo";
13: static char *mypci = "isode passwd lookup demo pci";
14:
15:
16: /* ARGUMENTS */
17: int do_lookupUser (), do_lookupUID (), do_help (), do_quit ();
18:
19: /* RESULTS */
20: int lookup_result ();
21:
22: /* ERRORS */
23: int lookup_error ();
24:
25:
26: static struct dispatch dispatches[] = {
27: "lookupUser", operation_PasswordLookup_lookupUser,
28: do_lookupUser, free_PasswordLookup_UserName,
29: lookup_result, lookup_error,
30: "find user by name",
31:
32: "lookupUID", operation_PasswordLookup_lookupUID,
33: do_lookupUID, free_PasswordLookup_UserID,
34: lookup_result, lookup_error,
35: "find user by id",
36:
37: "help", 0,
38: do_help, NULLIFP,
39: NULLIFP, NULLIFP,
40: "print this information",
41:
42: "quit", 0,
43: do_quit, NULLIFP,
44: NULLIFP, NULLIFP,
45: "terminate the association and exit",
46:
47: NULL
48: };
49:
50: /* MAIN */
51:
52: /* ARGSUSED */
53:
54: main (argc, argv, envp)
55: int argc;
56: char **argv,
57: **envp;
58: {
59: (void) ryinitiator (argc, argv, myservice, mycontext, mypci,
60: table_PasswordLookup_Operations, dispatches, do_quit);
61:
62: exit (0); /* NOTREACHED */
63: }
64:
65: /* ARGUMENTS */
66:
67: /* ARGSUSED */
68:
69: static int do_lookupUser (sd, ds, args, arg)
70: int sd;
71: struct dispatch *ds;
72: char **args;
73: register struct type_PasswordLookup_UserName **arg;
74: {
75: char *cp;
76:
77: if ((cp = *args++) == NULL) {
78: advise (NULLCP, "usage: lookupUser username");
79: return NOTOK;
80: }
81:
82: if ((*arg = str2qb (cp, strlen (cp), 1)) == NULL)
83: adios (NULLCP, "out of memory");
84:
85: return OK;
86: }
87:
88: /* */
89:
90: /* ARGSUSED */
91:
92: static int do_lookupUID (sd, ds, args, arg)
93: int sd;
94: struct dispatch *ds;
95: char **args;
96: register struct type_PasswordLookup_UserID **arg;
97: {
98: char *cp;
99:
100: if ((cp = *args++) == NULL) {
101: advise (NULLCP, "usage: lookupUID userid");
102: return NOTOK;
103: }
104:
105: if ((*arg = (struct type_PasswordLookup_UserID *) calloc (1, sizeof **arg))
106: == NULL)
107: adios (NULLCP, "out of memory");
108:
109: (*arg) -> parm = atoi (cp);
110:
111: return OK;
112: }
113:
114: /* */
115:
116: /* ARGSUSED */
117:
118: static int do_help (sd, ds, args, dummy)
119: int sd;
120: register struct dispatch *ds;
121: char **args;
122: caddr_t *dummy;
123: {
124: printf ("\nCommands are:\n");
125: for (ds = dispatches; ds -> ds_name; ds++)
126: printf ("%s\t%s\n", ds -> ds_name, ds -> ds_help);
127:
128: return NOTOK;
129: }
130:
131: /* */
132:
133: /* ARGSUSED */
134:
135: static int do_quit (sd, ds, args, dummy)
136: int sd;
137: struct dispatch *ds;
138: char **args;
139: caddr_t *dummy;
140: {
141: struct AcSAPrelease acrs;
142: register struct AcSAPrelease *acr = &acrs;
143: struct AcSAPindication acis;
144: register struct AcSAPindication *aci = &acis;
145: register struct AcSAPabort *aca = &aci -> aci_abort;
146:
147: if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK)
148: acs_adios (aca, "A-RELEASE.REQUEST");
149:
150: if (!acr -> acr_affirmative) {
151: (void) AcUAbortRequest (sd, NULLPEP, 0, aci);
152: adios (NULLCP, "release rejected by peer: %d", acr -> acr_reason);
153: }
154:
155: ACRFREE (acr);
156:
157: exit (0);
158: }
159:
160: /* RESULTS */
161:
162: /* ARGSUSED */
163:
164: static int lookup_result (sd, id, dummy, result, roi)
165: int sd,
166: id,
167: dummy;
168: register struct type_PasswordLookup_Passwd *result;
169: struct RoSAPindication *roi;
170: {
171: print_qb (result -> name);
172: putchar (':');
173: print_qb (result -> passwd);
174: printf (":%d:%d:", result -> uid -> parm, result -> gid -> parm);
175: print_qb (result -> gecos);
176: putchar (':');
177: print_qb (result -> dir);
178: putchar (':');
179: print_qb (result -> shell);
180: putchar ('\n');
181:
182: return OK;
183: }
184:
185:
186: static print_qb (q)
187: register struct qbuf *q;
188: {
189: register struct qbuf *p;
190:
191: if (q == NULL)
192: return;
193:
194: for (p = q -> qb_forw; p != q; p = p -> qb_forw)
195: printf ("%*.*s", p -> qb_len, p -> qb_len, p -> qb_data);
196: }
197:
198: /* ERRORS */
199:
200: /* ARGSUSED */
201:
202: static int lookup_error (sd, id, error, parameter, roi)
203: int sd,
204: id,
205: error;
206: caddr_t parameter;
207: struct RoSAPindication *roi;
208: {
209: register struct RyError *rye;
210:
211: if (error == RY_REJECT) {
212: advise (NULLCP, "%s", RoErrString ((int) parameter));
213: return OK;
214: }
215:
216: if (rye = finderrbyerr (table_PasswordLookup_Errors, error))
217: advise (NULLCP, "%s", rye -> rye_name);
218: else
219: advise (NULLCP, "Error %d", error);
220:
221: return OK;
222: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.