brintos

brintos / linux-shallow public Read only

0
0
Text · 1.8 KiB · 78f6566 Raw
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