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