perf tools: Introduce perf_target__strerror()
[linux-2.6-microblaze.git] / tools / perf / util / target.c
index 02a6bed..1064d5b 100644 (file)
@@ -10,6 +10,7 @@
 #include "debug.h"
 
 #include <pwd.h>
+#include <string.h>
 
 
 enum perf_target_errno perf_target__validate(struct perf_target *target)
@@ -89,3 +90,53 @@ enum perf_target_errno perf_target__parse_uid(struct perf_target *target)
        target->uid = result->pw_uid;
        return PERF_ERRNO_TARGET__SUCCESS;
 }
+
+/*
+ * This must have a same ordering as the enum perf_target_errno.
+ */
+static const char *perf_target__error_str[] = {
+       "PID/TID switch overriding CPU",
+       "PID/TID switch overriding UID",
+       "UID switch overriding CPU",
+       "PID/TID switch overriding SYSTEM",
+       "UID switch overriding SYSTEM",
+       "Invalid User: %s",
+       "Problems obtaining information for user %s",
+};
+
+int perf_target__strerror(struct perf_target *target, int errnum,
+                         char *buf, size_t buflen)
+{
+       int idx;
+       const char *msg;
+
+       if (errnum >= 0) {
+               strerror_r(errnum, buf, buflen);
+               return 0;
+       }
+
+       if (errnum <  __PERF_ERRNO_TARGET__START ||
+           errnum >= __PERF_ERRNO_TARGET__END)
+               return -1;
+
+       idx = errnum - __PERF_ERRNO_TARGET__START;
+       msg = perf_target__error_str[idx];
+
+       switch (errnum) {
+       case PERF_ERRNO_TARGET__PID_OVERRIDE_CPU
+        ... PERF_ERRNO_TARGET__UID_OVERRIDE_SYSTEM:
+               snprintf(buf, buflen, "%s", msg);
+               break;
+
+       case PERF_ERRNO_TARGET__INVALID_UID:
+       case PERF_ERRNO_TARGET__USER_NOT_FOUND:
+               snprintf(buf, buflen, msg, target->uid_str);
+               break;
+
+       default:
+               /* cannot reach here */
+               break;
+       }
+
+       return 0;
+}