gpt4 book ai didi

c - realpath() 不解析符号链接(symbolic link)?

转载 作者:太空宇宙 更新时间:2023-11-04 13:24:26 24 4
gpt4 key购买 nike

我已经阅读过有关 realpath() 的内容,但是是否有一个函数可以传递一个基本目录和一个文件名,从而在不解析符号链接(symbolic link)或检查文件是否实际存在的情况下给出以下结果?还是我必须使用修改后的 realpath()

"/var/", "../etc///././/passwd" => "/etc/passwd"

最佳答案

这是一个 normalize_path() 函数:

如果给定路径是相对路径,则函数首先将当前工作目录添加到它之前。

然后处理特殊路径组件,如...或空组件,并返回结果。

对于..,如果存在最后一个组件,则删除最后一个组件(/.. 将只返回/)。
对于 . 或空组件(双 /),这将被跳过。

该函数确保不会返回空路径(而是返回/)。

#define _GNU_SOURCE /* memrchr() */

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>

char * normalize_path(const char * src, size_t src_len) {

char * res;
size_t res_len;

const char * ptr = src;
const char * end = &src[src_len];
const char * next;

if (src_len == 0 || src[0] != '/') {

// relative path

char pwd[PATH_MAX];
size_t pwd_len;

if (getcwd(pwd, sizeof(pwd)) == NULL) {
return NULL;
}

pwd_len = strlen(pwd);
res = malloc(pwd_len + 1 + src_len + 1);
memcpy(res, pwd, pwd_len);
res_len = pwd_len;
} else {
res = malloc((src_len > 0 ? src_len : 1) + 1);
res_len = 0;
}

for (ptr = src; ptr < end; ptr=next+1) {
size_t len;
next = memchr(ptr, '/', end-ptr);
if (next == NULL) {
next = end;
}
len = next-ptr;
switch(len) {
case 2:
if (ptr[0] == '.' && ptr[1] == '.') {
const char * slash = memrchr(res, '/', res_len);
if (slash != NULL) {
res_len = slash - res;
}
continue;
}
break;
case 1:
if (ptr[0] == '.') {
continue;

}
break;
case 0:
continue;
}
res[res_len++] = '/';
memcpy(&res[res_len], ptr, len);
res_len += len;
}

if (res_len == 0) {
res[res_len++] = '/';
}
res[res_len] = '\0';
return res;
}

关于c - realpath() 不解析符号链接(symbolic link)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33827201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com