char *vfswrap_realpath(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *resolved_path) { char *result; START_PROFILE(syscall_realpath); result = sys_realpath(path, resolved_path); END_PROFILE(syscall_realpath); return result; }
int hldir_to_path (struct hl_data_hdr *dh, const char *root, char *rlpath, char *pathp) { u_int16_t rootlen, pos, count; u_int8_t *p, nlen; char path[MAXPATHLEN]; int err = 0; u_int16_t dh_len; rootlen = pos = strlen(root); memcpy(path, root, pos); path[pos++] = DIRCHAR; L16NTOH(count, dh->data); if (count > 32) count = 32; L16NTOH(dh_len, &dh->len); if (dh_len < 5) { pathp[0] = '/'; pathp[1] = 0; strcpy(rlpath, root); return 0; } p = &dh->data[4]; for (;;) { nlen = *p; p++; if (pos + nlen >= MAXPATHLEN) { return ENAMETOOLONG; } /* do not allow ".." or DIRCHAR */ if (!(nlen == 2 && p[0] == '.' && p[1] == '.') && !memchr(p, DIRCHAR, nlen)) { #if defined(CONFIG_ICONV) char *out_p; size_t out_len; if (hxd_cfg.text.client_encoding[0] && hxd_cfg.text.server_encoding[0]) { out_len = convbuf(hxd_cfg.text.server_encoding, hxd_cfg.text.client_encoding, p, (size_t)nlen, &out_p); if (out_len) { if (out_len > (size_t)nlen) out_len = (size_t)nlen; memcpy(&path[pos], out_p, out_len); xfree(out_p); } else { memcpy(&path[pos], p, nlen); } } else #endif memcpy(&path[pos], p, nlen); pos += nlen; } count--; if (count) { path[pos++] = DIRCHAR; p += 2 + nlen; } else { path[pos] = 0; break; } } if (!sys_realpath(path, rlpath)) err = errno; path[MAXPATHLEN-1] = 0; strcpy(pathp, path); return err; }