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