diff --git a/build-aux/check-mescc.sh b/build-aux/check-mescc.sh index e23ce511..d4754fc8 100755 --- a/build-aux/check-mescc.sh +++ b/build-aux/check-mescc.sh @@ -141,6 +141,7 @@ t 94-unsetenv 95-signal 96-strto +97-fopen " # 90: needs GNU, fails for mescc, passes for tcc diff --git a/include/unistd.h b/include/unistd.h index 26632a2b..3db8dde9 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -97,6 +97,7 @@ int execvp (char const *file, char *const argv[]); int fork (); char *getcwd (char *buf, size_t size); int isatty (int fd); +int link (char const *oldname, char const *newname); off_t lseek (int fd, off_t offset, int whence); ssize_t read (int fd, void *buffer, size_t size); #if __SBRK_CHAR_PTRDIFF diff --git a/scaffold/tests/97-fopen.c b/scaffold/tests/97-fopen.c new file mode 100644 index 00000000..ab029821 --- /dev/null +++ b/scaffold/tests/97-fopen.c @@ -0,0 +1,109 @@ +/* -*-comment-start: "//";comment-end:""-*- + * Mes --- Maxwell Equations of Software + * Copyright © 2018 Jan (janneke) Nieuwenhuizen + * + * This file is part of Mes. + * + * Mes is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * Mes is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mes. If not, see . + */ + +#include +#include +#include +#include +#include +#include + +int +dump (char const *name, char const* contents) +{ + unlink (name); + FILE *f = fopen (name, "w"); + fwrite (contents, strlen (contents), 1, f); + fclose (f); +} + +int +main () +{ + char *line = "The first line.\n"; + char *contents = "The first line.\nThe second line.\nThe last line.\n"; + char* end = "That's all folks!\n"; + + char *tmp = "foo"; + + dump (tmp, contents); + + + FILE *t = fopen (tmp, "r+"); + + + char buf[80]; + memset (buf, 0, sizeof (buf)); + fread (buf, strlen (line), 1, t); + eputs ("buf="); eputs (buf); eputs ("\n"); + if (strcmp (buf, line)) + return 1; + + fwrite (end, strlen (end), 1, t); + + fseek (t, 0, SEEK_SET); + memset (buf, 0, sizeof (buf)); + fread (buf, strlen (line), 1, t); + eputs ("buf="); eputs (buf); eputs ("\n"); + if (strcmp (buf, line)) + return 2; + + tmp = "bar"; + dump (tmp, contents); + t = fopen (tmp, "w+"); + + fwrite (end, strlen (end), 1, t); + fseek (t, 0, SEEK_SET); + memset (buf, 0, sizeof (buf)); + fread (buf, strlen (end), 1, t); + eputs ("buf="); eputs (buf); eputs ("\n"); + if (strcmp (buf, end)) + return 3; + + fwrite (end, strlen (end), 1, t); + + fseek (t, 0, SEEK_SET); + memset (buf, 0, sizeof (buf)); + fread (buf, strlen (end), 1, t); + if (strcmp (buf, end)) + return 4; + + tmp = "baz"; + dump (tmp, contents); + t = fopen (tmp, "a+"); + + fwrite (end, strlen (end), 1, t); + fseek (t, 0, SEEK_SET); + memset (buf, 0, sizeof (buf)); + fread (buf, strlen (line), 1, t); + eputs ("buf="); eputs (buf); eputs ("\n"); + if (strcmp (buf, line)) + return 5; + + fwrite (end, strlen (end), 1, t); + + fseek (t, 0, SEEK_SET); + fread (buf, strlen (line), 1, t); + eputs ("buf="); eputs (buf); eputs ("\n"); + if (strcmp (buf, line)) + return 6; + + return 0; +}