ref: 36992df80a3a9a05e18b00c4570e043da4352637
dir: /libnpe/realpath.c/
#include <u.h> #include <libc.h> #include "limits.h" char * realpath(char *path, char *buffer) { char *s, p[PATH_MAX]; int f, pathlen, n; s = nil; if((f = open(path, OREAD)) >= 0){ if(fd2path(f, p, sizeof(p)) == 0) s = buffer == nil ? strdup(p) : strcpy(buffer, p); close(f); } if(s == nil){ if(path[0] != '/'){ pathlen = strlen(path); if(getwd(p, sizeof(p)) == nil || (n = strlen(p))+1+pathlen >= sizeof(p)) return nil; p[n++] = '/'; strcpy(p+n, path); path = p; }else if(strlen(path) >= sizeof(p)) return nil; s = cleanname(buffer == nil ? strdup(path) : strcpy(buffer, path)); } return s; }