Commit 5c80c62c authored by jan.koester's avatar jan.koester
Browse files

test

parent a5bc57e4
Loading
Loading
Loading
Loading
+42 −1
Changes for commands/system/id.cpp: 42 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -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>
@@ -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();