|
|
1.1 root 1: /* imisc.c - miscellaneous network service -- initiator */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/imisc/RCS/imisc.c,v 7.2 90/07/09 14:38:45 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/imisc/RCS/imisc.c,v 7.2 90/07/09 14:38:45 mrose Exp $
9: *
10: *
11: * $Log: imisc.c,v $
12: * Revision 7.2 90/07/09 14:38:45 mrose
13: * sync
14: *
15: * Revision 7.1 90/07/01 21:04:02 mrose
16: * pepsy
17: *
18: * Revision 7.0 89/11/23 21:57:35 mrose
19: * Release 6.0
20: *
21: */
22:
23: /*
24: * NOTICE
25: *
26: * Acquisition, use, and distribution of this module and related
27: * materials are subject to the restrictions of a license agreement.
28: * Consult the Preface in the User's Manual for the full terms of
29: * this agreement.
30: *
31: */
32:
33:
34: #include <ctype.h>
35: #include <stdio.h>
36: #include <pwd.h>
37: #include "ryinitiator.h" /* for generic interactive initiators */
38: #include "IMISC-ops.h" /* IMISC operation definitions */
39: #include "IMISC-types.h" /* IMISC type definitions */
40:
41:
42: #ifdef SYS5
43: struct passwd *getpwuid ();
44: #endif
45:
46: /* DATA */
47:
48: static char *myservice = "isode miscellany";/* should be something other
49: than mycontext */
50:
51: static char *mycontext = "isode miscellany";
52: static char *mypci = "isode miscellany pci";
53:
54:
55: extern int length;
56: static type_IMISC_Data *data = NULLPE;
57:
58: /* TYPES */
59: struct type_IMISC_IA5List *vec2ia5list ();
60:
61:
62: /* ARGUMENTS */
63: int do_finger (), do_tell (), do_data (), do_help (), do_quit ();
64:
65:
66: /* RESULTS */
67: #define gentime_result utctime_result
68:
69: int utctime_result (), timeofday_result (), ia5_result (), tell_result (),
70: null_result (), echo_result ();
71:
72: /* ERRORS */
73: int imisc_error ();
74:
75:
76: static struct dispatch dispatches[] = {
77: "utctime", operation_IMISC_utcTime,
78: NULLIFP, NULL, 0,
79: utctime_result, imisc_error,
80: "the universal time",
81:
82: "gentime", operation_IMISC_genTime,
83: NULLIFP, NULL, 0,
84: gentime_result, imisc_error,
85: "the generalized time",
86:
87: "time", operation_IMISC_timeOfDay,
88: NULLIFP, NULL, 0,
89: timeofday_result, imisc_error,
90: "the current time since the epoch",
91:
92: "users", operation_IMISC_users,
93: NULLIFP, NULL, 0,
94: ia5_result, imisc_error,
95: "the users logged in on the system",
96:
97: "chargen", operation_IMISC_charGen,
98: NULLIFP, NULL, 0,
99: ia5_result, imisc_error,
100: "the character generation pattern",
101:
102: "qotd", operation_IMISC_qotd,
103: NULLIFP, NULL, 0,
104: ia5_result, imisc_error,
105: "the quote of the day",
106:
107: "finger", operation_IMISC_finger,
108: do_finger, &_ZIMISC_mod, _ZIA5ListIMISC,
109: ia5_result, imisc_error,
110: "the finger of users logged in",
111:
112: "pwdgen", operation_IMISC_pwdGen,
113: NULLIFP, NULL, 0,
114: ia5_result, imisc_error,
115: "some pseudo-randomly generated passwords",
116:
117: "tell", operation_IMISC_tellUser,
118: do_tell, &_ZIMISC_mod, _ZIA5ListIMISC,
119: tell_result, imisc_error,
120: "send a message to a remote user",
121:
122: "ping", operation_IMISC_ping,
123: NULLIFP, NULL, 0,
124: null_result, imisc_error,
125: "ping responder",
126:
127: "sink", operation_IMISC_sink,
128: do_data, NULL, 0,
129: null_result, imisc_error,
130: "sink data",
131:
132: "echo", operation_IMISC_echo,
133: do_data, NULL, 0,
134: echo_result, imisc_error,
135: "echo data",
136:
137: "help", 0,
138: do_help, NULL, 0,
139: NULLIFP, NULLIFP,
140: "print this information",
141:
142: "quit", 0,
143: do_quit, NULL, 0,
144: NULLIFP, NULLIFP,
145: "terminate the association and exit",
146:
147: NULL
148: };
149:
150:
151: char *ctime ();
152:
153: /* MAIN */
154:
155: /* ARGSUSED */
156:
157: main (argc, argv, envp)
158: int argc;
159: char **argv,
160: **envp;
161: {
162: ryinitiator (argc, argv, myservice, mycontext, mypci,
163: table_IMISC_Operations, dispatches, do_quit);
164:
165: exit (0); /* NOTREACHED */
166: }
167:
168: /* TYPES */
169:
170: struct type_IMISC_IA5List *vec2ia5list (vec)
171: char **vec;
172: {
173: struct type_IMISC_IA5List *ia5;
174: register struct type_IMISC_IA5List **ia5p;
175:
176: ia5 = NULL;
177: ia5p = &ia5;
178:
179: for (; *vec; vec++) {
180: if ((*ia5p = (struct type_IMISC_IA5List *) calloc (1, sizeof **ia5p))
181: == NULL)
182: adios (NULLCP, "out of memory");
183:
184: if (((*ia5p) -> IA5String = str2qb (*vec, strlen (*vec), 1)) == NULL)
185: adios (NULLCP, "out of memory");
186:
187: ia5p = &((*ia5p) -> next);
188: }
189:
190: return ia5;
191: }
192:
193: /* */
194:
195: static print_ia5list (ia5)
196: register struct type_IMISC_IA5List *ia5;
197: {
198: register struct qbuf *p,
199: *q;
200:
201: for (; ia5; ia5 = ia5 -> next) {
202: p = ia5 -> IA5String;
203: for (q = p -> qb_forw; q != p ; q = q -> qb_forw)
204: printf ("%*.*s", q -> qb_len, q -> qb_len, q -> qb_data);
205: printf ("\n");
206: }
207: }
208:
209: /* ARGUMENTS */
210:
211: /* ARGSUSED */
212:
213: static int do_finger (sd, ds, args, ia5)
214: int sd;
215: struct dispatch *ds;
216: char **args;
217: struct type_IMISC_IA5List **ia5;
218: {
219: *ia5 = vec2ia5list (args);
220:
221: return OK;
222: }
223:
224: /* */
225:
226: /* ARGSUSED */
227:
228: static int do_tell (sd, ds, args, ia5)
229: int sd;
230: struct dispatch *ds;
231: char **args;
232: register struct type_IMISC_IA5List **ia5;
233: {
234: char *cp,
235: *dp,
236: buffer[BUFSIZ];
237: register struct type_IMISC_IA5List *ia52;
238: register struct passwd *pw;
239:
240: if (args[0] == NULL || args[1] == NULL) {
241: advise (NULLCP, "usage: tell user message ...");
242: return NOTOK;
243: }
244:
245: *ia5 = vec2ia5list (args);
246:
247: cp = (pw = getpwuid (getuid ())) ? pw -> pw_name : "anon";
248: dp = PLocalHostName ();
249:
250: if ((ia52 = (struct type_IMISC_IA5List *) calloc (1, sizeof *ia52))
251: == NULL)
252: adios (NULLCP, "out of memory");
253: (void) sprintf (buffer, "%s@%s", cp, dp);
254: if ((ia52 -> IA5String = str2qb (buffer, strlen (buffer), 1)) == NULL)
255: adios (NULLCP, "out of memory");
256:
257: /* kludge this arg onto front of list - HACK ATTACK */
258: ia52 -> next = *ia5;
259: *ia5 = ia52;
260:
261: return OK;
262: }
263:
264: /* */
265:
266: /* ARGSUSED */
267:
268: static int do_data (sd, ds, args, pep)
269: int sd;
270: struct dispatch *ds;
271: char **args;
272: register struct type_IMISC_Data **pep;
273: {
274: char *cp;
275:
276: if (data == NULLPE) {
277: if (length > 0) {
278: if ((cp = malloc ((unsigned) length)) == NULL)
279: adios (NULLCP, "no memory");
280: }
281: else
282: cp = NULL;
283: if ((data = oct2prim (cp, length)) == NULLPE)
284: adios (NULLCP, "no memory");
285: if (cp)
286: free (cp);
287: }
288:
289: *pep = data;
290: return OK;
291: }
292:
293: /* */
294:
295: /* ARGSUSED */
296:
297: static int do_help (sd, ds, args, dummy)
298: int sd;
299: register struct dispatch *ds;
300: char **args;
301: caddr_t *dummy;
302: {
303: printf ("\nCommands are:\n");
304: for (ds = dispatches; ds -> ds_name; ds++)
305: printf ("%s\t%s\n", ds -> ds_name, ds -> ds_help);
306:
307: return NOTOK;
308: }
309:
310: /* */
311:
312: /* ARGSUSED */
313:
314: static int do_quit (sd, ds, args, dummy)
315: int sd;
316: struct dispatch *ds;
317: char **args;
318: caddr_t *dummy;
319: {
320: struct AcSAPrelease acrs;
321: register struct AcSAPrelease *acr = &acrs;
322: struct AcSAPindication acis;
323: register struct AcSAPindication *aci = &acis;
324: register struct AcSAPabort *aca = &aci -> aci_abort;
325:
326: if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, NOTOK, acr, aci) == NOTOK)
327: acs_adios (aca, "A-RELEASE.REQUEST");
328:
329: if (!acr -> acr_affirmative) {
330: (void) AcUAbortRequest (sd, NULLPEP, 0, aci);
331: adios (NULLCP, "release rejected by peer: %d", acr -> acr_reason);
332: }
333:
334: ACRFREE (acr);
335:
336: exit (0);
337: }
338:
339: /* RESULTS */
340:
341: /* ARGSUSED */
342:
343: static int utctime_result (sd, id, dummy, result, roi)
344: int sd,
345: id,
346: dummy;
347: register struct type_IMISC_UTCResult *result;
348: struct RoSAPindication *roi;
349: {
350: register struct qbuf *q;
351:
352: for (q = result -> qb_forw; q != result; q = q -> qb_forw)
353: printf ("%*.*s", q -> qb_len, q -> qb_len, q -> qb_data);
354: printf ("\n");
355:
356: return OK;
357: }
358:
359: /* */
360:
361: /* ARGSUSED */
362:
363: static int timeofday_result (sd, id, dummy, result, roi)
364: int sd,
365: id,
366: dummy;
367: register struct type_IMISC_TimeResult *result;
368: struct RoSAPindication *roi;
369: {
370: long s;
371:
372: s = result -> parm - 2208988800L; /* UNIX epoch */
373: printf ("%s", ctime (&s));
374:
375: return OK;
376: }
377:
378: /* */
379:
380: /* ARGSUSED */
381:
382: static int ia5_result (sd, id, dummy, result, roi)
383: int sd,
384: id,
385: dummy;
386: register struct type_IMISC_IA5List *result;
387: struct RoSAPindication *roi;
388: {
389: print_ia5list (result);
390:
391: return OK;
392: }
393:
394: /* */
395:
396: /* ARGSUSED */
397:
398: static int tell_result (sd, id, dummy, result, roi)
399: int sd,
400: id,
401: dummy;
402: caddr_t result;
403: struct RoSAPindication *roi;
404: {
405: printf ("told.\n");
406:
407: return OK;
408: }
409:
410: /* */
411:
412: /* ARGSUSED */
413:
414: static int null_result (sd, id, dummy, result, roi)
415: int sd,
416: id,
417: dummy;
418: caddr_t result;
419: struct RoSAPindication *roi;
420: {
421: return OK;
422: }
423:
424: /* */
425:
426: /* ARGSUSED */
427:
428: static int echo_result (sd, id, dummy, result, roi)
429: int sd,
430: id,
431: dummy;
432: struct type_IMISC_Data *result;
433: struct RoSAPindication *roi;
434: {
435: if (pe_cmp (result, data))
436: advise (NULLCP, "data mismatch");
437:
438: return OK;
439: }
440:
441: /* ERRORS */
442:
443: /* ARGSUSED */
444:
445: static int imisc_error (sd, id, error, parameter, roi)
446: int sd,
447: id,
448: error;
449: register struct type_IMISC_IA5List *parameter;
450: struct RoSAPindication *roi;
451: {
452: register struct RyError *rye;
453:
454: if (error == RY_REJECT) {
455: advise (NULLCP, "%s", RoErrString ((int) parameter));
456: return OK;
457: }
458:
459: if (rye = finderrbyerr (table_IMISC_Errors, error))
460: advise (NULLCP, "%s", rye -> rye_name);
461: else
462: advise (NULLCP, "Error %d", error);
463:
464: if (parameter)
465: print_ia5list (parameter);
466:
467: return OK;
468: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.