|
@@ -9,6 +9,8 @@
|
|
|
#include "target.h"
|
|
|
#include "debug.h"
|
|
|
|
|
|
+#include <pwd.h>
|
|
|
+
|
|
|
|
|
|
enum perf_target_errno perf_target__validate(struct perf_target *target)
|
|
|
{
|
|
@@ -54,3 +56,36 @@ enum perf_target_errno perf_target__validate(struct perf_target *target)
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+enum perf_target_errno perf_target__parse_uid(struct perf_target *target)
|
|
|
+{
|
|
|
+ struct passwd pwd, *result;
|
|
|
+ char buf[1024];
|
|
|
+ const char *str = target->uid_str;
|
|
|
+
|
|
|
+ target->uid = UINT_MAX;
|
|
|
+ if (str == NULL)
|
|
|
+ return PERF_ERRNO_TARGET__SUCCESS;
|
|
|
+
|
|
|
+ /* Try user name first */
|
|
|
+ getpwnam_r(str, &pwd, buf, sizeof(buf), &result);
|
|
|
+
|
|
|
+ if (result == NULL) {
|
|
|
+ /*
|
|
|
+ * The user name not found. Maybe it's a UID number.
|
|
|
+ */
|
|
|
+ char *endptr;
|
|
|
+ int uid = strtol(str, &endptr, 10);
|
|
|
+
|
|
|
+ if (*endptr != '\0')
|
|
|
+ return PERF_ERRNO_TARGET__INVALID_UID;
|
|
|
+
|
|
|
+ getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
|
|
|
+
|
|
|
+ if (result == NULL)
|
|
|
+ return PERF_ERRNO_TARGET__USER_NOT_FOUND;
|
|
|
+ }
|
|
|
+
|
|
|
+ target->uid = result->pw_uid;
|
|
|
+ return PERF_ERRNO_TARGET__SUCCESS;
|
|
|
+}
|