Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
Arquivo: files.c Projeto: Schala/mhxd
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;
}