Change the debugfs_locate_mpoint function to be nicer and more
efficient.
Another effect is that fixes a segmentation fault when calling powerdebug --dump

Signed-off-by: Daniel Lezcano <daniel.lezc...@free.fr>
---
 clocks.c     |   68 +++++++++++++++++++++++++--------------------------------
 clocks.h     |    7 ------
 powerdebug.h |    1 -
 3 files changed, 30 insertions(+), 46 deletions(-)

diff --git a/clocks.c b/clocks.c
index c42f589..ff79235 100644
--- a/clocks.c
+++ b/clocks.c
@@ -13,6 +13,9 @@
  *       - initial API and implementation
  
*******************************************************************************/
 
+#include <stdio.h>
+#include <mntent.h>
+
 #include "powerdebug.h"
 #include "clocks.h"
 
@@ -20,14 +23,36 @@ static char clk_dir_path[PATH_MAX];
 static char clk_name[NAME_MAX];
 static int  bold[MAX_LINES];
 
+static int locate_debugfs(char *clk_path)
+{
+       const char *mtab = "/proc/mounts";
+       struct mntent *mntent;
+       int ret = -1;
+       FILE *file = NULL;
+
+       file = setmntent(mtab, "r");
+       if (!file)
+               return -1;
+
+       while ((mntent = getmntent(file))) {
+
+               if (strcmp(mntent->mnt_type, "debugfs"))
+                       continue;
+
+               strcpy(clk_path, mntent->mnt_dir);
+               ret = 0;
+               break;
+       }
+
+       fclose(file);
+       return ret;
+}
+
 int init_clock_details(bool dump, int selectedwindow)
 {
-       char *path = debugfs_locate_mpoint();
        struct stat buf;
 
-       if (path)
-               strcpy(clk_dir_path, path);
-       else {
+       if (locate_debugfs(clk_dir_path)) {
                if (!dump) {
                        create_selectedwindow(selectedwindow);
                        sprintf(clock_lines[0], "Unable to locate debugfs "
@@ -43,6 +68,7 @@ int init_clock_details(bool dump, int selectedwindow)
                        exit(1);
                }
        }
+
        sprintf(clk_dir_path, "%s/clock", clk_dir_path);
        //strcpy(clk_dir_path, "/debug/clock"); // Hardcoded for testing..
        if (stat(clk_dir_path, &buf)) {
@@ -539,37 +565,3 @@ void dump_clock_info(struct clock_info *clk, int level, 
int bmp)
                }
        }
 }
-
-char *debugfs_locate_mpoint(void)
-{
-       int ret;
-       FILE *filep;
-       char **path;
-       char fsname[64];
-       struct statfs sfs;
-
-       path = likely_mpoints;
-       while (*path) {
-               ret = statfs(*path, &sfs);
-               if (ret >= 0 && sfs.f_type == (long)DEBUGFS_MAGIC)
-                       return *path;
-               path++;
-       }
-
-       filep = fopen("/proc/mounts", "r");
-       if (filep == NULL) {
-               fprintf(stderr, "powerdebug: Error opening /proc/mounts.");
-               exit(1);
-       }
-
-       while (fscanf(filep, "%*s %s %s %*s %*d %*d\n",
-                       debugfs_mntpoint, fsname) == 2)
-               if (!strcmp(fsname, "debugfs"))
-                       break;
-       fclose(filep);
-
-       if (strcmp(fsname, "debugfs"))
-               return NULL;
-
-       return debugfs_mntpoint;
-}
diff --git a/clocks.h b/clocks.h
index 4b176d0..dd9216a 100644
--- a/clocks.h
+++ b/clocks.h
@@ -36,17 +36,10 @@ struct clock_info {
        struct clock_info **children;
 } *clocks_info;
 
-char debugfs_mntpoint[1024];
 char clock_lines[MAX_LINES][128];
 int  clock_line_no;
 int  old_clock_line_no;
 
-char *likely_mpoints[] = {
-       "/sys/kernel/debug",
-       "/debug",
-       NULL
-};
-
 void add_clock_details_recur(struct clock_info *clk, int hrow, int selected);
 void destroy_clocks_info(void);
 void destroy_clocks_info_recur(struct clock_info *clock);
diff --git a/powerdebug.h b/powerdebug.h
index d2bd4ec..f424c1f 100644
--- a/powerdebug.h
+++ b/powerdebug.h
@@ -42,7 +42,6 @@ extern void print_string_val(char *name, char *val);
 extern int  init_clock_details(bool dump, int selectedwindow);
 extern void print_clock_header(void);
 extern void print_one_clock(int line, char *str, int bold, int highlight);
-extern char *debugfs_locate_mpoint(void);
 
 extern void get_sensor_info(char *path, char *name, char *sensor, int verbose);
 extern int  read_and_print_sensor_info(int verbose);
-- 
1.7.1


_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to