#define _POSIX_C_SOURCE 200809L
#include <unistd.h>
#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
    size_t size = 128;
    char *path;
    if (argc != 1) { fprintf(stderr, "usage: %s\n", argv[0]); return 1; }
    for (;;) {
        path = malloc(size);
        if (path == NULL) { perror("pwd: malloc"); return 1; }
        if (getcwd(path, size) != NULL) break;
        {
            int saved = errno;
            free(path);
            errno = saved;
        }
        if (errno != ERANGE) { perror("pwd: getcwd"); return 1; }
        if (size > SIZE_MAX / 2) { fprintf(stderr, "pwd: path too long\n"); return 1; }
        size *= 2;
    }
    if (puts(path) == EOF || fflush(stdout) == EOF) {
        perror("pwd: stdout"); free(path); return 1;
    }
    free(path);
    return 0;
}
