[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