Changeset 57916 in vbox for trunk/src/VBox/Runtime/r3/posix/process-posix.cpp
- Timestamp:
- Sep 27, 2015 8:36:38 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 102888
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/posix/process-posix.cpp
r57358 r57916 159 159 160 160 161 RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser, 162 size_t *pcbUser) 161 RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUser, size_t *pcbUser) 163 162 { 164 163 AssertReturn( (pszUser && cbUser > 0) 165 164 || (!pszUser && !cbUser), VERR_INVALID_PARAMETER); 166 167 if (hProcess != RTProcSelf()) 168 return VERR_NOT_SUPPORTED; 169 170 int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX); 171 if (cbPwdMax == -1) 172 return RTErrConvertFromErrno(errno); 173 174 char *pbBuf = (char *)RTMemAllocZ(cbPwdMax); 175 if (!pbBuf) 176 return VERR_NO_MEMORY; 177 178 struct passwd Pwd, *pPwd; 179 int rc = getpwuid_r(geteuid(), &Pwd, pbBuf, cbPwdMax, &pPwd); 180 if (!rc) 181 { 182 size_t cbPwdUser = strlen(pPwd->pw_name) + 1; 183 184 if (pcbUser) 185 *pcbUser = cbPwdUser; 186 187 if (cbPwdUser > cbUser) 188 rc = VERR_BUFFER_OVERFLOW; 189 else 165 AssertReturn(pcbUser || pszUser, VERR_INVALID_PARAMETER); 166 167 int rc; 168 if ( hProcess == NIL_RTPROCESS 169 || hProcess == RTProcSelf()) 170 { 171 /* 172 * Figure a good buffer estimate. 173 */ 174 int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX); 175 if (cbPwdMax <= sizeof(_1K)) 176 cbPwdMax = _1K; 177 else 178 AssertStmt(cbPwdMax <= 32U*_1M, cbPwdMax = 32U*_1M); 179 char *pchBuf = (char *)RTMemTmpAllocZ(cbPwdMax); 180 if (pbBuf) 190 181 { 191 /** @todo this needs to be UTF-8 checked or converted... */ 192 memcpy(pszUser, pPwd->pw_name, cbPwdUser); 193 rc = VINF_SUCCESS; 182 /* 183 * Get the password file entry. 184 */ 185 struct passwd Pwd; 186 struct passwd *pPwd = NULL; 187 rc = getpwuid_r(geteuid(), &Pwd, pchBuf, cbPwdMax, &pPwd); 188 if (!rc) 189 { 190 /* 191 * Convert the name to UTF-8, assuming that we're getting it in the local codeset. 192 */ 193 /** @todo This isn't exactly optimal... the current codeset/page conversion 194 * stuff never was. Should optimize that for UTF-8 and ASCII one day. 195 * And also optimize for avoiding heap. */ 196 char *pszTmp = NULL; 197 rc = RTStrCurrentCPToUtf8(&pszTmp, pPwd->pw_name); 198 if (RT_SUCCESS(rc)) 199 { 200 size_t cbTmp = strlen(pszTmp) + 1; 201 if (pcbUser) 202 *pcbUser = cbTmp; 203 if (cbPwdUser <= cbUser) 204 { 205 memcpy(pszUser, pszTmp, cbTmp); 206 rc = VINF_SUCCESS; 207 } 208 else 209 rc = VERR_BUFFER_OVERFLOW; 210 RTStrFree(pszTmp); 211 } 212 } 213 else 214 rc = RTErrConvertFromErrno(rc); 215 RTMemFree(pchBuf); 194 216 } 217 else 218 rc = VERR_NO_TMP_MEMORY; 195 219 } 196 220 else 197 rc = RTErrConvertFromErrno(rc); 198 199 RTMemFree(pbBuf); 221 rc = VERR_NOT_SUPPORTED; 200 222 return rc; 201 223 } 202 224 225 226 RTR3DECL(int) RTProcQueryUsernameA(RTPROCESS hProcess, char **ppszUser) 227 { 228 AssertPtrReturn(ppszUser, VERR_INVALID_POINTER); 229 230 int rc; 231 if ( hProcess == NIL_RTPROCESS 232 || hProcess == RTProcSelf()) 233 { 234 /* 235 * Figure a good buffer estimate. 236 */ 237 int32_t cbPwdMax = sysconf(_SC_GETPW_R_SIZE_MAX); 238 if (cbPwdMax <= sizeof(_1K)) 239 cbPwdMax = _1K; 240 else 241 AssertStmt(cbPwdMax <= 32U*_1M, cbPwdMax = 32U*_1M); 242 char *pchBuf = (char *)RTMemTmpAllocZ(cbPwdMax); 243 if (pbBuf) 244 { 245 /* 246 * Get the password file entry. 247 */ 248 struct passwd Pwd; 249 struct passwd *pPwd = NULL; 250 rc = getpwuid_r(geteuid(), &Pwd, pchBuf, cbPwdMax, &pPwd); 251 if (!rc) 252 { 253 /* 254 * Convert the name to UTF-8, assuming that we're getting it in the local codeset. 255 */ 256 rc = RTStrCurrentCPToUtf8(ppszUser, pPwd->pw_name); 257 } 258 else 259 rc = RTErrConvertFromErrno(rc); 260 RTMemFree(pchBuf); 261 } 262 else 263 rc = VERR_NO_TMP_MEMORY; 264 } 265 else 266 rc = VERR_NOT_SUPPORTED; 267 return rc; 268 } 269
Note:
See TracChangeset
for help on using the changeset viewer.