OXIESEC PANEL
- Current Dir:
/
/
usr
/
include
Server IP: 139.59.38.164
Upload:
Create Dir:
Name
Size
Modified
Perms
π
..
-
10/21/2019 03:48:12 PM
rwxr-xr-x
π
EGL
-
10/28/2024 06:50:22 AM
rwxr-xr-x
π
GL
-
10/28/2024 06:50:20 AM
rwxr-xr-x
π
KHR
-
10/28/2024 06:50:20 AM
rwxr-xr-x
π
OpenEXR
-
10/28/2024 06:50:35 AM
rwxr-xr-x
π
X11
-
10/28/2024 06:50:32 AM
rwxr-xr-x
π
_G_config.h
932 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
aio.h
7.28 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
aliases.h
1.98 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
alloca.h
1.17 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
ar.h
1.69 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
argp.h
24.82 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
argz.h
5.91 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
arpa
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
asm-generic
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
assert.h
4.53 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
at-spi-2.0
-
10/28/2024 06:50:16 AM
rwxr-xr-x
π
at-spi2-atk
-
10/28/2024 06:50:16 AM
rwxr-xr-x
π
atk-1.0
-
10/28/2024 06:50:16 AM
rwxr-xr-x
π
autotest.h
6.05 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
btrfs
-
10/21/2019 03:49:20 PM
rwxr-xr-x
π
byteswap.h
1.37 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
c++
-
01/31/2023 12:38:15 PM
rwxr-xr-x
π
cairo
-
10/28/2024 06:50:19 AM
rwxr-xr-x
π
complex.h
7 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
cpio.h
2.21 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
crypt.h
2.21 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
ctype.h
10.71 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
dbus-1.0
-
10/28/2024 06:50:15 AM
rwxr-xr-x
π
dc1394
-
10/28/2024 06:50:34 AM
rwxr-xr-x
π
dirent.h
12.19 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
dlfcn.h
6.85 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
drm
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
elf.h
166.04 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
endian.h
3.11 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
entities.h
4.81 KB
08/30/2021 07:10:11 PM
rw-r--r--
π
envz.h
2.8 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
epoxy
-
10/28/2024 06:50:22 AM
rwxr-xr-x
π
err.h
2.16 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
errno.h
1.79 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
error.h
1.99 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
execinfo.h
1.49 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
expat.h
43.17 KB
11/18/2022 10:57:30 AM
rw-r--r--
π
expat_external.h
5.4 KB
11/18/2022 10:57:30 AM
rw-r--r--
π
fcntl.h
9.24 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
features.h
15.18 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
fenv.h
5.72 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
fmtmsg.h
3.16 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
fnmatch.h
2.24 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
fontconfig
-
01/31/2023 12:38:18 PM
rwxr-xr-x
π
freetype2
-
01/31/2023 12:38:18 PM
rwxr-xr-x
π
fstab.h
3.04 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
fts.h
8.18 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
ftw.h
5.13 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
gawkapi.h
30.31 KB
02/11/2018 05:02:41 AM
rw-r--r--
π
gconv.h
4.31 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
gd.h
56.42 KB
08/30/2021 07:10:11 PM
rw-r--r--
π
gd_color_map.h
478 bytes
08/30/2021 07:10:11 PM
rw-r--r--
π
gd_errors.h
1.47 KB
08/30/2021 07:10:11 PM
rw-r--r--
π
gd_io.h
3.05 KB
08/30/2021 07:10:11 PM
rw-r--r--
π
gdcache.h
2.83 KB
08/30/2021 07:10:11 PM
rw-r--r--
π
gdcm-2.8
-
10/28/2024 06:50:28 AM
rwxr-xr-x
π
gdfontg.h
553 bytes
08/30/2021 07:10:11 PM
rw-r--r--
π
gdfontl.h
551 bytes
08/30/2021 07:10:11 PM
rw-r--r--
π
gdfontmb.h
519 bytes
08/30/2021 07:10:11 PM
rw-r--r--
π
gdfonts.h
515 bytes
08/30/2021 07:10:11 PM
rw-r--r--
π
gdfontt.h
546 bytes
08/30/2021 07:10:11 PM
rw-r--r--
π
gdfx.h
497 bytes
08/30/2021 07:10:11 PM
rw-r--r--
π
gdk-pixbuf-2.0
-
10/28/2024 06:50:28 AM
rwxr-xr-x
π
gdpp.h
50.94 KB
08/30/2021 07:10:11 PM
rw-r--r--
π
getopt.h
1.43 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
gio-unix-2.0
-
10/28/2024 06:50:15 AM
rwxr-xr-x
π
glib-2.0
-
10/28/2024 06:50:15 AM
rwxr-xr-x
π
glob.h
6.46 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
glvnd
-
10/28/2024 06:50:20 AM
rwxr-xr-x
π
gnu-versions.h
2.29 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
gnumake.h
2.84 KB
04/17/2018 12:12:28 PM
rw-r--r--
π
gphoto2
-
10/28/2024 06:50:29 AM
rwxr-xr-x
π
graphite2
-
10/28/2024 06:50:29 AM
rwxr-xr-x
π
grp.h
6.53 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
gshadow.h
4.42 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
gtk-3.0
-
10/28/2024 06:50:32 AM
rwxr-xr-x
π
harfbuzz
-
10/28/2024 06:50:31 AM
rwxr-xr-x
π
iconv.h
1.81 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
icu-le-hb
-
10/28/2024 06:50:30 AM
rwxr-xr-x
π
ifaddrs.h
2.77 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
inttypes.h
11.61 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
jbig.h
9.55 KB
11/22/2022 04:58:49 PM
rw-r--r--
π
jbig85.h
6.78 KB
11/22/2022 04:58:49 PM
rw-r--r--
π
jbig_ar.h
2.21 KB
11/22/2022 04:58:49 PM
rw-r--r--
π
jerror.h
14.73 KB
09/21/2022 06:07:11 PM
rw-r--r--
π
jmorecfg.h
14.7 KB
09/21/2022 06:07:11 PM
rw-r--r--
π
jpegint.h
15.22 KB
07/07/2017 08:31:10 PM
rw-r--r--
π
jpeglib.h
48.71 KB
09/21/2022 06:07:11 PM
rw-r--r--
π
langinfo.h
17.43 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
lastlog.h
126 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
layout
-
10/28/2024 06:50:31 AM
rwxr-xr-x
π
libdrm
-
10/28/2024 06:50:20 AM
rwxr-xr-x
π
libexif
-
10/28/2024 06:50:22 AM
rwxr-xr-x
π
libgen.h
1.35 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
libintl.h
4.47 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
libio.h
918 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
libltdl
-
01/31/2023 12:34:20 PM
rwxr-xr-x
π
libpng
-
01/31/2023 12:38:17 PM
rwxr-xr-x
π
libpng16
-
01/31/2023 12:38:17 PM
rwxr-xr-x
π
libraw1394
-
10/28/2024 06:50:34 AM
rwxr-xr-x
π
libsync.h
3.38 KB
04/03/2020 12:28:15 PM
rw-r--r--
π
libv4l-plugin.h
1.72 KB
02/10/2018 12:46:51 PM
rw-r--r--
π
libv4l1-videodev.h
6.99 KB
02/10/2018 12:46:51 PM
rw-r--r--
π
libv4l1.h
2.85 KB
02/10/2018 12:46:51 PM
rw-r--r--
π
libv4l2.h
4.62 KB
02/10/2018 12:46:51 PM
rw-r--r--
π
libv4l2rds.h
14.31 KB
02/10/2018 12:46:51 PM
rw-r--r--
π
libv4lconvert.h
6.16 KB
02/10/2018 12:46:51 PM
rw-r--r--
π
limits.h
5.29 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
link.h
7.04 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
linux
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
locale.h
7.49 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
ltdl.h
5.58 KB
08/20/2016 12:34:31 PM
rw-r--r--
π
lzma
-
01/31/2023 12:38:19 PM
rwxr-xr-x
π
lzma.h
9.51 KB
04/08/2022 12:56:46 PM
rw-r--r--
π
malloc.h
5.96 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
math.h
44.33 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
mcheck.h
2.38 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
memory.h
955 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
misc
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
mntent.h
3.28 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
monetary.h
1.76 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
mqueue.h
3.67 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
mtd
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
net
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netash
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netatalk
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netax25
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netdb.h
27.39 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
neteconet
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netinet
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netipx
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netiucv
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netpacket
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netrom
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
netrose
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
nfs
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
nl_types.h
1.71 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
nss.h
1.83 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
obstack.h
20.81 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
odbcinst.h
17.85 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
odbcinstext.h
10.69 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
opencv
-
10/28/2024 06:50:42 AM
rwxr-xr-x
π
opencv2
-
10/28/2024 06:50:42 AM
rwxr-xr-x
π
pango-1.0
-
10/28/2024 06:50:31 AM
rwxr-xr-x
π
paths.h
2.91 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
pcre.h
30.96 KB
05/17/2022 07:42:45 AM
rw-r--r--
π
pcre_scanner.h
6.45 KB
05/17/2022 07:42:45 AM
rw-r--r--
π
pcre_stringpiece.h
6.16 KB
05/17/2022 07:42:45 AM
rw-r--r--
π
pcrecpp.h
26.02 KB
05/17/2022 07:42:45 AM
rw-r--r--
π
pcrecpparg.h
6.62 KB
05/17/2022 07:42:45 AM
rw-r--r--
π
pcreposix.h
5.5 KB
05/17/2022 07:42:45 AM
rw-r--r--
π
pixman-1
-
10/28/2024 06:50:19 AM
rwxr-xr-x
π
png.h
140.77 KB
04/30/2019 02:56:15 PM
rw-r--r--
π
pngconf.h
22.31 KB
04/30/2019 02:56:15 PM
rw-r--r--
π
pnglibconf.h
7.39 KB
04/30/2019 02:56:15 PM
rw-r--r--
π
poll.h
22 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
printf.h
6.64 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
proc_service.h
3.39 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
protocols
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
pthread.h
40.3 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
pty.h
1.53 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
pwd.h
5.89 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
python3.6
-
10/28/2024 08:45:52 AM
rwxr-xr-x
π
python3.6m
-
10/28/2024 08:45:52 AM
rwxr-xr-x
π
rdma
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
re_comp.h
962 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
regex.h
21.53 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
regexp.h
1.41 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
resolv.h
11.73 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
rpc
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
rpcsvc
-
01/31/2023 12:30:37 PM
rwxr-xr-x
π
sched.h
4.62 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
scsi
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
search.h
5.1 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
semaphore.h
2.34 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
setjmp.h
3.58 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
sgtty.h
1.31 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
shadow.h
5.08 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
signal.h
11.96 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
sound
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
spawn.h
6.53 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
sql.h
31.62 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
sqlext.h
81.3 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
sqlspi.h
6.82 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
sqltypes.h
10.88 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
sqlucode.h
21.16 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
stab.h
264 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
stdc-predef.h
2.31 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
stdint.h
8.42 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
stdio.h
28.97 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
stdio_ext.h
2.73 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
stdlib.h
34.95 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
string.h
17.13 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
strings.h
4.64 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
stropts.h
2.98 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
sudo_plugin.h
7.89 KB
04/04/2023 12:44:58 PM
rw-r--r--
π
syscall.h
25 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
sysexits.h
5.11 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
syslog.h
24 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
tar.h
3.7 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
tbb
-
10/28/2024 06:50:34 AM
rwxr-xr-x
π
termio.h
214 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
termios.h
3.51 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
tgmath.h
30.75 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
thread_db.h
15.65 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
time.h
10.12 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
ttyent.h
2.44 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
uchar.h
2.26 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
ucontext.h
1.89 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
ulimit.h
1.55 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
unicode
-
10/28/2024 06:50:31 AM
rwxr-xr-x
π
unistd.h
41.78 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
uodbc_extras.h
2.25 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
uodbc_stats.h
2.53 KB
03/26/2018 02:37:19 PM
rw-r--r--
π
ustat.h
23 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
utime.h
1.47 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
utmp.h
3.15 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
utmpx.h
4 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
values.h
1.91 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
video
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
vpx
-
01/31/2023 12:38:19 PM
rwxr-xr-x
π
wait.h
22 bytes
05/03/2022 10:19:39 AM
rw-r--r--
π
wayland-client-core.h
8.41 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-client-protocol.h
174.44 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-client.h
1.54 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-cursor.h
2.21 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-egl-core.h
1.75 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-egl.h
1.28 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-server-core.h
18.32 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-server-protocol.h
136.57 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-server.h
3.16 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-util.h
23.16 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wayland-version.h
1.32 KB
09/14/2022 01:57:23 PM
rw-r--r--
π
wchar.h
30.38 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
wctype.h
5.42 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
wordexp.h
2.44 KB
05/03/2022 10:19:39 AM
rw-r--r--
π
x86_64-linux-gnu
-
10/28/2024 06:50:44 AM
rwxr-xr-x
π
xcb
-
10/28/2024 06:50:21 AM
rwxr-xr-x
π
xen
-
05/09/2024 07:14:21 AM
rwxr-xr-x
π
xf86drm.h
34.65 KB
05/11/2020 12:47:23 PM
rw-r--r--
π
xf86drmMode.h
17.59 KB
04/03/2020 12:28:15 PM
rw-r--r--
π
xfs
-
04/18/2018 06:44:31 AM
rwxr-xr-x
π
xkbcommon
-
10/28/2024 06:50:32 AM
rwxr-xr-x
π
zconf.h
15.88 KB
08/16/2022 10:08:38 PM
rw-r--r--
π
zlib.h
94 KB
08/16/2022 10:08:38 PM
rw-r--r--
Editing: wayland-util.h
Close
/* * Copyright Β© 2008 Kristian HΓΈgsberg * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ /** \file wayland-util.h * * \brief Utility classes, functions, and macros. */ #ifndef WAYLAND_UTIL_H #define WAYLAND_UTIL_H #include <math.h> #include <stddef.h> #include <inttypes.h> #include <stdarg.h> #ifdef __cplusplus extern "C" { #endif /** Visibility attribute */ #if defined(__GNUC__) && __GNUC__ >= 4 #define WL_EXPORT __attribute__ ((visibility("default"))) #else #define WL_EXPORT #endif /** Deprecated attribute */ #if defined(__GNUC__) && __GNUC__ >= 4 #define WL_DEPRECATED __attribute__ ((deprecated)) #else #define WL_DEPRECATED #endif /** * Printf-style argument attribute * * \param x Ordinality of the format string argument * \param y Ordinality of the argument to check against the format string * * \sa https://gcc.gnu.org/onlinedocs/gcc-3.2.1/gcc/Function-Attributes.html */ #if defined(__GNUC__) && __GNUC__ >= 4 #define WL_PRINTF(x, y) __attribute__((__format__(__printf__, x, y))) #else #define WL_PRINTF(x, y) #endif /** * Protocol message signature * * A wl_message describes the signature of an actual protocol message, such as a * request or event, that adheres to the Wayland protocol wire format. The * protocol implementation uses a wl_message within its demarshal machinery for * decoding messages between a compositor and its clients. In a sense, a * wl_message is to a protocol message like a class is to an object. * * The `name` of a wl_message is the name of the corresponding protocol message. * * The `signature` is an ordered list of symbols representing the data types * of message arguments and, optionally, a protocol version and indicators for * nullability. A leading integer in the `signature` indicates the _since_ * version of the protocol message. A `?` preceding a data type symbol indicates * that the following argument type is nullable. While it is a protocol violation * to send messages with non-nullable arguments set to `NULL`, event handlers in * clients might still get called with non-nullable object arguments set to * `NULL`. This can happen when the client destroyed the object being used as * argument on its side and an event referencing that object was sent before the * server knew about its destruction. As this race cannot be prevented, clients * should - as a general rule - program their event handlers such that they can * handle object arguments declared non-nullable being `NULL` gracefully. * * When no arguments accompany a message, `signature` is an empty string. * * Symbols: * * * `i`: int * * `u`: uint * * `f`: fixed * * `s`: string * * `o`: object * * `n`: new_id * * `a`: array * * `h`: fd * * `?`: following argument is nullable * * While demarshaling primitive arguments is straightforward, when demarshaling * messages containing `object` or `new_id` arguments, the protocol * implementation often must determine the type of the object. The `types` of a * wl_message is an array of wl_interface references that correspond to `o` and * `n` arguments in `signature`, with `NULL` placeholders for arguments with * non-object types. * * Consider the protocol event wl_display `delete_id` that has a single `uint` * argument. The wl_message is: * * \code * { "delete_id", "u", [NULL] } * \endcode * * Here, the message `name` is `"delete_id"`, the `signature` is `"u"`, and the * argument `types` is `[NULL]`, indicating that the `uint` argument has no * corresponding wl_interface since it is a primitive argument. * * In contrast, consider a `wl_foo` interface supporting protocol request `bar` * that has existed since version 2, and has two arguments: a `uint` and an * object of type `wl_baz_interface` that may be `NULL`. Such a `wl_message` * might be: * * \code * { "bar", "2u?o", [NULL, &wl_baz_interface] } * \endcode * * Here, the message `name` is `"bar"`, and the `signature` is `"2u?o"`. Notice * how the `2` indicates the protocol version, the `u` indicates the first * argument type is `uint`, and the `?o` indicates that the second argument * is an object that may be `NULL`. Lastly, the argument `types` array indicates * that no wl_interface corresponds to the first argument, while the type * `wl_baz_interface` corresponds to the second argument. * * \sa wl_argument * \sa wl_interface * \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Wire-Format">Wire Format</a> */ struct wl_message { /** Message name */ const char *name; /** Message signature */ const char *signature; /** Object argument interfaces */ const struct wl_interface **types; }; /** * Protocol object interface * * A wl_interface describes the API of a protocol object defined in the Wayland * protocol specification. The protocol implementation uses a wl_interface * within its marshalling machinery for encoding client requests. * * The `name` of a wl_interface is the name of the corresponding protocol * interface, and `version` represents the version of the interface. The members * `method_count` and `event_count` represent the number of `methods` (requests) * and `events` in the respective wl_message members. * * For example, consider a protocol interface `foo`, marked as version `1`, with * two requests and one event. * * \code * <interface name="foo" version="1"> * <request name="a"></request> * <request name="b"></request> * <event name="c"></event> * </interface> * \endcode * * Given two wl_message arrays `foo_requests` and `foo_events`, a wl_interface * for `foo` might be: * * \code * struct wl_interface foo_interface = { * "foo", 1, * 2, foo_requests, * 1, foo_events * }; * \endcode * * \note The server side of the protocol may define interface <em>implementation * types</em> that incorporate the term `interface` in their name. Take * care to not confuse these server-side `struct`s with a wl_interface * variable whose name also ends in `interface`. For example, while the * server may define a type `struct wl_foo_interface`, the client may * define a `struct wl_interface wl_foo_interface`. * * \sa wl_message * \sa wl_proxy * \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Interfaces">Interfaces</a> * \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-Versioning">Versioning</a> */ struct wl_interface { /** Interface name */ const char *name; /** Interface version */ int version; /** Number of methods (requests) */ int method_count; /** Method (request) signatures */ const struct wl_message *methods; /** Number of events */ int event_count; /** Event signatures */ const struct wl_message *events; }; /** \class wl_list * * \brief Doubly-linked list * * On its own, an instance of `struct wl_list` represents the sentinel head of * a doubly-linked list, and must be initialized using wl_list_init(). * When empty, the list head's `next` and `prev` members point to the list head * itself, otherwise `next` references the first element in the list, and `prev` * refers to the last element in the list. * * Use the `struct wl_list` type to represent both the list head and the links * between elements within the list. Use wl_list_empty() to determine if the * list is empty in O(1). * * All elements in the list must be of the same type. The element type must have * a `struct wl_list` member, often named `link` by convention. Prior to * insertion, there is no need to initialize an element's `link` - invoking * wl_list_init() on an individual list element's `struct wl_list` member is * unnecessary if the very next operation is wl_list_insert(). However, a * common idiom is to initialize an element's `link` prior to removal - ensure * safety by invoking wl_list_init() before wl_list_remove(). * * Consider a list reference `struct wl_list foo_list`, an element type as * `struct element`, and an element's link member as `struct wl_list link`. * * The following code initializes a list and adds three elements to it. * * \code * struct wl_list foo_list; * * struct element { * int foo; * struct wl_list link; * }; * struct element e1, e2, e3; * * wl_list_init(&foo_list); * wl_list_insert(&foo_list, &e1.link); // e1 is the first element * wl_list_insert(&foo_list, &e2.link); // e2 is now the first element * wl_list_insert(&e2.link, &e3.link); // insert e3 after e2 * \endcode * * The list now looks like <em>[e2, e3, e1]</em>. * * The `wl_list` API provides some iterator macros. For example, to iterate * a list in ascending order: * * \code * struct element *e; * wl_list_for_each(e, foo_list, link) { * do_something_with_element(e); * } * \endcode * * See the documentation of each iterator for details. * \sa http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/linux/list.h */ struct wl_list { /** Previous list element */ struct wl_list *prev; /** Next list element */ struct wl_list *next; }; /** * Initializes the list. * * \param list List to initialize * * \memberof wl_list */ void wl_list_init(struct wl_list *list); /** * Inserts an element into the list, after the element represented by \p list. * When \p list is a reference to the list itself (the head), set the containing * struct of \p elm as the first element in the list. * * \note If \p elm is already part of a list, inserting it again will lead to * list corruption. * * \param list List element after which the new element is inserted * \param elm Link of the containing struct to insert into the list * * \memberof wl_list */ void wl_list_insert(struct wl_list *list, struct wl_list *elm); /** * Removes an element from the list. * * \note This operation leaves \p elm in an invalid state. * * \param elm Link of the containing struct to remove from the list * * \memberof wl_list */ void wl_list_remove(struct wl_list *elm); /** * Determines the length of the list. * * \note This is an O(n) operation. * * \param list List whose length is to be determined * * \return Number of elements in the list * * \memberof wl_list */ int wl_list_length(const struct wl_list *list); /** * Determines if the list is empty. * * \param list List whose emptiness is to be determined * * \return 1 if empty, or 0 if not empty * * \memberof wl_list */ int wl_list_empty(const struct wl_list *list); /** * Inserts all of the elements of one list into another, after the element * represented by \p list. * * \note This leaves \p other in an invalid state. * * \param list List element after which the other list elements will be inserted * \param other List of elements to insert * * \memberof wl_list */ void wl_list_insert_list(struct wl_list *list, struct wl_list *other); /** * Retrieves a pointer to a containing struct, given a member name. * * This macro allows "conversion" from a pointer to a member to its containing * struct. This is useful if you have a contained item like a wl_list, * wl_listener, or wl_signal, provided via a callback or other means, and would * like to retrieve the struct that contains it. * * To demonstrate, the following example retrieves a pointer to * `example_container` given only its `destroy_listener` member: * * \code * struct example_container { * struct wl_listener destroy_listener; * // other members... * }; * * void example_container_destroy(struct wl_listener *listener, void *data) * { * struct example_container *ctr; * * ctr = wl_container_of(listener, ctr, destroy_listener); * // destroy ctr... * } * \endcode * * \note `sample` need not be a valid pointer. A null or uninitialised pointer * is sufficient. * * \param ptr Valid pointer to the contained member * \param sample Pointer to a struct whose type contains \p ptr * \param member Named location of \p ptr within the \p sample type * * \return The container for the specified pointer */ #define wl_container_of(ptr, sample, member) \ (__typeof__(sample))((char *)(ptr) - \ offsetof(__typeof__(*sample), member)) /** * Iterates over a list. * * This macro expresses a for-each iterator for wl_list. Given a list and * wl_list link member name (often named `link` by convention), this macro * assigns each element in the list to \p pos, which can then be referenced in * a trailing code block. For example, given a wl_list of `struct message` * elements: * * \code * struct message { * char *contents; * wl_list link; * }; * * struct wl_list *message_list; * // Assume message_list now "contains" many messages * * struct message *m; * wl_list_for_each(m, message_list, link) { * do_something_with_message(m); * } * \endcode * * \param pos Cursor that each list element will be assigned to * \param head Head of the list to iterate over * \param member Name of the link member within the element struct * * \relates wl_list */ #define wl_list_for_each(pos, head, member) \ for (pos = wl_container_of((head)->next, pos, member); \ &pos->member != (head); \ pos = wl_container_of(pos->member.next, pos, member)) /** * Iterates over a list, safe against removal of the list element. * * \note Only removal of the current element, \p pos, is safe. Removing * any other element during traversal may lead to a loop malfunction. * * \sa wl_list_for_each() * * \param pos Cursor that each list element will be assigned to * \param tmp Temporary pointer of the same type as \p pos * \param head Head of the list to iterate over * \param member Name of the link member within the element struct * * \relates wl_list */ #define wl_list_for_each_safe(pos, tmp, head, member) \ for (pos = wl_container_of((head)->next, pos, member), \ tmp = wl_container_of((pos)->member.next, tmp, member); \ &pos->member != (head); \ pos = tmp, \ tmp = wl_container_of(pos->member.next, tmp, member)) /** * Iterates backwards over a list. * * \sa wl_list_for_each() * * \param pos Cursor that each list element will be assigned to * \param head Head of the list to iterate over * \param member Name of the link member within the element struct * * \relates wl_list */ #define wl_list_for_each_reverse(pos, head, member) \ for (pos = wl_container_of((head)->prev, pos, member); \ &pos->member != (head); \ pos = wl_container_of(pos->member.prev, pos, member)) /** * Iterates backwards over a list, safe against removal of the list element. * * \note Only removal of the current element, \p pos, is safe. Removing * any other element during traversal may lead to a loop malfunction. * * \sa wl_list_for_each() * * \param pos Cursor that each list element will be assigned to * \param tmp Temporary pointer of the same type as \p pos * \param head Head of the list to iterate over * \param member Name of the link member within the element struct * * \relates wl_list */ #define wl_list_for_each_reverse_safe(pos, tmp, head, member) \ for (pos = wl_container_of((head)->prev, pos, member), \ tmp = wl_container_of((pos)->member.prev, tmp, member); \ &pos->member != (head); \ pos = tmp, \ tmp = wl_container_of(pos->member.prev, tmp, member)) /** * \class wl_array * * Dynamic array * * A wl_array is a dynamic array that can only grow until released. It is * intended for relatively small allocations whose size is variable or not known * in advance. While construction of a wl_array does not require all elements to * be of the same size, wl_array_for_each() does require all elements to have * the same type and size. * */ struct wl_array { /** Array size */ size_t size; /** Allocated space */ size_t alloc; /** Array data */ void *data; }; /** * Initializes the array. * * \param array Array to initialize * * \memberof wl_array */ void wl_array_init(struct wl_array *array); /** * Releases the array data. * * \note Leaves the array in an invalid state. * * \param array Array whose data is to be released * * \memberof wl_array */ void wl_array_release(struct wl_array *array); /** * Increases the size of the array by \p size bytes. * * \param array Array whose size is to be increased * \param size Number of bytes to increase the size of the array by * * \return A pointer to the beginning of the newly appended space, or NULL when * resizing fails. * * \memberof wl_array */ void * wl_array_add(struct wl_array *array, size_t size); /** * Copies the contents of \p source to \p array. * * \param array Destination array to copy to * \param source Source array to copy from * * \return 0 on success, or -1 on failure * * \memberof wl_array */ int wl_array_copy(struct wl_array *array, struct wl_array *source); /** * Iterates over an array. * * This macro expresses a for-each iterator for wl_array. It assigns each * element in the array to \p pos, which can then be referenced in a trailing * code block. \p pos must be a pointer to the array element type, and all * array elements must be of the same type and size. * * \param pos Cursor that each array element will be assigned to * \param array Array to iterate over * * \relates wl_array * \sa wl_list_for_each() */ #define wl_array_for_each(pos, array) \ for (pos = (array)->data; \ (const char *) pos < ((const char *) (array)->data + (array)->size); \ (pos)++) /** * Fixed-point number * * A `wl_fixed_t` is a 24.8 signed fixed-point number with a sign bit, 23 bits * of integer precision and 8 bits of decimal precision. Consider `wl_fixed_t` * as an opaque struct with methods that facilitate conversion to and from * `double` and `int` types. */ typedef int32_t wl_fixed_t; /** * Converts a fixed-point number to a floating-point number. * * \param f Fixed-point number to convert * * \return Floating-point representation of the fixed-point argument */ static inline double wl_fixed_to_double(wl_fixed_t f) { union { double d; int64_t i; } u; u.i = ((1023LL + 44LL) << 52) + (1LL << 51) + f; return u.d - (3LL << 43); } /** * Converts a floating-point number to a fixed-point number. * * \param d Floating-point number to convert * * \return Fixed-point representation of the floating-point argument */ static inline wl_fixed_t wl_fixed_from_double(double d) { union { double d; int64_t i; } u; u.d = d + (3LL << (51 - 8)); return u.i; } /** * Converts a fixed-point number to an integer. * * \param f Fixed-point number to convert * * \return Integer component of the fixed-point argument */ static inline int wl_fixed_to_int(wl_fixed_t f) { return f / 256; } /** * Converts an integer to a fixed-point number. * * \param i Integer to convert * * \return Fixed-point representation of the integer argument */ static inline wl_fixed_t wl_fixed_from_int(int i) { return i * 256; } /** * Protocol message argument data types * * This union represents all of the argument types in the Wayland protocol wire * format. The protocol implementation uses wl_argument within its marshalling * machinery for dispatching messages between a client and a compositor. * * \sa wl_message * \sa wl_interface * \sa <a href="https://wayland.freedesktop.org/docs/html/ch04.html#sect-Protocol-wire-Format">Wire Format</a> */ union wl_argument { int32_t i; /**< `int` */ uint32_t u; /**< `uint` */ wl_fixed_t f; /**< `fixed` */ const char *s; /**< `string` */ struct wl_object *o; /**< `object` */ uint32_t n; /**< `new_id` */ struct wl_array *a; /**< `array` */ int32_t h; /**< `fd` */ }; /** * Dispatcher function type alias * * A dispatcher is a function that handles the emitting of callbacks in client * code. For programs directly using the C library, this is done by using * libffi to call function pointers. When binding to languages other than C, * dispatchers provide a way to abstract the function calling process to be * friendlier to other function calling systems. * * A dispatcher takes five arguments: The first is the dispatcher-specific * implementation associated with the target object. The second is the object * upon which the callback is being invoked (either wl_proxy or wl_resource). * The third and fourth arguments are the opcode and the wl_message * corresponding to the callback. The final argument is an array of arguments * received from the other process via the wire protocol. * * \param "const void *" Dispatcher-specific implementation data * \param "void *" Callback invocation target (wl_proxy or `wl_resource`) * \param uint32_t Callback opcode * \param "const struct wl_message *" Callback message signature * \param "union wl_argument *" Array of received arguments * * \return 0 on success, or -1 on failure */ typedef int (*wl_dispatcher_func_t)(const void *, void *, uint32_t, const struct wl_message *, union wl_argument *); /** * Log function type alias * * The C implementation of the Wayland protocol abstracts the details of * logging. Users may customize the logging behavior, with a function conforming * to the `wl_log_func_t` type, via `wl_log_set_handler_client` and * `wl_log_set_handler_server`. * * A `wl_log_func_t` must conform to the expectations of `vprintf`, and * expects two arguments: a string to write and a corresponding variable * argument list. While the string to write may contain format specifiers and * use values in the variable argument list, the behavior of any `wl_log_func_t` * depends on the implementation. * * \note Take care to not confuse this with `wl_protocol_logger_func_t`, which * is a specific server-side logger for requests and events. * * \param "const char *" String to write to the log, containing optional format * specifiers * \param "va_list" Variable argument list * * \sa wl_log_set_handler_client * \sa wl_log_set_handler_server */ typedef void (*wl_log_func_t)(const char *, va_list) WL_PRINTF(1, 0); /** * Return value of an iterator function * * \sa wl_client_for_each_resource_iterator_func_t * \sa wl_client_for_each_resource */ enum wl_iterator_result { /** Stop the iteration */ WL_ITERATOR_STOP, /** Continue the iteration */ WL_ITERATOR_CONTINUE }; #ifdef __cplusplus } #endif #endif