|
@@ -19,45 +19,64 @@
|
|
|
|
|
|
static char auxv[4096];
|
|
|
|
|
|
-void *get_auxv_entry(int type)
|
|
|
+int read_auxv(char *buf, ssize_t buf_size)
|
|
|
{
|
|
|
- ElfW(auxv_t) *p;
|
|
|
- void *result;
|
|
|
ssize_t num;
|
|
|
- int fd;
|
|
|
+ int rc, fd;
|
|
|
|
|
|
fd = open("/proc/self/auxv", O_RDONLY);
|
|
|
if (fd == -1) {
|
|
|
perror("open");
|
|
|
- return NULL;
|
|
|
+ return -errno;
|
|
|
}
|
|
|
|
|
|
- result = NULL;
|
|
|
-
|
|
|
- num = read(fd, auxv, sizeof(auxv));
|
|
|
+ num = read(fd, buf, buf_size);
|
|
|
if (num < 0) {
|
|
|
perror("read");
|
|
|
+ rc = -EIO;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (num > sizeof(auxv)) {
|
|
|
- printf("Overflowed auxv buffer\n");
|
|
|
+ if (num > buf_size) {
|
|
|
+ printf("overflowed auxv buffer\n");
|
|
|
+ rc = -EOVERFLOW;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ rc = 0;
|
|
|
+out:
|
|
|
+ close(fd);
|
|
|
+ return rc;
|
|
|
+}
|
|
|
+
|
|
|
+void *find_auxv_entry(int type, char *auxv)
|
|
|
+{
|
|
|
+ ElfW(auxv_t) *p;
|
|
|
+
|
|
|
p = (ElfW(auxv_t) *)auxv;
|
|
|
|
|
|
while (p->a_type != AT_NULL) {
|
|
|
- if (p->a_type == type) {
|
|
|
- result = (void *)p->a_un.a_val;
|
|
|
- break;
|
|
|
- }
|
|
|
+ if (p->a_type == type)
|
|
|
+ return p;
|
|
|
|
|
|
p++;
|
|
|
}
|
|
|
-out:
|
|
|
- close(fd);
|
|
|
- return result;
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+void *get_auxv_entry(int type)
|
|
|
+{
|
|
|
+ ElfW(auxv_t) *p;
|
|
|
+
|
|
|
+ if (read_auxv(auxv, sizeof(auxv)))
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ p = find_auxv_entry(type, auxv);
|
|
|
+ if (p)
|
|
|
+ return (void *)p->a_un.a_val;
|
|
|
+
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
int pick_online_cpu(void)
|