git.fiddlerwoaroof.com
Raw Blame History
#include <memory>
#include <vector>
#include <string>
#include <pwd.h>
#include <unistd.h>
#include <iostream>

#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<char> buffer_;
    std::shared_ptr<struct passwd> store_;
public:
    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));
    std::shared_ptr<struct passwd> 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<user> rval;

    if (found_passwd) {
        rval.reset (new concrete_user (buffer, sys_passwd));
    }

    return rval;
}