[syslinux] [PATCH 4/5] COM32: add trivial stat() function

Gene Cumm gene.cumm at gmail.com
Wed Mar 4 16:32:40 PST 2009


From: Gene Cumm <gene.cumm at gmail.com>

COM32: add trivial stat() function; uses open(), fstat() then close()
or opendir(), closedir().

Signed-off-by: Gene Cumm <gene.cumm at gmail.com>

---

Not the most elegant thing in the world but it's been working for me.


diff --git a/com32/include/sys/stat.h b/com32/include/sys/stat.h
index ffc4105..2a06a68 100644
--- a/com32/include/sys/stat.h
+++ b/com32/include/sys/stat.h
@@ -49,4 +49,6 @@ struct stat {
 /* Only fstat() supported */
 int fstat(int, struct stat *);

+int stat(const char *, struct stat *);
+
 #endif /* _SYS_STAT_H */
diff --git a/com32/lib/Makefile b/com32/lib/Makefile
index 0cc4061..21379b4 100644
--- a/com32/lib/Makefile
+++ b/com32/lib/Makefile
@@ -32,7 +32,7 @@ LIBOBJS = \
        sys/entry.o sys/exit.o sys/argv.o sys/times.o                   \
        sys/fileinfo.o sys/opendev.o sys/read.o sys/write.o sys/ftell.o \
        sys/close.o sys/open.o sys/fileread.o sys/fileclose.o           \
-       sys/isatty.o sys/fstat.o                                        \
+       sys/isatty.o sys/fstat.o sys/stat.o                             \
        \
        sys/zfile.o sys/zfopen.o                                        \
        \
diff --git a/com32/lib/sys/stat.c b/com32/lib/sys/stat.c
new file mode 100644
index 0000000..d1b2629
--- /dev/null
+++ b/com32/lib/sys/stat.c
@@ -0,0 +1,73 @@
+/* ----------------------------------------------------------------------- *
+ *
+ *   Copyright 2009 Gene Cumm - All Rights Reserved
+ *
+ *   Permission is hereby granted, free of charge, to any person
+ *   obtaining a copy of this software and associated documentation
+ *   files (the "Software"), to deal in the Software without
+ *   restriction, including without limitation the rights to use,
+ *   copy, modify, merge, publish, distribute, sublicense, and/or
+ *   sell copies of the Software, and to permit persons to whom
+ *   the Software is furnished to do so, subject to the following
+ *   conditions:
+ *
+ *   The above copyright notice and this permission notice shall
+ *   be included in all copies or substantial portions of the Software.
+ *
+ *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *   OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * stat.c
+ *
+ * Very trivial stat emulation by using open(), fstat(), close()
+ */
+
+#include <sys/stat.h>
+#include <errno.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+// #include "file.h"
+
+int stat(const char *pathname, struct stat *buf)
+{
+	int fd, status, ret;
+	DIR *d;
+	mode_t st_mode;
+
+	fd = open(pathname, O_RDONLY);
+	if (fd != -1){
+		status = fstat(fd, buf);
+		close(fd);
+		ret = 0;
+	} else {
+		if ((errno == 0) || (errno == ENOENT)) {
+			errno = 0;
+			st_mode = (S_IFDIR | S_IRUSR | S_IXUSR);
+				/* | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)
+				*/
+			d = opendir(pathname);
+			if (d != NULL) {
+				buf->st_size = 0;
+				buf->st_mode = st_mode;
+				closedir(d);
+				ret = 0;
+			} else {
+				ret = -1;	/* Preserve errno */
+			}
+		} else {
+			ret = -1;	/* Preserve errno */
+		}
+	}
+	return ret;
+}	/* stat */




More information about the Syslinux mailing list