|
|
1.1 root 1: /* lookupd.c - password lookup service -- responder */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/others/lookup/RCS/lookupd.c,v 7.1 90/07/09 14:39:50 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/others/lookup/RCS/lookupd.c,v 7.1 90/07/09 14:39:50 mrose Exp $
9: *
10: *
11: * $Log: lookupd.c,v $
12: * Revision 7.1 90/07/09 14:39:50 mrose
13: * sync
14: *
15: * Revision 7.0 89/11/23 22:56:39 mrose
16: * Release 6.0
17: *
18: */
19:
20: /*
21: * NOTICE
22: *
23: * Acquisition, use, and distribution of this module and related
24: * materials are subject to the restrictions of a license agreement.
25: * Consult the Preface in the User's Manual for the full terms of
26: * this agreement.
27: *
28: */
29:
30:
31: #include <stdio.h>
32: #include <pwd.h>
33: #include "ryresponder.h" /* for generic idempotent responders */
34: #include "PasswordLookup-ops.h" /* operation definitions */
35: #include "PasswordLookup-types.h" /* type definitions */
36:
37:
38: #define xalloc(p, type) \
39: ((p) = (type) calloc (1, sizeof *(p)))
40:
41: #define salloc(s) \
42: str2qb ((s), strlen (s), 1)
43:
44:
45: #ifdef SYS5
46: struct passwd *getpwnam (), *getpwuid ();
47: #endif
48:
49: /* DATA */
50:
51: static char *myservice = "passwdstore";
52:
53: static char *mycontext = "isode passwd lookup demo";
54:
55:
56: /* OPERATIONS */
57: int op_lookupUser (), op_lookupUID ();
58:
59: static struct dispatch dispatches[] = {
60: "lookupUser", operation_PasswordLookup_lookupUser, op_lookupUser,
61:
62: "lookupUID", operation_PasswordLookup_lookupUID, op_lookupUID,
63:
64: NULL
65: };
66:
67: /* MAIN */
68:
69: /* ARGSUSED */
70:
71: main (argc, argv, envp)
72: int argc;
73: char **argv,
74: **envp;
75: {
76: (void) ryresponder (argc, argv, PLocalHostName (), myservice, mycontext,
77: dispatches, table_PasswordLookup_Operations,
78: NULLIFP, NULLIFP);
79:
80: exit (0); /* NOTREACHED */
81: }
82:
83: /* OPERATIONS */
84:
85: static int op_lookupUser (sd, ryo, rox, in, roi)
86: int sd;
87: struct RyOperation *ryo;
88: struct RoSAPinvoke *rox;
89: caddr_t in;
90: struct RoSAPindication *roi;
91: {
92: int result;
93: char *cp;
94: register struct type_PasswordLookup_UserName *arg =
95: (struct type_PasswordLookup_UserName *) in;
96:
97: if (rox -> rox_nolinked == 0) {
98: advise (LLOG_EXCEPTIONS, NULLCP,
99: "RO-INVOKE.INDICATION/%d: %s, unknown linkage %d",
100: sd, ryo -> ryo_name, rox -> rox_linkid);
101: return ureject (sd, ROS_IP_LINKED, rox, roi);
102: }
103: if (debug)
104: advise (LLOG_DEBUG, NULLCP, "RO-INVOKE.INDICATION/%d: %s",
105: sd, ryo -> ryo_name);
106:
107: if ((cp = qb2str (arg)) == NULL)
108: result = error (sd, error_PasswordLookup_congested, (caddr_t) NULL,
109: rox, roi);
110: else {
111: result = lookup (sd, getpwnam (cp), rox, roi);
112: free (cp);
113: }
114:
115: return result;
116: }
117:
118: /* */
119:
120: static int op_lookupUID (sd, ryo, rox, in, roi)
121: int sd;
122: struct RyOperation *ryo;
123: struct RoSAPinvoke *rox;
124: caddr_t in;
125: struct RoSAPindication *roi;
126: {
127: register struct type_PasswordLookup_UserID *arg =
128: (struct type_PasswordLookup_UserID *) in;
129:
130: if (rox -> rox_nolinked == 0) {
131: advise (LLOG_EXCEPTIONS, NULLCP,
132: "RO-INVOKE.INDICATION/%d: %s, unknown linkage %d",
133: sd, ryo -> ryo_name, rox -> rox_linkid);
134: return ureject (sd, ROS_IP_LINKED, rox, roi);
135: }
136: if (debug)
137: advise (LLOG_DEBUG, NULLCP, "RO-INVOKE.INDICATION/%d: %s",
138: sd, ryo -> ryo_name);
139:
140: return lookup (sd, getpwuid (arg -> parm), rox, roi);
141: }
142:
143: /* */
144:
145: static int lookup (sd, pw, rox, roi)
146: int sd;
147: struct passwd *pw;
148: struct RoSAPinvoke *rox;
149: struct RoSAPindication *roi;
150: {
151: int result;
152:
153: if (pw) {
154: register struct type_PasswordLookup_Passwd *res = NULL;
155:
156: if (xalloc (res, struct type_PasswordLookup_Passwd *) == NULL
157: || (res -> name = salloc (pw -> pw_name)) == NULL
158: || (*pw -> pw_passwd
159: && (res -> passwd = salloc (pw -> pw_passwd)) == NULL)
160: || xalloc (res -> uid, struct type_PasswordLookup_UserID *)
161: == NULL
162: || xalloc (res -> gid, struct type_PasswordLookup_GroupID *)
163: == NULL
164: || (pw -> pw_comment
165: && (res -> comment = salloc (pw -> pw_comment))
166: == NULL)
167: || (pw -> pw_gecos
168: && (res -> gecos = salloc (pw -> pw_gecos)) == NULL)
169: || (pw -> pw_dir
170: && (res -> dir = salloc (pw -> pw_dir)) == NULL)
171: || (pw -> pw_shell
172: && (res -> shell = salloc (pw -> pw_shell)) == NULL))
173: result = error (sd, error_PasswordLookup_congested, (caddr_t) NULL,
174: rox, roi);
175: else {
176: res -> uid -> parm = pw -> pw_uid;
177: res -> gid -> parm = pw -> pw_gid;
178: /*
179: res -> quota = pw -> pw_quota;
180: */
181:
182: if (RyDsResult (sd, rox -> rox_id, (caddr_t) res, ROS_NOPRIO, roi)
183: == NOTOK)
184: ros_adios (&roi -> roi_preject, "RESULT");
185: result = OK;
186: }
187:
188: free_PasswordLookup_Passwd (res);
189: }
190: else
191: result = error (sd, error_PasswordLookup_noSuchUser, (caddr_t) NULL,
192: rox, roi);
193:
194: return result;
195: }
196:
197: /* ERROR */
198:
199: static int error (sd, err, param, rox, roi)
200: int sd,
201: err;
202: caddr_t param;
203: struct RoSAPinvoke *rox;
204: struct RoSAPindication *roi;
205: {
206: if (RyDsError (sd, rox -> rox_id, err, param, ROS_NOPRIO, roi) == NOTOK)
207: ros_adios (&roi -> roi_preject, "ERROR");
208:
209: return OK;
210: }
211:
212: /* U-REJECT */
213:
214: static int ureject (sd, reason, rox, roi)
215: int sd,
216: reason;
217: struct RoSAPinvoke *rox;
218: struct RoSAPindication *roi;
219: {
220: if (RyDsUReject (sd, rox -> rox_id, reason, ROS_NOPRIO, roi) == NOTOK)
221: ros_adios (&roi -> roi_preject, "U-REJECT");
222:
223: return OK;
224: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.