2016-11-04 2 views
2

Я пытаюсь обернуть функцию open. Я не знаю, как передать дополнительный третий аргумент реальному open. Насколько я понимаю, нет способа проверить va_list, поэтому if (mode) неверно, если он ниже примера. Есть ли способ вызвать open с правильным количеством аргументов?Обтекание вариационным fuction

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdarg.h> 

extern "C" 
{ 

int shouldWrap = 0; 

int willCallRealOpen(const char * path, int flags, va_list args); 
int __real_open(const char * path, int flags, ...); 

int __wrap_open(const char * path, int flags, ...) { 
    if(shouldWrap != 0){ 
     printf("Fake called\n"); 
     return 0; 
    } 
    else { 
     printf("Real called\n"); 
     va_list args; 
      va_start(args, flags); 
      int res = willCallRealOpen(path, flags, args); 
     va_end(args); 
     return res; 
    } 
} 

int willCallRealOpen(const char * path, int flags, va_list args) { 
    mode_t mode = va_arg(args, mode_t); 
    if (mode) { 
     printf("3 args\n"); 
     return __real_open(path, flags, mode); 
    } 
    else { 
     printf("2 args\n"); 
     return __real_open(path, flags); 
    } 
} 

} 

int main() { 
    //int fd = open("temp.txt", O_CREAT | O_WRONLY, S_IRUSR); 
    int fd = open("temp.txt", O_CREAT | O_WRONLY); 
} 

ответ

3

Людей страница открытоугольного говорит:

режим определяет разрешения для использования в случае, если новый файл создан. Этот аргумент должен быть указан, когда O_CREAT или O_TMPFILE указан во флагах; если ни O_CREAT, ни O_TMPFILE не указаны, , тогда режим игнорируется.

Так что я думаю, что вы должны делать что-то вроде:

int willCallRealOpen(const char * path, int flags, va_list args) { 
    if (flags & (O_CREAT | O_TMPFILE)) 
    { 
    mode_t mode = va_arg(args, mode_t); 
    printf("3 args\n"); 
    return __real_open(path, flags, mode); 
    } 
    else { 
    printf("2 args\n"); 
    return __real_open(path, flags); 
    } 
} 
Смежные вопросы