| /* |
| * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| * Distributed under the terms of the GNU General Public License v2 |
| */ |
| |
| #include <sys/utsname.h> |
| #include <ctype.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <unistd.h> |
| |
| #include <eprintf.h> |
| |
| #include "util.h" |
| |
| int release_to_int (char *r) |
| { |
| int a; |
| int b; |
| int i; |
| int c; |
| |
| for (a = 0, i = 0; i < 3; i++) { |
| for (b = 0, c = *r++; isdigit(c); c = *r++) { |
| b = (b << 4) | (c - '0'); |
| } |
| a = (a << 8) | b; |
| } |
| return a; |
| } |
| |
| int kernel_release (void) |
| { |
| struct utsname buf; |
| int rc = uname(&buf); |
| if (rc) fatal("rc=%d:", rc); |
| return release_to_int(buf.release); |
| } |
| |
| char *get_exe_path (int pid) |
| { |
| char path[100]; |
| static char name[4096]; |
| int rc; |
| |
| snprintf(path, sizeof(path), "/proc/%d/exe", pid); |
| rc = readlink(path, name, sizeof(name)); |
| if (rc == -1) { |
| return strdup("<unknown>"); |
| } |
| if (rc == sizeof(name)) { |
| fatal("pid name too long"); |
| } |
| name[rc] = '\0'; |
| |
| return strdup(name); |
| } |