#include #include #include #include /* * Exercises errno + strerror + perror by triggering each failure path. * No file system mutations are required — every call here is expected * to fail by design. */ int main(void) { puts("errno test:"); puts(""); /* 1. Open a file that does not exist. */ errno = 0; int fd = open("NOSUCH.TXT", O_RDONLY); printf(" open(\"NOSUCH.TXT\"): fd=%d errno=%d %s\n", fd, errno, strerror(errno)); /* 2. Close a bogus file descriptor. */ errno = 0; int r = close(0x7F); printf(" close(0x7F): ret=%d errno=%d %s\n", r, errno, strerror(errno)); /* 3. perror() — convenience wrapper. */ errno = 0; fd = open("ANOTHER.MIS", O_RDONLY); perror(" open(\"ANOTHER.MIS\")"); /* 4. Delete something that isn't there. */ errno = 0; r = unlink("PHANTOM.TMP"); perror(" unlink(\"PHANTOM.TMP\")"); /* 5. A few raw codes for the table. */ puts(""); puts(" raw codes:"); for (int i = 0; i <= 5; i++) { printf(" %2d → %s\n", i, strerror(i)); } printf(" %2d → %s (out of range)\n", 99, strerror(99)); puts(""); puts("Press any key to exit."); (void)getchar(); return 0; }