Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
  1/* SPDX-License-Identifier: LGPL-2.1 OR MIT */
  2/*
  3 * Special types used by various syscalls for NOLIBC
  4 * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu>
  5 */
  6
  7#ifndef _NOLIBC_TYPES_H
  8#define _NOLIBC_TYPES_H
  9
 10#include "std.h"
 11#include <linux/time.h>
 12
 13
 14/* Only the generic macros and types may be defined here. The arch-specific
 15 * ones such as the O_RDONLY and related macros used by fcntl() and open(), or
 16 * the layout of sys_stat_struct must not be defined here.
 17 */
 18
 19/* stat flags (WARNING, octal here) */
 20#define S_IFDIR        0040000
 21#define S_IFCHR        0020000
 22#define S_IFBLK        0060000
 23#define S_IFREG        0100000
 24#define S_IFIFO        0010000
 25#define S_IFLNK        0120000
 26#define S_IFSOCK       0140000
 27#define S_IFMT         0170000
 28
 29#define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
 30#define S_ISCHR(mode)  (((mode) & S_IFMT) == S_IFCHR)
 31#define S_ISBLK(mode)  (((mode) & S_IFMT) == S_IFBLK)
 32#define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)
 33#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
 34#define S_ISLNK(mode)  (((mode) & S_IFMT) == S_IFLNK)
 35#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
 36
 37/* dirent types */
 38#define DT_UNKNOWN     0x0
 39#define DT_FIFO        0x1
 40#define DT_CHR         0x2
 41#define DT_DIR         0x4
 42#define DT_BLK         0x6
 43#define DT_REG         0x8
 44#define DT_LNK         0xa
 45#define DT_SOCK        0xc
 46
 47/* commonly an fd_set represents 256 FDs */
 48#ifndef FD_SETSIZE
 49#define FD_SETSIZE     256
 50#endif
 51
 52/* PATH_MAX and MAXPATHLEN are often used and found with plenty of different
 53 * values.
 54 */
 55#ifndef PATH_MAX
 56#define PATH_MAX       4096
 57#endif
 58
 59#ifndef MAXPATHLEN
 60#define MAXPATHLEN     (PATH_MAX)
 61#endif
 62
 63/* Special FD used by all the *at functions */
 64#ifndef AT_FDCWD
 65#define AT_FDCWD       (-100)
 66#endif
 67
 68/* whence values for lseek() */
 69#define SEEK_SET       0
 70#define SEEK_CUR       1
 71#define SEEK_END       2
 72
 73/* cmd for reboot() */
 74#define LINUX_REBOOT_MAGIC1         0xfee1dead
 75#define LINUX_REBOOT_MAGIC2         0x28121969
 76#define LINUX_REBOOT_CMD_HALT       0xcdef0123
 77#define LINUX_REBOOT_CMD_POWER_OFF  0x4321fedc
 78#define LINUX_REBOOT_CMD_RESTART    0x01234567
 79#define LINUX_REBOOT_CMD_SW_SUSPEND 0xd000fce2
 80
 81/* Macros used on waitpid()'s return status */
 82#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
 83#define WIFEXITED(status)   (((status) & 0x7f) == 0)
 84
 85/* waitpid() flags */
 86#define WNOHANG      1
 87
 88/* standard exit() codes */
 89#define EXIT_SUCCESS 0
 90#define EXIT_FAILURE 1
 91
 92#define FD_SETIDXMASK (8 * sizeof(unsigned long))
 93#define FD_SETBITMASK (8 * sizeof(unsigned long)-1)
 94
 95/* for select() */
 96typedef struct {
 97	unsigned long fds[(FD_SETSIZE + FD_SETBITMASK) / FD_SETIDXMASK];
 98} fd_set;
 99
100#define FD_CLR(fd, set) do {						\
101		fd_set *__set = (set);					\
102		int __fd = (fd);					\
103		if (__fd >= 0)						\
104			__set->fds[__fd / FD_SETIDXMASK] &=		\
105				~(1U << (__fd & FX_SETBITMASK));	\
106	} while (0)
107
108#define FD_SET(fd, set) do {						\
109		fd_set *__set = (set);					\
110		int __fd = (fd);					\
111		if (__fd >= 0)						\
112			__set->fds[__fd / FD_SETIDXMASK] |=		\
113				1 << (__fd & FD_SETBITMASK);		\
114	} while (0)
115
116#define FD_ISSET(fd, set) ({						\
117			fd_set *__set = (set);				\
118			int __fd = (fd);				\
119		int __r = 0;						\
120		if (__fd >= 0)						\
121			__r = !!(__set->fds[__fd / FD_SETIDXMASK] &	\
1221U << (__fd & FD_SET_BITMASK));						\
123		__r;							\
124	})
125
126#define FD_ZERO(set) do {						\
127		fd_set *__set = (set);					\
128		int __idx;						\
129		int __size = (FD_SETSIZE+FD_SETBITMASK) / FD_SETIDXMASK;\
130		for (__idx = 0; __idx < __size; __idx++)		\
131			__set->fds[__idx] = 0;				\
132	} while (0)
133
134/* for poll() */
135#define POLLIN          0x0001
136#define POLLPRI         0x0002
137#define POLLOUT         0x0004
138#define POLLERR         0x0008
139#define POLLHUP         0x0010
140#define POLLNVAL        0x0020
141
142struct pollfd {
143	int fd;
144	short int events;
145	short int revents;
146};
147
148/* for getdents64() */
149struct linux_dirent64 {
150	uint64_t       d_ino;
151	int64_t        d_off;
152	unsigned short d_reclen;
153	unsigned char  d_type;
154	char           d_name[];
155};
156
157/* needed by wait4() */
158struct rusage {
159	struct timeval ru_utime;
160	struct timeval ru_stime;
161	long   ru_maxrss;
162	long   ru_ixrss;
163	long   ru_idrss;
164	long   ru_isrss;
165	long   ru_minflt;
166	long   ru_majflt;
167	long   ru_nswap;
168	long   ru_inblock;
169	long   ru_oublock;
170	long   ru_msgsnd;
171	long   ru_msgrcv;
172	long   ru_nsignals;
173	long   ru_nvcsw;
174	long   ru_nivcsw;
175};
176
177/* The format of the struct as returned by the libc to the application, which
178 * significantly differs from the format returned by the stat() syscall flavours.
179 */
180struct stat {
181	dev_t     st_dev;     /* ID of device containing file */
182	ino_t     st_ino;     /* inode number */
183	mode_t    st_mode;    /* protection */
184	nlink_t   st_nlink;   /* number of hard links */
185	uid_t     st_uid;     /* user ID of owner */
186	gid_t     st_gid;     /* group ID of owner */
187	dev_t     st_rdev;    /* device ID (if special file) */
188	off_t     st_size;    /* total size, in bytes */
189	blksize_t st_blksize; /* blocksize for file system I/O */
190	blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
191	time_t    st_atime;   /* time of last access */
192	time_t    st_mtime;   /* time of last modification */
193	time_t    st_ctime;   /* time of last status change */
194};
195
196/* WARNING, it only deals with the 4096 first majors and 256 first minors */
197#define makedev(major, minor) ((dev_t)((((major) & 0xfff) << 8) | ((minor) & 0xff)))
198#define major(dev) ((unsigned int)(((dev) >> 8) & 0xfff))
199#define minor(dev) ((unsigned int)(((dev) & 0xff))
200
201#ifndef offsetof
202#define offsetof(TYPE, FIELD) ((size_t) &((TYPE *)0)->FIELD)
203#endif
204
205#ifndef container_of
206#define container_of(PTR, TYPE, FIELD) ({			\
207	__typeof__(((TYPE *)0)->FIELD) *__FIELD_PTR = (PTR);	\
208	(TYPE *)((char *) __FIELD_PTR - offsetof(TYPE, FIELD));	\
209})
210#endif
211
212/* make sure to include all global symbols */
213#include "nolibc.h"
214
215#endif /* _NOLIBC_TYPES_H */