perf_target__validate(&rec->opts.target);
 
-       rec->opts.target.uid = parse_target_uid(rec->opts.target.uid_str);
-       if (rec->opts.target.uid_str != NULL &&
-           rec->opts.target.uid == UINT_MAX - 1)
+       if (perf_target__parse_uid(&rec->opts.target) < 0)
                goto out_free_fd;
 
        if (perf_evlist__create_maps(evsel_list, &rec->opts.target) < 0)
 
 
        perf_target__validate(&top.target);
 
-       top.target.uid = parse_target_uid(top.target.uid_str);
-       if (top.target.uid_str != NULL && top.target.uid == UINT_MAX - 1)
+       if (perf_target__parse_uid(&top.target) < 0)
                goto out_delete_evlist;
 
        if (top.target.tid == 0 && top.target.pid == 0 &&
 
 #include "target.h"
 #include "debug.h"
 
+#include <pwd.h>
+
 
 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;
+}
 
        PERF_ERRNO_TARGET__PID_OVERRIDE_SYSTEM,
        PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM,
 
+       /* for perf_target__parse_uid() */
+       PERF_ERRNO_TARGET__INVALID_UID,
+       PERF_ERRNO_TARGET__USER_NOT_FOUND,
+
        __PERF_ERRNO_TARGET__END,
 };
 
 enum perf_target_errno perf_target__validate(struct perf_target *target);
+enum perf_target_errno perf_target__parse_uid(struct perf_target *target);
 
 #endif /* _PERF_TARGET_H */
 
        warn_routine(warn, params);
        va_end(params);
 }
-
-uid_t parse_target_uid(const char *str)
-{
-       struct passwd pwd, *result;
-       char buf[1024];
-
-       if (str == NULL)
-               return UINT_MAX;
-
-       getpwnam_r(str, &pwd, buf, sizeof(buf), &result);
-
-       if (result == NULL) {
-               char *endptr;
-               int uid = strtol(str, &endptr, 10);
-
-               if (*endptr != '\0') {
-                       ui__error("Invalid user %s\n", str);
-                       return UINT_MAX - 1;
-               }
-
-               getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
-
-               if (result == NULL) {
-                       ui__error("Problems obtaining information for user %s\n",
-                                 str);
-                       return UINT_MAX - 1;
-               }
-       }
-
-       return result->pw_uid;
-}
 
 #include <netinet/tcp.h>
 #include <arpa/inet.h>
 #include <netdb.h>
-#include <pwd.h>
 #include <inttypes.h>
 #include "../../../include/linux/magic.h"
 #include "types.h"
 
 void event_attr_init(struct perf_event_attr *attr);
 
-uid_t parse_target_uid(const char *str);
-
 #define _STR(x) #x
 #define STR(x) _STR(x)