2016-11-04 6 views
2

openの機能をラップしようとしています。私はオプションの第3引数を実際のopenに渡す方法を知らない。私が理解しているように、va_listを検証する方法はないので、if (mode)は以下の例では正しくありません。適切な数の引数でopenを呼び出す方法はありますか?バリデーションのラッピング

#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

オープンのmanページは言う:

モードでは、新しいファイルが作成さ ある場合に使用する権限を指定します。 flagsに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); 
    } 
}