DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
User.cpp
Go to the documentation of this file.
1/*
2 * User.cxx
3 * OksSystem
4 *
5 * Created by Matthias Wiesmann on 03.02.05.
6 * Copyright 2005 CERN. All rights reserved.
7 *
8 */
9
10#include <pwd.h>
11
12#include <iostream>
13#include <sstream>
14
15#include "ers/ers.hpp"
16
17#include "okssystem/User.hpp"
19
21
23 m_user_id = ::getuid();
24} // User
25
26OksSystem::User::User(uid_t user_id) throw() {
27 m_user_id = user_id;
28} // User
29
30OksSystem::User::User(const std::string &s_name) {
31
32 errno = 0;
33 long bufSize = ::sysconf(_SC_GETPW_R_SIZE_MAX);
34
35 if(bufSize == -1) {
36 if(errno == 0) {
37 bufSize = 1024;
38 } else {
39 std::string message = "with argument _SC_GETPW_R_SIZE_MAX while getting info about user " + s_name;
40 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "sysconf", message.c_str());
41 }
42 }
43
44 struct passwd pwd;
45 struct passwd *result;
46 char* buf = new char[bufSize];
47 errno = 0;
48 int res = ::getpwnam_r(s_name.c_str(), &pwd, buf, bufSize, &result);
49 if(res == 0) {
50 if(result != 0) {
51 m_user_id = result->pw_uid;
52 } else {
53 delete[] buf;
54 std::string eMsg = "User " + s_name + " not found";
55 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "getpwnam_r", eMsg.c_str());
56 }
57 } else {
58 delete[] buf;
59 std::string message = "while getting info about user " + s_name;
60 throw OksSystem::OksSystemCallIssue(ERS_HERE, res, "getpwnam_r", message.c_str());
61 }
62 delete[] buf;
63
64 m_user_name = s_name;
65} // User
66
67OksSystem::User::User(const User &other) throw() {
68 m_user_id = other.m_user_id;
69 m_user_name = other.m_user_name;
70} // User
71
72// Operators
73// =========
74
75
76OksSystem::User::operator uid_t() const throw() {
77 return m_user_id;
78} // uid_t
79
80OksSystem::User::operator std::string() const {
81 return name();
82} // string
83
84OksSystem::User::operator const char *() const {
85 if (m_user_name.empty()) { resolve();}
86 return m_user_name.c_str();
87} // char*
88
89// Methods
90// =========
91
96uid_t OksSystem::User::identity() const throw() {
97 return m_user_id;
98} // identity
99
107
108 errno = 0;
109 long bufSize = ::sysconf(_SC_GETPW_R_SIZE_MAX);
110
111 if(bufSize == -1) {
112 if(errno == 0) {
113 bufSize = 1024;
114 } else {
115 std::ostringstream message;
116 message << "with argument _SC_GETPW_R_SIZE_MAX while getting info about user with id " << m_user_id;
117 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "sysconf", message.str().c_str());
118 }
119 }
120
121 struct passwd pwd;
122 struct passwd *result;
123 char* buf = new char[bufSize];
124 errno = 0;
125 int res = ::getpwuid_r(m_user_id, &pwd, buf, bufSize, &result);
126 if(res == 0) {
127 if(result != 0) {
128 m_user_name = std::string(result->pw_name);
129 m_user_home = std::string(result->pw_dir);
130 m_user_real_name = std::string(result->pw_gecos);
131 } else {
132 delete[] buf;
133 std::ostringstream eMsg;
134 eMsg << "User " << m_user_id << " not found";
135 throw OksSystem::OksSystemCallIssue(ERS_HERE, errno, "getpwuid_r", eMsg.str().c_str());
136 }
137 } else {
138 delete[] buf;
139 std::ostringstream message;
140 message << "while getting info about user with id " << m_user_id;
141 throw OksSystem::OksSystemCallIssue(ERS_HERE, res, "getpwnam_r", message.str().c_str());
142 }
143 delete[] buf;
144
145} //
146
152void OksSystem::User::resolve_safe() const throw() {
153
154 errno = 0;
155 long bufSize = ::sysconf(_SC_GETPW_R_SIZE_MAX);
156
157 if(bufSize == -1) {
158 if(errno == 0) {
159 bufSize = 1024;
160 } else {
161 m_user_name = "unknown";
162 m_user_home = "unknown";
163 m_user_real_name = "unknown";
164 return;
165 }
166 }
167
168 struct passwd pwd;
169 struct passwd *result;
170 char* buf = new char[bufSize];
171 int res = ::getpwuid_r(m_user_id, &pwd, buf, bufSize, &result);
172 if(res == 0) {
173 if(result != 0) {
174 m_user_name = std::string(result->pw_name);
175 m_user_home = std::string(result->pw_dir);
176 m_user_real_name = std::string(result->pw_gecos);
177 } else {
178 m_user_name = "unknown";
179 m_user_home = "unknown";
180 m_user_real_name = "unknown";
181 }
182 } else {
183 m_user_name = "unknown";
184 m_user_home = "unknown";
185 m_user_real_name = "unknown";
186 }
187 delete[] buf;
188
189} // resolve_safe
190
195const std::string & OksSystem::User::name() const {
196 if (m_user_name.empty()) { resolve();}
197 return m_user_name;
198} // name
199
204const std::string & OksSystem::User::name_safe() const throw() {
205 if (m_user_name.empty()) { resolve_safe(); }
206 return m_user_name;
207} // name
208
213const std::string & OksSystem::User::home() const {
214 if (m_user_home.empty()) { resolve();}
215 return m_user_home;
216} // home
217
222const std::string & OksSystem::User::real_name() const {
223 if (m_user_real_name.empty()) { resolve();}
224 return m_user_real_name;
225} // real_name
226
233 const int status = ::setuid(m_user_id);
234 if (status<0) {
235 std::ostringstream message;
236 message << "while setting the effective user ID to " << m_user_id << "(" << this->name_safe() << ")";
237 throw OksSystem::OksSystemCallIssue( ERS_HERE, errno, "setuid", message.str().c_str() );
238 }
239} // setuid
240
241
248std::ostream& operator<<(std::ostream& stream, const OksSystem::User& user) throw() {
249 unsigned int i = (unsigned int) user.identity();
250 const std::string name = user.name_safe();
251 stream << name << '(' << i << ')';
252 return stream;
253} // operator<<
254
261bool operator ==(const OksSystem::User &a, const OksSystem::User &b) throw() {
262 return a.identity() == b.identity();
263} //
264
271bool operator !=(const OksSystem::User &a, const OksSystem::User &b) throw() {
272 return a.identity() != b.identity();
273} //
274
275
std::ostream & operator<<(std::ostream &stream, const OksSystem::File &file)
Definition File.cpp:852
#define ERS_HERE
void resolve() const
resolve information from user-id
Definition User.cpp:106
void resolve_safe() const
resolve without throwing exceptions
Definition User.cpp:152
static const User ROOT
constant for root user
Definition User.hpp:35
const std::string & name() const
username
Definition User.cpp:195
uid_t identity() const
user-id
Definition User.cpp:96
const std::string & home() const
home directory name
Definition User.cpp:213
const std::string & real_name() const
real name
Definition User.cpp:222
uid_t m_user_id
the actual user id
Definition User.hpp:28
const std::string & name_safe() const
username - no exception
Definition User.cpp:204
void setuid() const
tries to set the uid of current process
Definition User.cpp:232
User()
constructor for current user
Definition User.cpp:22
bool operator!=(const Host &a, const Host &b)
inequality operator
Definition Host.cpp:183
bool operator==(const Host &a, const Host &b)
equality operator
Definition Host.cpp:179