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 | } |