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
 
 user::user(struct passwd *sys_info) : info(sys_info) {
 }
 
 std::string user::home_directory() {
     return info->pw_dir;
 }
 
9a0bfcb2
 // concrete user implementation
 
 class concrete_user : public user {
      private:
         std::vector<char> buffer_;
         std::shared_ptr<struct passwd> store_;
717259b5
      public:
9a0bfcb2
          concrete_user(const std::vector<char> &buffer, const std::shared_ptr<struct passwd> &store);
 };
 
 concrete_user::concrete_user(const std::vector<char> &buffer, const std::shared_ptr<struct passwd> &store) :
     buffer_(buffer),
     store_(store),
     user(store.get()) {
 }
 
 const std::shared_ptr<user> create_user(const std::string &user_name) {
     std::vector<char> buffer(sysconf(_SC_GETPW_R_SIZE_MAX));
717259b5
     std::shared_ptr<struct passwd> sys_passwd(new struct passwd);
9a0bfcb2
     struct passwd *found_passwd(0);
 
     getpwnam_r(user_name.c_str(), sys_passwd.get(), buffer.data(), buffer.size(), &found_passwd);
 
717259b5
     std::shared_ptr<user> rval;
     if (found_passwd) {
         rval.reset(new concrete_user(buffer, sys_passwd));
     }
     return rval;
9a0bfcb2
 }