diff options
author | Luke Leighton <lkcl@samba.org> | 1998-11-29 20:03:33 +0000 |
---|---|---|
committer | Luke Leighton <lkcl@samba.org> | 1998-11-29 20:03:33 +0000 |
commit | 30038de4623bc827ee8019c569faf00583d1fe58 (patch) | |
tree | 1308b8cf5fdf8dcfa27d132015be4a187539a24f /source3/lib/util.c | |
parent | 534e6a2e1b22c1f40d8ba98300baff2c7e473aef (diff) | |
download | samba-30038de4623bc827ee8019c569faf00583d1fe58.tar.gz samba-30038de4623bc827ee8019c569faf00583d1fe58.tar.bz2 samba-30038de4623bc827ee8019c569faf00583d1fe58.zip |
weekend work. user / group database API.
- split sam_passwd and smb_passwd into separate higher-order function tables
- renamed struct smb_passwd's "smb_user" to "unix_user". added "nt_user"
plus user_rid, and added a "wrap" function in both sam_passwd and smb_passwd
password databases to fill in the blank entries that are not obtained
from whatever password database API instance is being used.
NOTE: whenever a struct smb_passwd or struct sam_passwd is used, it MUST
be initialised with pwdb_sam_init() or pwd_smb_init(), see chgpasswd.c
for the only example outside of the password database APIs i could find.
- added query_useraliases code to rpcclient.
- dealt with some nasty interdependencies involving non-smbd programs
and the password database API. this is still not satisfactorily
resolved completelely, but it's the best i can do for now.
- #ifdef'd out some password database options so that people don't
mistakenly set them unless they recompile to _use_ those options.
lots of debugging done, it's still not finished. the unix/NT uid/gid
and user-rid/group-rid issues are better, but not perfect. the "BUILTIN"
domain is still missing: users cannot be added to "BUILTIN" groups yet,
as we only have an "alias" db API and a "group" db API but not "builtin-alias"
db API...
(This used to be commit 5d5d7e4de7d1514ab87b07ede629de8aa00519a1)
Diffstat (limited to 'source3/lib/util.c')
-rw-r--r-- | source3/lib/util.c | 103 |
1 files changed, 60 insertions, 43 deletions
diff --git a/source3/lib/util.c b/source3/lib/util.c index 757abc8175..8bc75e1137 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -121,7 +121,7 @@ BOOL in_group(gid_t group, gid_t current_gid, int ngroups, gid_t *groups) /**************************************************************************** gets either a hex number (0xNNN) or decimal integer (NNN). ****************************************************************************/ -int get_number(char *tmp) +int get_number(const char *tmp) { if (strnequal(tmp, "0x", 2)) { @@ -2185,33 +2185,18 @@ void standard_sub(connection_struct *conn,char *str) { char *p, *s, *home; - for (s=str; (p=strchr(s, '%'));s=p) { - switch (*(p+1)) { - case 'H': - if ((home = get_home_dir(conn->user))) { - string_sub(p,"%H",home); - } else { - p += 2; - } - break; - - case 'P': - string_sub(p,"%P",conn->connectpath); - break; - - case 'S': - string_sub(p,"%S", - lp_servicename(SNUM(conn))); - break; - - case 'g': - string_sub(p,"%g", - gidtoname(conn->gid)); - break; - case 'u': - string_sub(p,"%u",conn->user); - break; - + for (s=str; (p=strchr(s, '%'));s=p) + { + switch (*(p+1)) + { + case 'H': + if ((home = get_home_dir(conn->user)) != NULL) { + string_sub(p,"%H",home); + } else { + p += 2; + } + break; + /* Patch from jkf@soton.ac.uk Left the %N (NIS * server name) in standard_sub_basic as it is * a feature for logon servers, hence uses the @@ -2219,17 +2204,14 @@ void standard_sub(connection_struct *conn,char *str) * here as it is used instead of the default * "path =" string in [homes] and so needs the * service name, not the username. */ - case 'p': - string_sub(p,"%p", - automount_path(lp_servicename(SNUM(conn)))); - break; - case '\0': - p++; - break; /* don't run off the end of the string - */ - - default: p+=2; - break; + case 'p': string_sub(p,"%p", automount_path(lp_servicename(SNUM(conn)))); break; + case 'P': string_sub(p,"%P",conn->connectpath); break; + case 'S': string_sub(p,"%S", lp_servicename(SNUM(conn))); break; + case 'g': string_sub(p,"%g", gidtoname(conn->gid)); break; + case 'u': string_sub(p,"%u", conn->user); break; + + case '\0': p++; break; /* don't run off the end of the string */ + default : p+=2; break; } } @@ -2351,13 +2333,48 @@ char *gidtoname(gid_t gid) } /******************************************************************* +turn a group name into a gid +********************************************************************/ + +BOOL nametogid(const char *name, gid_t *gid) +{ + struct group *grp = getgrnam(name); + if (grp) + { + *gid = grp->gr_gid; + return True; + } + else if (isdigit(name[0])) + { + *gid = (gid_t)get_number(name); + return True; + } + else + { + return False; + } +} + +/******************************************************************* turn a user name into a uid ********************************************************************/ -uid_t nametouid(const char *name) +BOOL nametouid(const char *name, uid_t *uid) { - struct passwd *pass = getpwnam(name); - if (pass) return(pass->pw_uid); - return (uid_t)-1; + struct passwd *pass = Get_Pwnam(name, False); + if (pass) + { + *uid = pass->pw_uid; + return True; + } + else if (isdigit(name[0])) + { + *uid = (uid_t)get_number(name); + return True; + } + else + { + return False; + } } /******************************************************************* |