我正在用C编写一个简化的HTTP服务器,我不得不生成403 Forbidden错误。例如,如果我进入名为“docs”的目录,并且用户在其中请求文件“foo.html”文件,则服务器应该返回403错误,如果该文件没有读取权限。这是我的代码来处理这个问题:
struct stat buf;
int error, status;
chdir("./docs/");
if(status = lstat(name, &buf) < 0) { //name == "foo.html"
error = errno;
}
chdir("..");
fprintf(stderr, "error: %s\n", strerror(errno)); //Prints "success" when it should be
//"Permission denied"
if(error == EACCES) {
fprintf(stderr, "403 Forbidden");
}
尽管在命令行的docs目录中运行了“chmod 000 foo.html”命令,但我遇到了这个问题。我一直对这个错误感到困惑,无法找到可能的来源。
答案 0 :(得分:3)
stat()和lstat()做不尝试读取文件 - 他们只是从相应的目录条目中读出关于文件的信息。
如果组件路径中的某个目录对您的程序不可读,则只会出现EACCES错误。
答案 1 :(得分:0)
尽管不常见,但可能是对chdir()
的调用将errno
的值设置回0
:
chdir("..");
fprintf(stderr, "error: %s\n", strerror(errno)); //Prints "success" when it should be
//"Permission denied"
因此,您可能希望使用保存的errno
值,因为它是在调用lstat()
之后设置的,error
是strerror()
的参数:< / p>
fprintf(stderr, "error: %s\n", strerror(error));
另请注意,如果运行程序的用户可能无法访问路径的至少一部分,那么lstat
只会失败-1
并将errno
设置为EACCES
该文件是lstat()
ed。
来自man lstat
:
EACCES 路径前缀中的一个目录的搜索权限被拒绝。
此外,您应该使用的代码不会测试两次调用chmod()
的结果。