Replace all uses of strerror() by ovs_strerror(), for thread safety.
[sliver-openvswitch.git] / vswitchd / system-stats.c
index f679516..f0f53c0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012 Nicira, Inc.
+/* Copyright (c) 2010, 2012, 2013 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -97,7 +97,11 @@ get_memory_stats(struct smap *stats)
 {
     if (!LINUX_DATAPATH) {
         unsigned int pagesize = get_page_size();
+#ifdef _SC_PHYS_PAGES
         long int phys_pages = sysconf(_SC_PHYS_PAGES);
+#else
+        long int phys_pages = 0;
+#endif
 #ifdef _SC_AVPHYS_PAGES
         long int avphys_pages = sysconf(_SC_AVPHYS_PAGES);
 #else
@@ -127,7 +131,8 @@ get_memory_stats(struct smap *stats)
 
         stream = fopen(file_name, "r");
         if (!stream) {
-            VLOG_WARN_ONCE("%s: open failed (%s)", file_name, strerror(errno));
+            VLOG_WARN_ONCE("%s: open failed (%s)",
+                           file_name, ovs_strerror(errno));
             return;
         }
 
@@ -179,7 +184,8 @@ get_boot_time(void)
 
         stream = fopen(stat_file, "r");
         if (!stream) {
-            VLOG_ERR_ONCE("%s: open failed (%s)", stat_file, strerror(errno));
+            VLOG_ERR_ONCE("%s: open failed (%s)",
+                          stat_file, ovs_strerror(errno));
             return boot_time;
         }
 
@@ -238,7 +244,8 @@ get_raw_process_info(pid_t pid, struct raw_process_info *raw)
     sprintf(file_name, "/proc/%lu/stat", (unsigned long int) pid);
     stream = fopen(file_name, "r");
     if (!stream) {
-        VLOG_ERR_ONCE("%s: open failed (%s)", file_name, strerror(errno));
+        VLOG_ERR_ONCE("%s: open failed (%s)",
+                      file_name, ovs_strerror(errno));
         return false;
     }
 
@@ -323,13 +330,13 @@ count_crashes(pid_t pid)
     sprintf(file_name, "/proc/%lu/cmdline", (unsigned long int) pid);
     stream = fopen(file_name, "r");
     if (!stream) {
-        VLOG_WARN_ONCE("%s: open failed (%s)", file_name, strerror(errno));
+        VLOG_WARN_ONCE("%s: open failed (%s)", file_name, ovs_strerror(errno));
         goto exit;
     }
 
     if (!fgets(line, sizeof line, stream)) {
         VLOG_WARN_ONCE("%s: read failed (%s)", file_name,
-                       feof(stream) ? "end of file" : strerror(errno));
+                       feof(stream) ? "end of file" : ovs_strerror(errno));
         goto exit_close;
     }
 
@@ -394,7 +401,8 @@ get_process_stats(struct smap *stats)
 
     dir = opendir(ovs_rundir());
     if (!dir) {
-        VLOG_ERR_ONCE("%s: open failed (%s)", ovs_rundir(), strerror(errno));
+        VLOG_ERR_ONCE("%s: open failed (%s)",
+                      ovs_rundir(), ovs_strerror(errno));
         return;
     }
 
@@ -443,20 +451,22 @@ get_process_stats(struct smap *stats)
 static void
 get_filesys_stats(struct smap *stats OVS_UNUSED)
 {
-#if HAVE_SETMNTENT && HAVE_STATVFS
+#if HAVE_GETMNTENT_R && HAVE_STATVFS
     static const char file_name[] = "/etc/mtab";
+    struct mntent mntent;
     struct mntent *me;
+    char buf[4096];
     FILE *stream;
     struct ds s;
 
     stream = setmntent(file_name, "r");
     if (!stream) {
-        VLOG_ERR_ONCE("%s: open failed (%s)", file_name, strerror(errno));
+        VLOG_ERR_ONCE("%s: open failed (%s)", file_name, ovs_strerror(errno));
         return;
     }
 
     ds_init(&s);
-    while ((me = getmntent(stream)) != NULL) {
+    while ((me = getmntent_r(stream, &mntent, buf, sizeof buf)) != NULL) {
         unsigned long long int total, free;
         struct statvfs vfs;
         char *p;
@@ -490,7 +500,7 @@ get_filesys_stats(struct smap *stats OVS_UNUSED)
         smap_add(stats, "file_systems", ds_cstr(&s));
     }
     ds_destroy(&s);
-#endif  /* HAVE_SETMNTENT && HAVE_STATVFS */
+#endif  /* HAVE_GETMNTENT_R && HAVE_STATVFS */
 }
 \f
 #define SYSTEM_STATS_INTERVAL (5 * 1000) /* In milliseconds. */