#include #include #include #include #include #include #include "user.h" #include "test_support.h" user::user(struct passwd *sys_info) : info(sys_info) { } std::string user::home_directory() { return info->pw_dir; } // concrete user implementation class concrete_user : public user { private: std::vector buffer_; std::shared_ptr store_; public: concrete_user(const std::vector &buffer, const std::shared_ptr &store); }; concrete_user::concrete_user(const std::vector &buffer, const std::shared_ptr &store) : buffer_(buffer), store_(store), user(store.get()) { } const std::shared_ptr create_user(const std::string &user_name) { std::vector buffer(sysconf(_SC_GETPW_R_SIZE_MAX)); std::shared_ptr sys_passwd(new struct passwd); struct passwd *found_passwd(0); getpwnam_r(user_name.c_str(), sys_passwd.get(), buffer.data(), buffer.size(), &found_passwd); std::shared_ptr rval; if (found_passwd) { rval.reset(new concrete_user(buffer, sys_passwd)); } return rval; }