utils/gprintf.c: Return the correct number of output characters.
[mLib] / sys / t / mdup-test.c
index 08ba0ad..6597b33 100644 (file)
@@ -6,10 +6,20 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include "macros.h"
 #include "mdup.h"
 
 #define MAXFD 256
 
+/* For some reason, Cygwin has started leaving cruft in the top bits of inode
+ * numbers, which breaks this test.  Mask them off.
+ */
+#if defined(__CYGWIN__) && defined(__amd64__)
+#  define HACK_INODE(ino) ((ino)&0xffffffffffff)
+#else
+#  define HACK_INODE(ino) (ino)
+#endif
+
 static void fail(const char *what) { perror(what); exit(1); }
 
 int main(int argc, char *argv[])
@@ -24,7 +34,7 @@ int main(int argc, char *argv[])
   int verbose = 0;
 
   for (i = 1, j = 0; i < argc; i++) {
-    if (strcmp(argv[i], "-v") == 0) { verbose++; continue; }
+    if (STRCMP(argv[i], ==, "-v")) { verbose++; continue; }
     if (j >= MAXFD) { fprintf(stderr, "too many\n"); exit(1); }
     if (sscanf(argv[i], "%d:%d", &fds[j].cur, &fds[j].want) < 2 ||
        fds[j].cur >= MAXFD)
@@ -48,7 +58,7 @@ int main(int argc, char *argv[])
       unlink(",delete-me");
       if (fd2 != fd) { if (dup2(fd2, fd) < 0) fail("dup2"); close(fd2); }
       if (fstat(fd, &st)) fail("fstat");
-      ino[i] = st.st_ino;
+      ino[i] = HACK_INODE(st.st_ino);
       if (verbose)
        printf("open fd %d[%d] = ino %lu\n", fd, i, (unsigned long)ino[i]);
     }
@@ -64,10 +74,11 @@ int main(int argc, char *argv[])
     } else if (fstat(fd, &st)) {
       printf("fstat %d[%d] failed: %s\n", fd, i, strerror(errno));
       win = 0;
-    } else if (st.st_ino != ino[i]) {
+    } else if (HACK_INODE(st.st_ino) != ino[i]) {
       if (!verbose) printf("ino %d[%d] wrong\n", fd, i);
       else printf("ino %d[%d] = %lu != %lu\n", fd, i,
-                 (unsigned long)(st.st_ino), (unsigned long)ino[i]);
+                 (unsigned long)HACK_INODE(st.st_ino),
+                 (unsigned long)ino[i]);
       win = 0;
     }
   }