Loading commands/system/id.cpp +42 −1 Changes for commands/system/id.cpp: 42 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <iostream> #include <vector> #include <string> #include <vector> #include <pwd.h> #include <grp.h> #include <unistd.h> Loading Loading @@ -56,7 +58,46 @@ namespace fresh { namespace cmd { std::cout << "(" << ids::groupName(id) << ")"; } int runCommand(int,const char **){ // id USER: the user's ids and groups from the databases static int showAccount(const char *name){ uid_r_t uid; if(!ids::parseUser(name,uid)){ std::cerr << "id: " << name << ": no such user" << std::endl; return 1; } struct passwd_id_r *pw=getpwuid_id_r(&uid); if(!pw){ std::cerr << "id: " << name << ": no such user" << std::endl; return 1; } std::string user=pw->pw_name; gid_r_t gid=pw->pw_gid; showUser("uid=",uid); showGroup(" gid=",gid); std::vector<gid_r_t> groups{gid}; setgrent_id_r(); while(struct group_id_r *gr=getgrent_id_r()){ bool member=false; for(char **m=gr->gr_mem; m && *m; ++m) if(user==*m) member=true; bool have=false; for(auto &g: groups) if(uid_r_eq(&g,&gr->gr_gid)) have=true; if(member && !have) groups.push_back(gr->gr_gid); } endgrent_id_r(); for(size_t i=0;i<groups.size();++i) showGroup(i ? "," : " groups=",groups[i]); std::cout << std::endl; return 0; } int runCommand(int argc,const char **argv){ if(argc>2){ std::cerr << "usage: id [user]" << std::endl; return 2; } if(argc==2) return showAccount(argv[1]); uid_r_t uid=ids::ruid(),euid=ids::euid(); gid_r_t gid=ids::rgid(),egid=ids::egid(); Loading Loading
commands/system/id.cpp +42 −1 Changes for commands/system/id.cpp: 42 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <iostream> #include <vector> #include <string> #include <vector> #include <pwd.h> #include <grp.h> #include <unistd.h> Loading Loading @@ -56,7 +58,46 @@ namespace fresh { namespace cmd { std::cout << "(" << ids::groupName(id) << ")"; } int runCommand(int,const char **){ // id USER: the user's ids and groups from the databases static int showAccount(const char *name){ uid_r_t uid; if(!ids::parseUser(name,uid)){ std::cerr << "id: " << name << ": no such user" << std::endl; return 1; } struct passwd_id_r *pw=getpwuid_id_r(&uid); if(!pw){ std::cerr << "id: " << name << ": no such user" << std::endl; return 1; } std::string user=pw->pw_name; gid_r_t gid=pw->pw_gid; showUser("uid=",uid); showGroup(" gid=",gid); std::vector<gid_r_t> groups{gid}; setgrent_id_r(); while(struct group_id_r *gr=getgrent_id_r()){ bool member=false; for(char **m=gr->gr_mem; m && *m; ++m) if(user==*m) member=true; bool have=false; for(auto &g: groups) if(uid_r_eq(&g,&gr->gr_gid)) have=true; if(member && !have) groups.push_back(gr->gr_gid); } endgrent_id_r(); for(size_t i=0;i<groups.size();++i) showGroup(i ? "," : " groups=",groups[i]); std::cout << std::endl; return 0; } int runCommand(int argc,const char **argv){ if(argc>2){ std::cerr << "usage: id [user]" << std::endl; return 2; } if(argc==2) return showAccount(argv[1]); uid_r_t uid=ids::ruid(),euid=ids::euid(); gid_r_t gid=ids::rgid(),egid=ids::egid(); Loading