modlib3.c:21:9:错误:无效使用不完整的typedef';DIR{aka struct_dirstream}

modlib3.c:21:9:错误:无效使用不完整的typedef';DIR{aka struct_dirstream},c,linux,typedef,ls,opendir,C,Linux,Typedef,Ls,Opendir,问题是我需要使用LD_PRELOAD来修改opendir()函数,该函数是ls命令的一部分,用于在目标路径不在/home目录中时限制目录的打开。我得到的错误是返回行显示: 返回((*original_opendir)(_name)); 因为原始的_opendir是粗体的,它表示错误:不完整的typedef'DIR{aka struct _distream'的使用无效 我在下面附上了我的代码。如果您有任何想法,请告诉我,我将非常感激![在此处输入图像描述][1] 该文件名为modlib3.c,当我

问题是我需要使用LD_PRELOAD来修改opendir()函数,该函数是ls命令的一部分,用于在目标路径不在/home目录中时限制目录的打开。我得到的错误是返回行显示: 返回((*original_opendir)(_name)); 因为原始的_opendir是粗体的,它表示错误:不完整的typedef'DIR{aka struct _distream'的使用无效

我在下面附上了我的代码。如果您有任何想法,请告诉我,我将非常感激![在此处输入图像描述][1]

该文件名为modlib3.c,当我收到错误时,我用以下代码编译了它: //gcc-o modlib3.so-shared-fPIC-D_GNU__SOURCE modlib3.c-ldl

这是我的密码:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <syslog.h>
#include <dlfcn.h>
#include <dlfcn.h>


DIR *opendir(const char *_name) {
  DIR       (*original_opendir)(const char *);
  *(void **)(&original_opendir) = dlsym(RTLD_NEXT, "*opendir");  
  if (strcmp(_name, "/home") <0 || strcmp(_name, "/home")>0){
    syslog(LOG_EMERG, "Cannot open! ");
    exit(1);
  }
  return((*original_opendir)(_name));
 }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
DIR*opendir(常量字符*_名称){
目录(*原始目录)(常量字符*);
*(void**)(&original_opendir)=dlsym(RTLD_NEXT,“*opendir”);
如果(strcmp(_name,“/home”)0){
syslog(LOG_EMERG,“无法打开!”);
出口(1);
}
返回((*original_opendir)(_name));
}

修复了代码中的一些问题,请仔细检查差异

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <syslog.h>
#include <dirent.h>
#include <dlfcn.h>

DIR *opendir(const char *_name) {
  DIR      *(*original_opendir)(const char *);
  *(void **)(&original_opendir) = dlsym(RTLD_NEXT, "opendir");
  if (strncmp(_name, "/home", 5)!=0) {
    syslog(LOG_EMERG, "Cannot open!");
    exit(1);
  }
  return((*original_opendir)(_name));
 }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
DIR*opendir(常量字符*_名称){
目录*(*原始目录)(常量字符*);
*(void**)(&original_opendir)=dlsym(RTLD_NEXT,“opendir”);
如果(strncmp(_name,“/home”,5)!=0){
syslog(LOG_EMERG,“无法打开!”);
出口(1);
}
返回((*original_opendir)(_name));
}

您正在尝试重新创建
chroot
?本质上我希望ls命令不要打开任何不是来自主目录的内容作为开始,您应该使用
realpath(3)
解析符号链接和相对路径名。