/* * Don't make this return a uid_t, because we need to return negative * numbers as well (error codes.) */ int uidof(char *username) { int idx; if ((idx = untab_index(username)) < 0) /* not found */ return INVALIDID; /* an invalid user id */ return untab[idx].uid; }
/* * Don't make this return a uid_t, because we need to return negative * numbers as well (error codes.) */ char * homeof(char *username) { int idx; if ((idx = untab_index(username)) < 0) /* not found */ return (char *) NULL; /* an invalid user id */ return untab[idx].home; }
nfsdiropres * nfsproc_lookup_2_svc(nfsdiropargs *argp, struct svc_req *rqstp) { static nfsdiropres res; int idx; uid_t uid = (uid_t) INVALIDID; gid_t gid = (gid_t) INVALIDID; if (!started) { started++; rootfattr.na_ctime = startup; rootfattr.na_mtime = startup; slinkfattr.na_ctime = startup; slinkfattr.na_mtime = startup; un_fattr.na_ctime = startup; un_fattr.na_mtime = startup; } if (eq_fh(&argp->da_fhandle, &slink)) { res.dr_status = NFSERR_NOTDIR; return &res; } if (getcreds(rqstp, &uid, &gid, nfsxprt) < 0) { res.dr_status = NFSERR_NOENT; return &res; } if (eq_fh(&argp->da_fhandle, &root)) { if (argp->da_name[0] == '.' && (argp->da_name[1] == '\0' || (argp->da_name[1] == '.' && argp->da_name[2] == '\0'))) { #if 0 /* * XXX: increment mtime of parent directory, causes NFS clients to * invalidate their cache for that directory. * Some NFS clients may need this code. */ if (uid != rootfattr.na_uid) { clocktime(&rootfattr.na_mtime); rootfattr.na_uid = uid; } #endif /* 0 */ res.dr_u.dr_drok_u.drok_fhandle = root; res.dr_u.dr_drok_u.drok_attributes = rootfattr; res.dr_status = NFS_OK; return &res; } if (STREQ(argp->da_name, slinkname)) { #ifndef MNT2_NFS_OPT_SYMTTL /* * This code is needed to defeat Solaris 2.4's (and newer) symlink * values cache. It forces the last-modified time of the symlink to be * current. It is not needed if the O/S has an nfs flag to turn off the * symlink-cache at mount time (such as Irix 5.x and 6.x). -Erez. * * Additionally, Linux currently ignores the nt_useconds field, * so we must update the nt_seconds field every time. */ if (uid != slinkfattr.na_uid) { clocktime(&slinkfattr.na_mtime); slinkfattr.na_uid = uid; } #endif /* not MNT2_NFS_OPT_SYMTTL */ res.dr_u.dr_drok_u.drok_fhandle = slink; res.dr_u.dr_drok_u.drok_attributes = slinkfattr; res.dr_status = NFS_OK; return &res; } if (gid != hlfs_gid) { res.dr_status = NFSERR_NOENT; return &res; } /* if gets here, gid == hlfs_gid */ if ((idx = untab_index(argp->da_name)) < 0) { res.dr_status = NFSERR_NOENT; return &res; } else { /* entry found and gid is permitted */ u_int xuid; un_fattr.na_fileid = untab[idx].uid; res.dr_u.dr_drok_u.drok_attributes = un_fattr; memset(&un_fhandle, 0, sizeof(am_nfs_fh)); xuid = (u_int) untab[idx].uid; memcpy(un_fhandle.fh_data, &xuid, sizeof(xuid)); xstrlcpy((char *) &un_fhandle.fh_data[sizeof(xuid)], untab[idx].username, sizeof(am_nfs_fh) - sizeof(xuid)); res.dr_u.dr_drok_u.drok_fhandle = un_fhandle; res.dr_status = NFS_OK; dlog("nfs_lookup: successful lookup for uid=%ld, gid=%ld: username=%s", (long) uid, (long) gid, untab[idx].username); return &res; } } /* end of "if (eq_fh(argp->dir.data, root.data)) {" */ res.dr_status = NFSERR_STALE; return &res; }