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 */
Keith Schincke
2009-Mar-05 01:42 UTC
[syslinux] [PATCH 4/5] COM32: add trivial stat() function
Hi Gene, 1) Could you set ret equal to -1 when you define the variable? This would keep you from needing to use code space, program time to set it later. 2) Why do you set errno to 0 before your call to opendir()? Shouldn't this be set to 0 if the opendir() call is successful? Keith On Wed, Mar 4, 2009 at 6:32 PM, Gene Cumm <gene.cumm at gmail.com> wrote:> 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 */ > > _______________________________________________ > Syslinux mailing list > Submissions to Syslinux at zytor.com > Unsubscribe or set options at: > http://www.zytor.com/mailman/listinfo/syslinux > Please do not send private replies to mailing list traffic. > >