89 lines · c
1// SPDX-License-Identifier: LGPL-2.12#include <sys/types.h>3#include <sys/stat.h>4#include <fcntl.h>5 6#ifndef O_DIRECT7#define O_DIRECT 000400008#endif9 10#ifndef O_DIRECTORY11#define O_DIRECTORY 0020000012#endif13 14#ifndef O_NOATIME15#define O_NOATIME 0100000016#endif17 18#ifndef O_TMPFILE19#define O_TMPFILE 02000000020#endif21 22#undef O_LARGEFILE23#define O_LARGEFILE 0010000024 25size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)26{27 const char *prefix = "O_";28 int printed = 0;29 30 if ((flags & O_ACCMODE) == O_RDONLY)31 printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", "RDONLY");32 if (flags == 0)33 return printed;34#define P_FLAG(n) \35 if (flags & O_##n) { \36 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \37 flags &= ~O_##n; \38 }39 40 P_FLAG(RDWR);41 P_FLAG(APPEND);42 P_FLAG(ASYNC);43 P_FLAG(CLOEXEC);44 P_FLAG(CREAT);45 P_FLAG(DIRECT);46 P_FLAG(DIRECTORY);47 P_FLAG(EXCL);48 P_FLAG(LARGEFILE);49 P_FLAG(NOFOLLOW);50 P_FLAG(TMPFILE);51 P_FLAG(NOATIME);52 P_FLAG(NOCTTY);53#ifdef O_NONBLOCK54 P_FLAG(NONBLOCK);55#elif O_NDELAY56 P_FLAG(NDELAY);57#endif58#ifdef O_PATH59 P_FLAG(PATH);60#endif61#ifdef O_DSYNC62 if ((flags & O_SYNC) == O_SYNC)63 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", "SYNC");64 else {65 P_FLAG(DSYNC);66 }67#else68 P_FLAG(SYNC);69#endif70 P_FLAG(TRUNC);71 P_FLAG(WRONLY);72#undef P_FLAG73 74 if (flags)75 printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);76 77 return printed;78}79 80size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg)81{82 int flags = arg->val;83 84 if (!(flags & O_CREAT))85 arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */86 87 return open__scnprintf_flags(flags, bf, size, arg->show_string_prefix);88}89