我正在尝试修改系统调用 mkdir(),以过滤一些我不希望他们创建目录的用户,也许这不是最优雅的方法,但我想知道它为什么不起作用。
mkdir() 替换代码是:
#define _GNU_SOURCE
#define MAXGRUPOS 30
#define dim(x) (sizeof(x)/sizeof(x[0]))
#define true 1
#define false 0
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
//
//Me permite llamar al metodo original
#include <dlfcn.h>
//codigos de error
#include <errno.h>
//mkdir()
#include <sys/stat.h>
#include <sys/types.h>
//para obtener los usuarios
#include <unistd.h>
//parser de la config
#include <libconfig.h>
//#####################################################
#define RUTA_CONFIG "/etc/samba/gruposhabilitados.txt"
//#####################################################
int *obtenerGruposValidos(){
        int  indice = 1;
        int (*gruposValidos) = malloc(sizeof (int) * MAXGRUPOS);
        config_t cfg, *cf;
        const config_setting_t *grupos;
        int count = 0, n = 0, activo = 0;
        //add root 
        gruposValidos[0]=0;
        //init parser
        cf = &cfg;
        config_init(cf);
        if (!config_read_file(cf, RUTA_CONFIG )) {
           puts("ERROR al parsear\n");
           config_destroy(cf);
           return gruposValidos;
        }
        if(config_lookup_bool(cf, "Carpetas.activo", &activo)){
                if( activo == 0 ){
                           config_destroy(cf);
                           gruposValidos[1] = (int) getgid();
                           return gruposValidos;
                }//if
                else{
                        grupos = config_lookup(cf, "Carpetas.gruposHabilitados");
                        count = config_setting_length(grupos);
                        for (n = 0; n < count; n++) {
                                printf("Grupo: %d\n", (int) config_setting_get_int_elem(grupos, n));
                                gruposValidos[n+1] = ((int) config_setting_get_int_elem(grupos, n));
                        }  
                        config_destroy(cf);
                }//else
        }//if
        indice = n+1;
        while ( indice < MAXGRUPOS  )
                gruposValidos[indice++] = -1;
        return gruposValidos;
}//obtenerGruposValidos
int verificarGrupos(void){
  gid_t gids[MAXGRUPOS];
  int *gruposValidos = obtenerGruposValidos();
  int count, curr, aux;
  if ((count = getgroups(dim(gids), gids)) == -1){
    perror("getgroups() error");
    return false;
  }
  else {
    fflush(NULL);//me tiraba un error sin esto
    for (curr=0; curr<count; curr++){
        for(aux=0; aux < MAXGRUPOS; aux++){
              printf("%i-%i) Guid: %d - grupoValido: %d\n",curr,aux,((int) gids[curr]) ,(int) ((gruposValidos)[aux]));
              if  (((int) gids[curr]) == ((int) ((gruposValidos)[aux]) )){
                free(gruposValidos);
                return true;
                }//if
        }//for
    }//for
    free(gruposValidos);
    return false;
  }//else
}
int mkdir(const char *pathname, mode_t mode){
  int habilitadoAEscribir = false;
  puts("FALSE MKDIR");
  habilitadoAEscribir = verificarGrupos();
  if ( habilitadoAEscribir == true ){
        int (*mkdir_real)(const char *pathname, mode_t mode);
        mkdir_real = dlsym(RTLD_NEXT,"mkdir");
        mkdir_real(pathname, mode);
        return 0;
  }
   else{
        errno=EPERM;
        return(errno);
   }
}
int rmdir(const char *pathname){
  int habilitadoAEscribir = false;
  habilitadoAEscribir = verificarGrupos();
  if ( habilitadoAEscribir == true ){
        int (*rmdir_real)(const char *pathname);
        rmdir_real = dlsym(RTLD_NEXT,"rmdir");
        rmdir_real(pathname);
        return 0;
  }
   else{
        errno=EPERM;
        return(errno);
       }
}
使用 -Wall -std=c99 -fPIC -lconfig -ldl -shared 编译
当我使用 mkdir 二进制文件时,它可以完美运行
LD_PRELOAD=wrapper.so /bin/mkdir aDirectory
但是当我使用这种方式时:
LD_PRELOAD=wrapper.so bindfs AB 我的 mkdir() 没有被使用。
我已经尝试过这个实现,它不能满足我的需求,但可以与 binfs 一起使用
#include <errno.h>
int mkdir() { errno = EPERM; return -1; }
int rmdir() { errno = EPERM; return -1; }