// SPDX-License-Identifier: GPL-2.0 
 | 
#include <sys/types.h> 
 | 
#include <sys/stat.h> 
 | 
#include <unistd.h> 
 | 
  
 | 
/* From include/linux/stat.h */ 
 | 
#ifndef S_IRWXUGO 
 | 
#define S_IRWXUGO    (S_IRWXU|S_IRWXG|S_IRWXO) 
 | 
#endif 
 | 
#ifndef S_IALLUGO 
 | 
#define S_IALLUGO    (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO) 
 | 
#endif 
 | 
#ifndef S_IRUGO 
 | 
#define S_IRUGO         (S_IRUSR|S_IRGRP|S_IROTH) 
 | 
#endif 
 | 
#ifndef S_IWUGO 
 | 
#define S_IWUGO         (S_IWUSR|S_IWGRP|S_IWOTH) 
 | 
#endif 
 | 
#ifndef S_IXUGO 
 | 
#define S_IXUGO         (S_IXUSR|S_IXGRP|S_IXOTH) 
 | 
#endif 
 | 
  
 | 
static size_t syscall_arg__scnprintf_mode_t(char *bf, size_t size, struct syscall_arg *arg) 
 | 
{ 
 | 
    int printed = 0, mode = arg->val; 
 | 
  
 | 
#define    P_MODE(n) \ 
 | 
    if ((mode & S_##n) == S_##n) { \ 
 | 
        printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 
 | 
        mode &= ~S_##n; \ 
 | 
    } 
 | 
  
 | 
    P_MODE(IALLUGO); 
 | 
    P_MODE(IRWXUGO); 
 | 
    P_MODE(IRUGO); 
 | 
    P_MODE(IWUGO); 
 | 
    P_MODE(IXUGO); 
 | 
    P_MODE(IFMT); 
 | 
    P_MODE(IFSOCK); 
 | 
    P_MODE(IFLNK); 
 | 
    P_MODE(IFREG); 
 | 
    P_MODE(IFBLK); 
 | 
    P_MODE(IFDIR); 
 | 
    P_MODE(IFCHR); 
 | 
    P_MODE(IFIFO); 
 | 
    P_MODE(ISUID); 
 | 
    P_MODE(ISGID); 
 | 
    P_MODE(ISVTX); 
 | 
    P_MODE(IRWXU); 
 | 
    P_MODE(IRUSR); 
 | 
    P_MODE(IWUSR); 
 | 
    P_MODE(IXUSR); 
 | 
    P_MODE(IRWXG); 
 | 
    P_MODE(IRGRP); 
 | 
    P_MODE(IWGRP); 
 | 
    P_MODE(IXGRP); 
 | 
    P_MODE(IRWXO); 
 | 
    P_MODE(IROTH); 
 | 
    P_MODE(IWOTH); 
 | 
    P_MODE(IXOTH); 
 | 
#undef P_MODE 
 | 
  
 | 
    if (mode) 
 | 
        printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", mode); 
 | 
  
 | 
    return printed; 
 | 
} 
 | 
  
 | 
#define SCA_MODE_T syscall_arg__scnprintf_mode_t 
 |