162306a36Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1 262306a36Sopenharmony_ci#include <sys/types.h> 362306a36Sopenharmony_ci#include <sys/stat.h> 462306a36Sopenharmony_ci#include <fcntl.h> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef O_DIRECT 762306a36Sopenharmony_ci#define O_DIRECT 00040000 862306a36Sopenharmony_ci#endif 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef O_DIRECTORY 1162306a36Sopenharmony_ci#define O_DIRECTORY 00200000 1262306a36Sopenharmony_ci#endif 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#ifndef O_NOATIME 1562306a36Sopenharmony_ci#define O_NOATIME 01000000 1662306a36Sopenharmony_ci#endif 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifndef O_TMPFILE 1962306a36Sopenharmony_ci#define O_TMPFILE 020000000 2062306a36Sopenharmony_ci#endif 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#undef O_LARGEFILE 2362306a36Sopenharmony_ci#define O_LARGEFILE 00100000 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cisize_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci const char *prefix = "O_"; 2862306a36Sopenharmony_ci int printed = 0; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci if ((flags & O_ACCMODE) == O_RDONLY) 3162306a36Sopenharmony_ci printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", "RDONLY"); 3262306a36Sopenharmony_ci if (flags == 0) 3362306a36Sopenharmony_ci return printed; 3462306a36Sopenharmony_ci#define P_FLAG(n) \ 3562306a36Sopenharmony_ci if (flags & O_##n) { \ 3662306a36Sopenharmony_ci printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \ 3762306a36Sopenharmony_ci flags &= ~O_##n; \ 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci P_FLAG(RDWR); 4162306a36Sopenharmony_ci P_FLAG(APPEND); 4262306a36Sopenharmony_ci P_FLAG(ASYNC); 4362306a36Sopenharmony_ci P_FLAG(CLOEXEC); 4462306a36Sopenharmony_ci P_FLAG(CREAT); 4562306a36Sopenharmony_ci P_FLAG(DIRECT); 4662306a36Sopenharmony_ci P_FLAG(DIRECTORY); 4762306a36Sopenharmony_ci P_FLAG(EXCL); 4862306a36Sopenharmony_ci P_FLAG(LARGEFILE); 4962306a36Sopenharmony_ci P_FLAG(NOFOLLOW); 5062306a36Sopenharmony_ci P_FLAG(TMPFILE); 5162306a36Sopenharmony_ci P_FLAG(NOATIME); 5262306a36Sopenharmony_ci P_FLAG(NOCTTY); 5362306a36Sopenharmony_ci#ifdef O_NONBLOCK 5462306a36Sopenharmony_ci P_FLAG(NONBLOCK); 5562306a36Sopenharmony_ci#elif O_NDELAY 5662306a36Sopenharmony_ci P_FLAG(NDELAY); 5762306a36Sopenharmony_ci#endif 5862306a36Sopenharmony_ci#ifdef O_PATH 5962306a36Sopenharmony_ci P_FLAG(PATH); 6062306a36Sopenharmony_ci#endif 6162306a36Sopenharmony_ci#ifdef O_DSYNC 6262306a36Sopenharmony_ci if ((flags & O_SYNC) == O_SYNC) 6362306a36Sopenharmony_ci printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", "SYNC"); 6462306a36Sopenharmony_ci else { 6562306a36Sopenharmony_ci P_FLAG(DSYNC); 6662306a36Sopenharmony_ci } 6762306a36Sopenharmony_ci#else 6862306a36Sopenharmony_ci P_FLAG(SYNC); 6962306a36Sopenharmony_ci#endif 7062306a36Sopenharmony_ci P_FLAG(TRUNC); 7162306a36Sopenharmony_ci P_FLAG(WRONLY); 7262306a36Sopenharmony_ci#undef P_FLAG 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci if (flags) 7562306a36Sopenharmony_ci printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci return printed; 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cisize_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg) 8162306a36Sopenharmony_ci{ 8262306a36Sopenharmony_ci int flags = arg->val; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci if (!(flags & O_CREAT)) 8562306a36Sopenharmony_ci arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */ 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci return open__scnprintf_flags(flags, bf, size, arg->show_string_prefix); 8862306a36Sopenharmony_ci} 89