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