// // aegis - project change supervisor // Copyright (C) 2007, 2008 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 user_ty::pointer user_ty::create(int uid, int gid) { trace(("user_ty::create(uid = %d, gid = %d)\n{\n", uid, gid)); user_ty::pointer old = pool_find(uid); if (old) { trace(("return %08lX\n", (long)old.get())); trace(("}\n")); return old; } user_ty::pointer up(new user_ty(uid, gid)); pool_add(up); trace(("return %08lX;\n", (long)up.get())); trace(("}\n")); return up; } user_ty::user_ty(int uid, int gid) : user_id(uid), group_id(gid), umask(022), ustate_data(0), ustate_is_new(false), ustate_modified(false), uconf_data(0), lock_magic(0) { trace(("user_ty::user_ty(uid = %d, gid = %d)\n{\n", uid, gid)); // // try the passwd file, // otherwise default to something sensable // struct passwd *pw = getpwuid_cached(user_id); if (pw) { 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; } else { login_name = nstring::format("uid %d", user_id); home = "/"; login_full_name = login_name; } // // try the group file, // otherwise default to something sensable // struct group *gr = getgrgid_cached(group_id); if (!gr) group_name = nstring::format("gid %d", group_id); else group_name = gr->gr_name; trace(("}\n")); }