|
@@ -20,6 +20,7 @@
|
|
|
*/
|
|
|
#define _GNU_SOURCE
|
|
|
#include <dirent.h>
|
|
|
+#include <mntent.h>
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
#include <string.h>
|
|
@@ -103,28 +104,28 @@ static const char *find_debugfs(void)
|
|
|
{
|
|
|
static char debugfs[MAX_PATH+1];
|
|
|
static int debugfs_found;
|
|
|
- char type[100];
|
|
|
FILE *fp;
|
|
|
+ struct mntent *m;
|
|
|
|
|
|
if (debugfs_found)
|
|
|
return debugfs;
|
|
|
|
|
|
- if ((fp = fopen("/proc/mounts","r")) == NULL)
|
|
|
+ fp = setmntent("/proc/mounts", "r");
|
|
|
+ if (!fp)
|
|
|
die("Can't open /proc/mounts for read");
|
|
|
|
|
|
- while (fscanf(fp, "%*s %"
|
|
|
- STR(MAX_PATH)
|
|
|
- "s %99s %*s %*d %*d\n",
|
|
|
- debugfs, type) == 2) {
|
|
|
- if (strcmp(type, "debugfs") == 0)
|
|
|
+ while ((m = getmntent(fp)) != NULL) {
|
|
|
+ if (strcmp(m->mnt_type, "debugfs") == 0) {
|
|
|
+ strcpy(debugfs, m->mnt_dir);
|
|
|
+ debugfs_found = 1;
|
|
|
break;
|
|
|
+ }
|
|
|
}
|
|
|
- fclose(fp);
|
|
|
|
|
|
- if (strcmp(type, "debugfs") != 0)
|
|
|
- die("debugfs not mounted, please mount");
|
|
|
+ endmntent(fp);
|
|
|
|
|
|
- debugfs_found = 1;
|
|
|
+ if (!debugfs_found)
|
|
|
+ die("debugfs not mounted, please mount");
|
|
|
|
|
|
return debugfs;
|
|
|
}
|
|
@@ -317,7 +318,8 @@ static void copy_event_system(const char *sys, struct tracepoint_path *tps)
|
|
|
die("can't read directory '%s'", sys);
|
|
|
|
|
|
while ((dent = readdir(dir))) {
|
|
|
- if (strcmp(dent->d_name, ".") == 0 ||
|
|
|
+ if (dent->d_type != DT_DIR ||
|
|
|
+ strcmp(dent->d_name, ".") == 0 ||
|
|
|
strcmp(dent->d_name, "..") == 0 ||
|
|
|
!name_in_tp_list(dent->d_name, tps))
|
|
|
continue;
|
|
@@ -334,7 +336,8 @@ static void copy_event_system(const char *sys, struct tracepoint_path *tps)
|
|
|
|
|
|
rewinddir(dir);
|
|
|
while ((dent = readdir(dir))) {
|
|
|
- if (strcmp(dent->d_name, ".") == 0 ||
|
|
|
+ if (dent->d_type != DT_DIR ||
|
|
|
+ strcmp(dent->d_name, ".") == 0 ||
|
|
|
strcmp(dent->d_name, "..") == 0 ||
|
|
|
!name_in_tp_list(dent->d_name, tps))
|
|
|
continue;
|
|
@@ -394,26 +397,21 @@ static void read_event_files(struct tracepoint_path *tps)
|
|
|
die("can't read directory '%s'", path);
|
|
|
|
|
|
while ((dent = readdir(dir))) {
|
|
|
- if (strcmp(dent->d_name, ".") == 0 ||
|
|
|
+ if (dent->d_type != DT_DIR ||
|
|
|
+ strcmp(dent->d_name, ".") == 0 ||
|
|
|
strcmp(dent->d_name, "..") == 0 ||
|
|
|
strcmp(dent->d_name, "ftrace") == 0 ||
|
|
|
!system_in_tp_list(dent->d_name, tps))
|
|
|
continue;
|
|
|
- sys = malloc_or_die(strlen(path) + strlen(dent->d_name) + 2);
|
|
|
- sprintf(sys, "%s/%s", path, dent->d_name);
|
|
|
- ret = stat(sys, &st);
|
|
|
- free(sys);
|
|
|
- if (ret < 0)
|
|
|
- continue;
|
|
|
- if (S_ISDIR(st.st_mode))
|
|
|
- count++;
|
|
|
+ count++;
|
|
|
}
|
|
|
|
|
|
write_or_die(&count, 4);
|
|
|
|
|
|
rewinddir(dir);
|
|
|
while ((dent = readdir(dir))) {
|
|
|
- if (strcmp(dent->d_name, ".") == 0 ||
|
|
|
+ if (dent->d_type != DT_DIR ||
|
|
|
+ strcmp(dent->d_name, ".") == 0 ||
|
|
|
strcmp(dent->d_name, "..") == 0 ||
|
|
|
strcmp(dent->d_name, "ftrace") == 0 ||
|
|
|
!system_in_tp_list(dent->d_name, tps))
|
|
@@ -422,10 +420,8 @@ static void read_event_files(struct tracepoint_path *tps)
|
|
|
sprintf(sys, "%s/%s", path, dent->d_name);
|
|
|
ret = stat(sys, &st);
|
|
|
if (ret >= 0) {
|
|
|
- if (S_ISDIR(st.st_mode)) {
|
|
|
- write_or_die(dent->d_name, strlen(dent->d_name) + 1);
|
|
|
- copy_event_system(sys, tps);
|
|
|
- }
|
|
|
+ write_or_die(dent->d_name, strlen(dent->d_name) + 1);
|
|
|
+ copy_event_system(sys, tps);
|
|
|
}
|
|
|
free(sys);
|
|
|
}
|