#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

/*
 * 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;
}
