projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
changes to kernel sigaction struct handling in preparation for mips port
[musl]
/
src
/
linux
/
mntent.c
diff --git
a/src/linux/mntent.c
b/src/linux/mntent.c
index
e373566
..
3eafba5
100644
(file)
--- a/
src/linux/mntent.c
+++ b/
src/linux/mntent.c
@@
-1,6
+1,7
@@
#include <stdio.h>
#include <string.h>
#include <mntent.h>
#include <stdio.h>
#include <string.h>
#include <mntent.h>
+#include <errno.h>
FILE *setmntent(const char *name, const char *mode)
{
FILE *setmntent(const char *name, const char *mode)
{
@@
-13,39
+14,49
@@
int endmntent(FILE *f)
return 1;
}
return 1;
}
-struct mntent *getmntent
(FILE *f
)
+struct mntent *getmntent
_r(FILE *f, struct mntent *mnt, char *linebuf, int buflen
)
{
{
- static char linebuf[256];
- static struct mntent mnt;
int cnt, n[8];
int cnt, n[8];
- mnt
.
mnt_freq = 0;
- mnt
.
mnt_passno = 0;
+ mnt
->
mnt_freq = 0;
+ mnt
->
mnt_passno = 0;
do {
do {
- fgets(linebuf, sizeof linebuf, f);
- if (feof(f)) return NULL;
+ fgets(linebuf, buflen, f);
+ if (feof(f) || ferror(f)) return 0;
+ if (!strchr(linebuf, '\n')) {
+ fscanf(f, "%*[^\n]%*[\n]");
+ errno = ERANGE;
+ return 0;
+ }
cnt = sscanf(linebuf, " %n%*s%n %n%*s%n %n%*s%n %n%*s%n %d %d",
n, n+1, n+2, n+3, n+4, n+5, n+6, n+7,
cnt = sscanf(linebuf, " %n%*s%n %n%*s%n %n%*s%n %n%*s%n %d %d",
n, n+1, n+2, n+3, n+4, n+5, n+6, n+7,
- &mnt
.mnt_freq, &mnt.
mnt_passno);
- } while (cnt
>= 8 && linebuf[n[0]] !
= '#');
+ &mnt
->mnt_freq, &mnt->
mnt_passno);
+ } while (cnt
< 2 || linebuf[n[0]] =
= '#');
linebuf[n[1]] = 0;
linebuf[n[3]] = 0;
linebuf[n[5]] = 0;
linebuf[n[7]] = 0;
linebuf[n[1]] = 0;
linebuf[n[3]] = 0;
linebuf[n[5]] = 0;
linebuf[n[7]] = 0;
- mnt.mnt_fsname = linebuf+n[0];
- mnt.mnt_dir = linebuf+n[2];
- mnt.mnt_type = linebuf+n[4];
- mnt.mnt_opts = linebuf+n[6];
+ mnt->mnt_fsname = linebuf+n[0];
+ mnt->mnt_dir = linebuf+n[2];
+ mnt->mnt_type = linebuf+n[4];
+ mnt->mnt_opts = linebuf+n[6];
+
+ return mnt;
+}
- return &mnt;
+struct mntent *getmntent(FILE *f)
+{
+ static char linebuf[256];
+ static struct mntent mnt;
+ return getmntent_r(f, &mnt, linebuf, sizeof linebuf);
}
int addmntent(FILE *f, const struct mntent *mnt)
{
}
int addmntent(FILE *f, const struct mntent *mnt)
{
-
fseek(f, 0, SEEK_END)
;
+
if (fseek(f, 0, SEEK_END)) return 1
;
return fprintf(f, "%s\t%s\t%s\t%s\t%d\t%d\n",
mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type, mnt->mnt_opts,
mnt->mnt_freq, mnt->mnt_passno) < 0;
return fprintf(f, "%s\t%s\t%s\t%s\t%d\t%d\n",
mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type, mnt->mnt_opts,
mnt->mnt_freq, mnt->mnt_passno) < 0;