在Unix中获取errno EACCES

时间:2014-03-16 07:49:09

标签: c http unix

我正在用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”命令,但我遇到了这个问题。我一直对这个错误感到困惑,无法找到可能的来源。

2 个答案:

答案 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()之后设置的,errorstrerror()的参数:< / p>

fprintf(stderr, "error: %s\n", strerror(error)); 

另请注意,如果运行程序的用户可能无法访问路径的至少一部分,那么lstat只会失败-1并将errno设置为EACCES该文件是lstat() ed。

来自man lstat

  

EACCES 路径前缀中的一个目录的搜索权限被拒绝。


此外,您应该使用的代码不会测试两次调用chmod()的结果。