aboutsummaryrefslogtreecommitdiff
path: root/sim/testsuite/cris/c/readlink2.c
diff options
context:
space:
mode:
Diffstat (limited to 'sim/testsuite/cris/c/readlink2.c')
-rw-r--r--sim/testsuite/cris/c/readlink2.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/sim/testsuite/cris/c/readlink2.c b/sim/testsuite/cris/c/readlink2.c
new file mode 100644
index 0000000..e5e9d94
--- /dev/null
+++ b/sim/testsuite/cris/c/readlink2.c
@@ -0,0 +1,80 @@
+/*
+#notarget: cris*-*-elf
+*/
+
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main (int argc, char *argv[])
+{
+ char buf[1024];
+ char buf2[1024];
+ int err;
+
+ /* This is a special feature handled in the simulator. The "42"
+ should be formed from getpid () if this was a real program. */
+ err = readlink ("/proc/42/exe", buf, sizeof (buf));
+ if (err < 0)
+ {
+ if (err == -1 && errno == ENOSYS)
+ printf ("ENOSYS\n");
+ printf ("xyzzy\n");
+ exit (0);
+ }
+
+ /* Don't use an abort in the following; it might cause the printf to
+ not make it all the way to output and make debugging more
+ difficult. */
+
+ /* We assume the program is called with no path, so we might need to
+ prepend it. */
+ if (getcwd (buf2, sizeof (buf2)) != buf2)
+ {
+ perror ("getcwd");
+ exit (1);
+ }
+
+ if (argv[0][0] == '/')
+ {
+#ifdef SYSROOTED
+ if (strchr (argv[0] + 1, '/') != NULL)
+ {
+ printf ("%s != %s\n", argv[0], strrchr (argv[0] + 1, '/'));
+ exit (1);
+ }
+#endif
+ if (strcmp (argv[0], buf) != 0)
+ {
+ printf ("%s != %s\n", buf, argv[0]);
+ exit (1);
+ }
+ }
+ else if (argv[0][0] != '.')
+ {
+ if (buf2[strlen (buf2) - 1] != '/')
+ strcat (buf2, "/");
+ strcat (buf2, argv[0]);
+ if (strcmp (buf2, buf) != 0)
+ {
+ printf ("%s != %s\n", buf, buf2);
+ exit (1);
+ }
+ }
+ else
+ {
+ strcat (buf2, argv[0] + 1);
+ if (strcmp (buf, buf2) != 0)
+ {
+ printf ("%s != %s\n", buf, buf2);
+ exit (1);
+ }
+ }
+
+ printf ("pass\n");
+ exit (0);
+}
+
+