cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

open_flags.c (1852B)


      1// SPDX-License-Identifier: LGPL-2.1
      2#include <sys/types.h>
      3#include <sys/stat.h>
      4#include <fcntl.h>
      5
      6#ifndef O_DIRECT
      7#define O_DIRECT	00040000
      8#endif
      9
     10#ifndef O_DIRECTORY
     11#define O_DIRECTORY	00200000
     12#endif
     13
     14#ifndef O_NOATIME
     15#define O_NOATIME	01000000
     16#endif
     17
     18#ifndef O_TMPFILE
     19#define O_TMPFILE	020000000
     20#endif
     21
     22#undef O_LARGEFILE
     23#define O_LARGEFILE	00100000
     24
     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_NONBLOCK
     54	P_FLAG(NONBLOCK);
     55#elif O_NDELAY
     56	P_FLAG(NDELAY);
     57#endif
     58#ifdef O_PATH
     59	P_FLAG(PATH);
     60#endif
     61#ifdef O_DSYNC
     62	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#else
     68	P_FLAG(SYNC);
     69#endif
     70	P_FLAG(TRUNC);
     71	P_FLAG(WRONLY);
     72#undef P_FLAG
     73
     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}