summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--misc/getmntent.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/misc/getmntent.c b/misc/getmntent.c
new file mode 100644
index 000000000..69eb1887b
--- /dev/null
+++ b/misc/getmntent.c
@@ -0,0 +1,58 @@
+#include "miscfn.h"
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __aix__
+#define COMMENTCHAR '*'
+#else
+#define COMMENTCHAR '#'
+#endif
+
+struct mntent *getmntent(FILE *filep) {
+ static struct mntent item = { NULL };
+ char buf[1024], * start;
+ char * chptr;
+
+ if (item.mnt_dir) {
+ free(item.mnt_dir);
+ }
+
+ while (fgets(buf, sizeof(buf) - 1, filep)) {
+ /* chop off \n */
+ buf[strlen(buf) - 1] = '\0';
+
+ chptr = buf;
+ while (isspace(*chptr)) chptr++;
+
+ if (*chptr == COMMENTCHAR) continue;
+
+ #if __aix__
+ /* aix uses a screwed up file format */
+ if (*chptr == '/') {
+ start = chptr;
+ while (*chptr != ':') chptr++;
+ *chptr = '\0';
+ item.mnt_dir = strdup(start);
+ return &item;
+ }
+ #else
+ while (!isspace(*chptr) && (*chptr)) chptr++;
+ if (!*chptr) return NULL;
+
+ while (isspace(*chptr) && (*chptr)) chptr++;
+ if (!*chptr) return NULL;
+ start = chptr;
+
+ while (!isspace(*chptr) && (*chptr)) chptr++;
+ *chptr = '\0';
+
+ item.mnt_dir = strdup(start);
+ return &item;
+ #endif
+ }
+
+ return NULL;
+}