// // aegis - project change supervisor // Copyright (C) 2007, 2008, 2012 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see // . // #include #include #include #include #include #include user_ty::pointer user_ty::create(int uid) { // // see if we already know her // trace(("user_ty::create(uid = %d)\n{\n", uid)); user_ty::pointer old = pool_find(uid); if (old) { trace(("return %p;\n", old.get())); trace(("}\n")); return old; } // // first time we have met her // user_ty::pointer up(new user_ty(uid)); pool_add(up); trace(("return %p;\n", up.get())); trace(("}\n")); return up; } user_ty::user_ty(int a_uid) : user_id(a_uid), group_id(0), umask(022), ustate_data(0), ustate_is_new(false), ustate_modified(false), uconf_data(0), lock_magic(0) { trace(("user_ty::user_ty(a_uid = %d)\n{\n", a_uid)); // // Always use the UID as the primary reference: // the system treats the first entry as cannonical, so do we. // struct passwd *pw = getpwuid_cached(user_id); if (!pw) { sub_context_ty sc; sc.var_set_long("Number", user_id); sc.fatal_intl(i18n("uid $number unknown")); // NOTREACHED } group_id = pw->pw_gid; login_name = pw->pw_name; home = pw->pw_dir; char *fnm = pw->pw_name; if (pw->pw_gecos && pw->pw_gecos[0]) fnm = pw->pw_gecos; #ifdef HAVE_pw_comment else if (pw->pw_comment && pw->pw_comment[0]) fnm = pw->pw_comment; #endif // // Some systems add lots of other stuff to the full name field // in the passwd file. We are only interested in the name. // const char *comma = strchr(fnm, ','); if (comma) login_full_name = nstring(fnm, comma - fnm); else login_full_name = fnm; struct group *gr = getgrgid_cached(group_id); if (!gr) { sub_context_ty sc; sc.var_set_long("Number", group_id); sc.fatal_intl(i18n("gid $number unknown")); // NOTREACHED } group_name = gr->gr_name; trace(("}\n")); } // vim: set ts=8 sw=4 et :