#define _GNU_SOURCE

#include <limits.h>
#include <stdlib.h>
#include "ocaml_utils.h"

/* Pathname resolution */

/* Seems like a sane approach to getting a reasonable bound for the
   maximum path length */
#ifdef PATH_MAX
#define JANE_PATH_MAX ((PATH_MAX <= 0 || PATH_MAX > 65536) ? 65536 : PATH_MAX)
#else
#define JANE_PATH_MAX (65536)
#endif

#ifdef __GLIBC__
CAMLprim value core_unix_realpath(value v_path) {
  const char *path = String_val(v_path);
  char *res = realpath(path, NULL);
  if (res == NULL)
    uerror("realpath", v_path);
  else {
    value v_res = caml_copy_string(res);
    free(res);
    return v_res;
  }
}
#else
CAMLprim value core_unix_realpath(value v_path) {
  char *path = String_val(v_path);
  /* [realpath] is inherently broken without GNU-extension, and this
     seems like a reasonable thing to do if we do not build against
     GLIBC. */
  char resolved_path[JANE_PATH_MAX];
  if (realpath(path, resolved_path) == NULL)
    uerror("realpath", v_path);
  return caml_copy_string(resolved_path);
}
#endif
