git.fiddlerwoaroof.com
user.cc
717259b5
 #include <memory>
55259c47
 #include <vector>
 #include <string>
 #include <pwd.h>
9a0bfcb2
 #include <unistd.h>
717259b5
 #include <iostream>
 
 #include "user.h"
9a0bfcb2
 #include "test_support.h"
55259c47
 
b017a4d2
 user::user (struct passwd *sys_info) : info (sys_info)
cdf7fd74
 {
55259c47
 }
 
cdf7fd74
 std::string user::home_directory()
 {
55259c47
     return info->pw_dir;
 }
 
9a0bfcb2
 // concrete user implementation
 
cdf7fd74
 class concrete_user : public user
 {
 private:
     std::vector<char> buffer_;
     std::shared_ptr<struct passwd> store_;
 public:
b017a4d2
     concrete_user (const std::vector<char> &buffer,
                    const std::shared_ptr<struct passwd> &store);
9a0bfcb2
 };
 
b017a4d2
 concrete_user::concrete_user (const std::vector<char> &buffer,
                               const std::shared_ptr<struct passwd> &store) :
     buffer_ (buffer),
     store_ (store),
     user (store.get())
cdf7fd74
 {
9a0bfcb2
 }
 
b017a4d2
 const std::shared_ptr<user> create_user (const std::string &user_name)
cdf7fd74
 {
b017a4d2
     std::vector<char> buffer (sysconf (_SC_GETPW_R_SIZE_MAX));
     std::shared_ptr<struct passwd> sys_passwd (new struct passwd);
     struct passwd *found_passwd (0);
9a0bfcb2
 
b017a4d2
     getpwnam_r (user_name.c_str(), sys_passwd.get(), buffer.data(),
                 buffer.size(), &found_passwd);
9a0bfcb2
 
717259b5
     std::shared_ptr<user> rval;
b017a4d2
 
717259b5
     if (found_passwd) {
b017a4d2
         rval.reset (new concrete_user (buffer, sys_passwd));
717259b5
     }
b017a4d2
 
717259b5
     return rval;
9a0bfcb2
 }