uringmachine 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. checksums.yaml +7 -0
  2. data/.github/dependabot.yml +12 -0
  3. data/.github/workflows/test.yml +35 -0
  4. data/.gitignore +59 -0
  5. data/.gitmodules +3 -0
  6. data/CHANGELOG.md +7 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +21 -0
  9. data/README.md +11 -0
  10. data/Rakefile +39 -0
  11. data/TODO.md +0 -0
  12. data/examples/echo_server.rb +52 -0
  13. data/examples/event_loop.rb +69 -0
  14. data/examples/fibers.rb +105 -0
  15. data/examples/http_server.rb +56 -0
  16. data/examples/http_server_multishot.rb +57 -0
  17. data/examples/http_server_simpler.rb +34 -0
  18. data/ext/um/extconf.rb +71 -0
  19. data/ext/um/iou.h +101 -0
  20. data/ext/um/op_ctx.c +138 -0
  21. data/ext/um/ring.c +755 -0
  22. data/ext/um/um.c +267 -0
  23. data/ext/um/um.h +97 -0
  24. data/ext/um/um_class.c +175 -0
  25. data/ext/um/um_ext.c +11 -0
  26. data/ext/um/um_op.c +87 -0
  27. data/ext/um/um_utils.c +23 -0
  28. data/lib/uringmachine/version.rb +3 -0
  29. data/lib/uringmachine.rb +8 -0
  30. data/test/helper.rb +70 -0
  31. data/test/test_iou.rb +876 -0
  32. data/test/test_um.rb +168 -0
  33. data/uringmachine.gemspec +27 -0
  34. data/vendor/liburing/.github/actions/codespell/stopwords +7 -0
  35. data/vendor/liburing/.github/pull_request_template.md +86 -0
  36. data/vendor/liburing/.github/workflows/build.yml +137 -0
  37. data/vendor/liburing/.github/workflows/codespell.yml +25 -0
  38. data/vendor/liburing/.github/workflows/shellcheck.yml +20 -0
  39. data/vendor/liburing/.gitignore +41 -0
  40. data/vendor/liburing/CHANGELOG +111 -0
  41. data/vendor/liburing/CITATION.cff +11 -0
  42. data/vendor/liburing/COPYING +502 -0
  43. data/vendor/liburing/COPYING.GPL +339 -0
  44. data/vendor/liburing/LICENSE +20 -0
  45. data/vendor/liburing/Makefile +96 -0
  46. data/vendor/liburing/Makefile.common +7 -0
  47. data/vendor/liburing/Makefile.quiet +11 -0
  48. data/vendor/liburing/README +106 -0
  49. data/vendor/liburing/SECURITY.md +6 -0
  50. data/vendor/liburing/configure +624 -0
  51. data/vendor/liburing/debian/README.Debian +7 -0
  52. data/vendor/liburing/debian/changelog +38 -0
  53. data/vendor/liburing/debian/control +39 -0
  54. data/vendor/liburing/debian/copyright +49 -0
  55. data/vendor/liburing/debian/liburing-dev.install +4 -0
  56. data/vendor/liburing/debian/liburing-dev.manpages +5 -0
  57. data/vendor/liburing/debian/liburing2.install +1 -0
  58. data/vendor/liburing/debian/liburing2.symbols +56 -0
  59. data/vendor/liburing/debian/patches/series +1 -0
  60. data/vendor/liburing/debian/rules +29 -0
  61. data/vendor/liburing/debian/source/format +1 -0
  62. data/vendor/liburing/debian/source/local-options +2 -0
  63. data/vendor/liburing/debian/source/options +1 -0
  64. data/vendor/liburing/debian/watch +3 -0
  65. data/vendor/liburing/examples/Makefile +53 -0
  66. data/vendor/liburing/examples/helpers.c +62 -0
  67. data/vendor/liburing/examples/helpers.h +7 -0
  68. data/vendor/liburing/examples/io_uring-close-test.c +123 -0
  69. data/vendor/liburing/examples/io_uring-cp.c +282 -0
  70. data/vendor/liburing/examples/io_uring-test.c +112 -0
  71. data/vendor/liburing/examples/io_uring-udp.c +403 -0
  72. data/vendor/liburing/examples/link-cp.c +193 -0
  73. data/vendor/liburing/examples/napi-busy-poll-client.c +509 -0
  74. data/vendor/liburing/examples/napi-busy-poll-server.c +450 -0
  75. data/vendor/liburing/examples/poll-bench.c +101 -0
  76. data/vendor/liburing/examples/proxy.c +2461 -0
  77. data/vendor/liburing/examples/proxy.h +102 -0
  78. data/vendor/liburing/examples/rsrc-update-bench.c +100 -0
  79. data/vendor/liburing/examples/send-zerocopy.c +658 -0
  80. data/vendor/liburing/examples/ucontext-cp.c +258 -0
  81. data/vendor/liburing/liburing-ffi.pc.in +12 -0
  82. data/vendor/liburing/liburing.pc.in +12 -0
  83. data/vendor/liburing/liburing.spec +66 -0
  84. data/vendor/liburing/make-debs.sh +55 -0
  85. data/vendor/liburing/src/Makefile +129 -0
  86. data/vendor/liburing/src/arch/aarch64/lib.h +47 -0
  87. data/vendor/liburing/src/arch/aarch64/syscall.h +91 -0
  88. data/vendor/liburing/src/arch/generic/lib.h +17 -0
  89. data/vendor/liburing/src/arch/generic/syscall.h +100 -0
  90. data/vendor/liburing/src/arch/riscv64/lib.h +48 -0
  91. data/vendor/liburing/src/arch/riscv64/syscall.h +100 -0
  92. data/vendor/liburing/src/arch/syscall-defs.h +94 -0
  93. data/vendor/liburing/src/arch/x86/lib.h +11 -0
  94. data/vendor/liburing/src/arch/x86/syscall.h +296 -0
  95. data/vendor/liburing/src/ffi.c +15 -0
  96. data/vendor/liburing/src/include/liburing/barrier.h +81 -0
  97. data/vendor/liburing/src/include/liburing/io_uring.h +818 -0
  98. data/vendor/liburing/src/include/liburing.h +1602 -0
  99. data/vendor/liburing/src/int_flags.h +11 -0
  100. data/vendor/liburing/src/lib.h +52 -0
  101. data/vendor/liburing/src/liburing-ffi.map +211 -0
  102. data/vendor/liburing/src/liburing.map +104 -0
  103. data/vendor/liburing/src/nolibc.c +55 -0
  104. data/vendor/liburing/src/queue.c +468 -0
  105. data/vendor/liburing/src/register.c +374 -0
  106. data/vendor/liburing/src/setup.c +689 -0
  107. data/vendor/liburing/src/setup.h +9 -0
  108. data/vendor/liburing/src/syscall.c +29 -0
  109. data/vendor/liburing/src/syscall.h +53 -0
  110. data/vendor/liburing/src/version.c +21 -0
  111. data/vendor/liburing/test/232c93d07b74.c +305 -0
  112. data/vendor/liburing/test/35fa71a030ca.c +329 -0
  113. data/vendor/liburing/test/500f9fbadef8.c +91 -0
  114. data/vendor/liburing/test/7ad0e4b2f83c.c +94 -0
  115. data/vendor/liburing/test/8a9973408177.c +107 -0
  116. data/vendor/liburing/test/917257daa0fe.c +54 -0
  117. data/vendor/liburing/test/Makefile +297 -0
  118. data/vendor/liburing/test/a0908ae19763.c +59 -0
  119. data/vendor/liburing/test/a4c0b3decb33.c +181 -0
  120. data/vendor/liburing/test/accept-link.c +255 -0
  121. data/vendor/liburing/test/accept-non-empty.c +256 -0
  122. data/vendor/liburing/test/accept-reuse.c +163 -0
  123. data/vendor/liburing/test/accept-test.c +83 -0
  124. data/vendor/liburing/test/accept.c +919 -0
  125. data/vendor/liburing/test/across-fork.c +284 -0
  126. data/vendor/liburing/test/b19062a56726.c +54 -0
  127. data/vendor/liburing/test/b5837bd5311d.c +78 -0
  128. data/vendor/liburing/test/bind-listen.c +408 -0
  129. data/vendor/liburing/test/buf-ring-nommap.c +123 -0
  130. data/vendor/liburing/test/buf-ring-put.c +83 -0
  131. data/vendor/liburing/test/buf-ring.c +473 -0
  132. data/vendor/liburing/test/ce593a6c480a.c +139 -0
  133. data/vendor/liburing/test/close-opath.c +123 -0
  134. data/vendor/liburing/test/config +14 -0
  135. data/vendor/liburing/test/connect-rep.c +204 -0
  136. data/vendor/liburing/test/connect.c +442 -0
  137. data/vendor/liburing/test/coredump.c +60 -0
  138. data/vendor/liburing/test/cq-full.c +97 -0
  139. data/vendor/liburing/test/cq-overflow.c +530 -0
  140. data/vendor/liburing/test/cq-peek-batch.c +103 -0
  141. data/vendor/liburing/test/cq-ready.c +95 -0
  142. data/vendor/liburing/test/cq-size.c +65 -0
  143. data/vendor/liburing/test/d4ae271dfaae.c +96 -0
  144. data/vendor/liburing/test/d77a67ed5f27.c +65 -0
  145. data/vendor/liburing/test/defer-taskrun.c +391 -0
  146. data/vendor/liburing/test/defer-tw-timeout.c +173 -0
  147. data/vendor/liburing/test/defer.c +319 -0
  148. data/vendor/liburing/test/double-poll-crash.c +195 -0
  149. data/vendor/liburing/test/drop-submit.c +94 -0
  150. data/vendor/liburing/test/eeed8b54e0df.c +120 -0
  151. data/vendor/liburing/test/empty-eownerdead.c +45 -0
  152. data/vendor/liburing/test/eploop.c +74 -0
  153. data/vendor/liburing/test/eventfd-disable.c +179 -0
  154. data/vendor/liburing/test/eventfd-reg.c +77 -0
  155. data/vendor/liburing/test/eventfd-ring.c +98 -0
  156. data/vendor/liburing/test/eventfd.c +113 -0
  157. data/vendor/liburing/test/evloop.c +73 -0
  158. data/vendor/liburing/test/exec-target.c +6 -0
  159. data/vendor/liburing/test/exit-no-cleanup.c +117 -0
  160. data/vendor/liburing/test/fadvise.c +202 -0
  161. data/vendor/liburing/test/fallocate.c +265 -0
  162. data/vendor/liburing/test/fc2a85cb02ef.c +132 -0
  163. data/vendor/liburing/test/fd-install.c +500 -0
  164. data/vendor/liburing/test/fd-pass.c +237 -0
  165. data/vendor/liburing/test/fdinfo.c +419 -0
  166. data/vendor/liburing/test/file-register.c +1189 -0
  167. data/vendor/liburing/test/file-update.c +231 -0
  168. data/vendor/liburing/test/file-verify.c +654 -0
  169. data/vendor/liburing/test/files-exit-hang-poll.c +114 -0
  170. data/vendor/liburing/test/files-exit-hang-timeout.c +137 -0
  171. data/vendor/liburing/test/fixed-buf-iter.c +115 -0
  172. data/vendor/liburing/test/fixed-buf-merge.c +101 -0
  173. data/vendor/liburing/test/fixed-hugepage.c +411 -0
  174. data/vendor/liburing/test/fixed-link.c +90 -0
  175. data/vendor/liburing/test/fixed-reuse.c +160 -0
  176. data/vendor/liburing/test/fpos.c +255 -0
  177. data/vendor/liburing/test/fsnotify.c +118 -0
  178. data/vendor/liburing/test/fsync.c +224 -0
  179. data/vendor/liburing/test/futex.c +571 -0
  180. data/vendor/liburing/test/hardlink.c +170 -0
  181. data/vendor/liburing/test/helpers.c +318 -0
  182. data/vendor/liburing/test/helpers.h +108 -0
  183. data/vendor/liburing/test/ignore-single-mmap.c +48 -0
  184. data/vendor/liburing/test/init-mem.c +164 -0
  185. data/vendor/liburing/test/io-cancel.c +561 -0
  186. data/vendor/liburing/test/io_uring_enter.c +264 -0
  187. data/vendor/liburing/test/io_uring_passthrough.c +482 -0
  188. data/vendor/liburing/test/io_uring_register.c +503 -0
  189. data/vendor/liburing/test/io_uring_setup.c +110 -0
  190. data/vendor/liburing/test/iopoll-leak.c +85 -0
  191. data/vendor/liburing/test/iopoll-overflow.c +118 -0
  192. data/vendor/liburing/test/iopoll.c +465 -0
  193. data/vendor/liburing/test/lfs-openat-write.c +119 -0
  194. data/vendor/liburing/test/lfs-openat.c +273 -0
  195. data/vendor/liburing/test/link-timeout.c +1108 -0
  196. data/vendor/liburing/test/link.c +497 -0
  197. data/vendor/liburing/test/link_drain.c +255 -0
  198. data/vendor/liburing/test/madvise.c +195 -0
  199. data/vendor/liburing/test/min-timeout-wait.c +354 -0
  200. data/vendor/liburing/test/min-timeout.c +233 -0
  201. data/vendor/liburing/test/mkdir.c +112 -0
  202. data/vendor/liburing/test/msg-ring-fd.c +331 -0
  203. data/vendor/liburing/test/msg-ring-flags.c +212 -0
  204. data/vendor/liburing/test/msg-ring-overflow.c +159 -0
  205. data/vendor/liburing/test/msg-ring.c +467 -0
  206. data/vendor/liburing/test/multicqes_drain.c +429 -0
  207. data/vendor/liburing/test/napi-test.c +215 -0
  208. data/vendor/liburing/test/napi-test.sh +48 -0
  209. data/vendor/liburing/test/no-mmap-inval.c +42 -0
  210. data/vendor/liburing/test/nolibc.c +62 -0
  211. data/vendor/liburing/test/nop-all-sizes.c +99 -0
  212. data/vendor/liburing/test/nop.c +177 -0
  213. data/vendor/liburing/test/nvme.h +169 -0
  214. data/vendor/liburing/test/ooo-file-unreg.c +82 -0
  215. data/vendor/liburing/test/open-close.c +261 -0
  216. data/vendor/liburing/test/open-direct-link.c +188 -0
  217. data/vendor/liburing/test/open-direct-pick.c +180 -0
  218. data/vendor/liburing/test/openat2.c +312 -0
  219. data/vendor/liburing/test/personality.c +204 -0
  220. data/vendor/liburing/test/pipe-bug.c +95 -0
  221. data/vendor/liburing/test/pipe-eof.c +83 -0
  222. data/vendor/liburing/test/pipe-reuse.c +105 -0
  223. data/vendor/liburing/test/poll-cancel-all.c +496 -0
  224. data/vendor/liburing/test/poll-cancel-ton.c +135 -0
  225. data/vendor/liburing/test/poll-cancel.c +228 -0
  226. data/vendor/liburing/test/poll-link.c +221 -0
  227. data/vendor/liburing/test/poll-many.c +230 -0
  228. data/vendor/liburing/test/poll-mshot-overflow.c +265 -0
  229. data/vendor/liburing/test/poll-mshot-update.c +323 -0
  230. data/vendor/liburing/test/poll-race-mshot.c +276 -0
  231. data/vendor/liburing/test/poll-race.c +105 -0
  232. data/vendor/liburing/test/poll-ring.c +48 -0
  233. data/vendor/liburing/test/poll-v-poll.c +353 -0
  234. data/vendor/liburing/test/poll.c +327 -0
  235. data/vendor/liburing/test/probe.c +135 -0
  236. data/vendor/liburing/test/read-before-exit.c +129 -0
  237. data/vendor/liburing/test/read-mshot-empty.c +153 -0
  238. data/vendor/liburing/test/read-mshot.c +404 -0
  239. data/vendor/liburing/test/read-write.c +1013 -0
  240. data/vendor/liburing/test/recv-msgall-stream.c +398 -0
  241. data/vendor/liburing/test/recv-msgall.c +263 -0
  242. data/vendor/liburing/test/recv-multishot.c +602 -0
  243. data/vendor/liburing/test/recvsend_bundle.c +691 -0
  244. data/vendor/liburing/test/reg-fd-only.c +131 -0
  245. data/vendor/liburing/test/reg-hint.c +56 -0
  246. data/vendor/liburing/test/reg-reg-ring.c +90 -0
  247. data/vendor/liburing/test/regbuf-merge.c +91 -0
  248. data/vendor/liburing/test/register-restrictions.c +633 -0
  249. data/vendor/liburing/test/rename.c +132 -0
  250. data/vendor/liburing/test/ring-leak.c +283 -0
  251. data/vendor/liburing/test/ring-leak2.c +249 -0
  252. data/vendor/liburing/test/ringbuf-read.c +196 -0
  253. data/vendor/liburing/test/ringbuf-status.c +242 -0
  254. data/vendor/liburing/test/rsrc_tags.c +461 -0
  255. data/vendor/liburing/test/runtests-loop.sh +16 -0
  256. data/vendor/liburing/test/runtests-quiet.sh +11 -0
  257. data/vendor/liburing/test/runtests.sh +168 -0
  258. data/vendor/liburing/test/rw_merge_test.c +98 -0
  259. data/vendor/liburing/test/self.c +91 -0
  260. data/vendor/liburing/test/send-zerocopy.c +971 -0
  261. data/vendor/liburing/test/send_recv.c +412 -0
  262. data/vendor/liburing/test/send_recvmsg.c +444 -0
  263. data/vendor/liburing/test/shared-wq.c +84 -0
  264. data/vendor/liburing/test/short-read.c +75 -0
  265. data/vendor/liburing/test/shutdown.c +165 -0
  266. data/vendor/liburing/test/sigfd-deadlock.c +88 -0
  267. data/vendor/liburing/test/single-issuer.c +169 -0
  268. data/vendor/liburing/test/skip-cqe.c +428 -0
  269. data/vendor/liburing/test/socket-getsetsock-cmd.c +346 -0
  270. data/vendor/liburing/test/socket-io-cmd.c +237 -0
  271. data/vendor/liburing/test/socket-rw-eagain.c +149 -0
  272. data/vendor/liburing/test/socket-rw-offset.c +149 -0
  273. data/vendor/liburing/test/socket-rw.c +137 -0
  274. data/vendor/liburing/test/socket.c +408 -0
  275. data/vendor/liburing/test/splice.c +512 -0
  276. data/vendor/liburing/test/sq-full-cpp.cc +45 -0
  277. data/vendor/liburing/test/sq-full.c +45 -0
  278. data/vendor/liburing/test/sq-poll-dup.c +211 -0
  279. data/vendor/liburing/test/sq-poll-kthread.c +169 -0
  280. data/vendor/liburing/test/sq-poll-share.c +138 -0
  281. data/vendor/liburing/test/sq-space_left.c +159 -0
  282. data/vendor/liburing/test/sqpoll-disable-exit.c +196 -0
  283. data/vendor/liburing/test/sqpoll-exec.c +132 -0
  284. data/vendor/liburing/test/sqpoll-exit-hang.c +78 -0
  285. data/vendor/liburing/test/sqpoll-sleep.c +69 -0
  286. data/vendor/liburing/test/statx.c +172 -0
  287. data/vendor/liburing/test/stdout.c +232 -0
  288. data/vendor/liburing/test/submit-and-wait.c +108 -0
  289. data/vendor/liburing/test/submit-link-fail.c +156 -0
  290. data/vendor/liburing/test/submit-reuse.c +237 -0
  291. data/vendor/liburing/test/symlink.c +117 -0
  292. data/vendor/liburing/test/sync-cancel.c +235 -0
  293. data/vendor/liburing/test/teardowns.c +58 -0
  294. data/vendor/liburing/test/test.h +36 -0
  295. data/vendor/liburing/test/thread-exit.c +143 -0
  296. data/vendor/liburing/test/timeout-new.c +256 -0
  297. data/vendor/liburing/test/timeout.c +1798 -0
  298. data/vendor/liburing/test/truncate.c +186 -0
  299. data/vendor/liburing/test/tty-write-dpoll.c +60 -0
  300. data/vendor/liburing/test/unlink.c +112 -0
  301. data/vendor/liburing/test/version.c +25 -0
  302. data/vendor/liburing/test/wait-timeout.c +287 -0
  303. data/vendor/liburing/test/waitid.c +373 -0
  304. data/vendor/liburing/test/wakeup-hang.c +162 -0
  305. data/vendor/liburing/test/wq-aff.c +146 -0
  306. data/vendor/liburing/test/xattr.c +442 -0
  307. metadata +412 -0
@@ -0,0 +1,442 @@
1
+ #include <assert.h>
2
+ #include <fcntl.h>
3
+ #include <stdio.h>
4
+ #include <stdlib.h>
5
+ #include <string.h>
6
+ #include <sys/xattr.h>
7
+ #include <unistd.h>
8
+
9
+ #include "helpers.h"
10
+ #include "liburing.h"
11
+
12
+ static int no_xattr;
13
+
14
+ /* Define constants. */
15
+ #define XATTR_SIZE 255
16
+ #define QUEUE_DEPTH 32
17
+
18
+ #define FILENAME "xattr.test"
19
+ #define KEY1 "user.val1"
20
+ #define KEY2 "user.val2"
21
+ #define VALUE1 "value1"
22
+ #define VALUE2 "value2-a-lot-longer"
23
+
24
+
25
+ /* Call fsetxattr. */
26
+ static int io_uring_fsetxattr(struct io_uring *ring, int fd, const char *name,
27
+ const void *value, size_t size, int flags)
28
+ {
29
+ struct io_uring_sqe *sqe;
30
+ struct io_uring_cqe *cqe;
31
+ int ret;
32
+
33
+ sqe = io_uring_get_sqe(ring);
34
+ if (!sqe) {
35
+ fprintf(stderr, "Error cannot get sqe\n");
36
+ return -1;
37
+ }
38
+
39
+ io_uring_prep_fsetxattr(sqe, fd, name, value, flags, size);
40
+
41
+ ret = io_uring_submit(ring);
42
+ if (ret != 1) {
43
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
44
+ return -1;
45
+ }
46
+
47
+ ret = io_uring_wait_cqe(ring, &cqe);
48
+ if (ret) {
49
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
50
+ return -1;
51
+ }
52
+
53
+ ret = cqe->res;
54
+ if (ret < 0) {
55
+ if (cqe->res == -EINVAL || cqe->res == -EOPNOTSUPP)
56
+ no_xattr = 1;
57
+ }
58
+ io_uring_cqe_seen(ring, cqe);
59
+ return ret;
60
+ }
61
+
62
+ /* Submit fgetxattr request. */
63
+ static int io_uring_fgetxattr(struct io_uring *ring, int fd, const char *name,
64
+ void *value, size_t size)
65
+ {
66
+ struct io_uring_sqe *sqe;
67
+ struct io_uring_cqe *cqe;
68
+ int ret;
69
+
70
+ sqe = io_uring_get_sqe(ring);
71
+ if (!sqe) {
72
+ fprintf(stderr, "Error cannot get sqe\n");
73
+ return -1;
74
+ }
75
+
76
+ io_uring_prep_fgetxattr(sqe, fd, name, value, size);
77
+
78
+ ret = io_uring_submit(ring);
79
+ if (ret != 1) {
80
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
81
+ return -1;
82
+ }
83
+
84
+ ret = io_uring_wait_cqe(ring, &cqe);
85
+ if (ret) {
86
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
87
+ return -1;
88
+ }
89
+
90
+ ret = cqe->res;
91
+ if (ret == -1) {
92
+ fprintf(stderr, "Error couldn'tget value\n");
93
+ return -1;
94
+ }
95
+
96
+ io_uring_cqe_seen(ring, cqe);
97
+ return ret;
98
+ }
99
+
100
+ /* Call setxattr. */
101
+ static int io_uring_setxattr(struct io_uring *ring, const char *path,
102
+ const char *name, const void *value, size_t size,
103
+ int flags)
104
+ {
105
+ struct io_uring_sqe *sqe;
106
+ struct io_uring_cqe *cqe;
107
+ int ret;
108
+
109
+ sqe = io_uring_get_sqe(ring);
110
+ if (!sqe) {
111
+ fprintf(stderr, "Error cannot get sqe\n");
112
+ return -1;
113
+ }
114
+
115
+ io_uring_prep_setxattr(sqe, name, value, path, flags, size);
116
+
117
+ ret = io_uring_submit_and_wait(ring, 1);
118
+ if (ret != 1) {
119
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
120
+ return -1;
121
+ }
122
+
123
+ ret = io_uring_wait_cqe(ring, &cqe);
124
+ if (ret) {
125
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
126
+ return -1;
127
+ }
128
+
129
+ ret = cqe->res;
130
+ if (ret < 0) {
131
+ if (ret == -EINVAL || ret == -EOPNOTSUPP)
132
+ no_xattr = 1;
133
+ }
134
+ io_uring_cqe_seen(ring, cqe);
135
+ return ret;
136
+ }
137
+
138
+ /* Submit getxattr request. */
139
+ static int io_uring_getxattr(struct io_uring *ring, const char *path,
140
+ const char *name, void *value, size_t size)
141
+ {
142
+ struct io_uring_sqe *sqe;
143
+ struct io_uring_cqe *cqe;
144
+ int ret;
145
+
146
+ sqe = io_uring_get_sqe(ring);
147
+ if (!sqe) {
148
+ fprintf(stderr, "Error cannot get sqe\n");
149
+ return -1;
150
+ }
151
+
152
+ io_uring_prep_getxattr(sqe, name, value, path, size);
153
+
154
+ ret = io_uring_submit(ring);
155
+ if (ret != 1) {
156
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
157
+ return -1;
158
+ }
159
+
160
+ ret = io_uring_wait_cqe(ring, &cqe);
161
+ if (ret) {
162
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
163
+ return -1;
164
+ }
165
+
166
+ ret = cqe->res;
167
+ if (ret == -1) {
168
+ fprintf(stderr, "Error couldn'tget value\n");
169
+ return -1;
170
+ }
171
+
172
+ io_uring_cqe_seen(ring, cqe);
173
+ return ret;
174
+ }
175
+
176
+ /* Test driver for fsetxattr and fgetxattr. */
177
+ static int test_fxattr(void)
178
+ {
179
+ int rc = 0;
180
+ size_t value_len;
181
+ struct io_uring ring;
182
+ char value[XATTR_SIZE];
183
+
184
+ /* Init io-uring queue. */
185
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
186
+ if (ret) {
187
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
188
+ return -1;
189
+ }
190
+
191
+ /* Create the test file. */
192
+ int fd = open(FILENAME, O_CREAT | O_RDWR, 0644);
193
+ if (fd < 0) {
194
+ fprintf(stderr, "Error: cannot open file: ret=%d\n", fd);
195
+ return -1;
196
+ }
197
+
198
+ /* Test writing attributes. */
199
+ if (io_uring_fsetxattr(&ring, fd, KEY1, VALUE1, strlen(VALUE1), 0) < 0) {
200
+ if (no_xattr) {
201
+ fprintf(stdout, "No xattr support, skipping\n");
202
+ goto Exit;
203
+ }
204
+ fprintf(stderr, "Error fsetxattr cannot write key1\n");
205
+ rc = -1;
206
+ goto Exit;
207
+ }
208
+
209
+ if (io_uring_fsetxattr(&ring, fd, KEY2, VALUE2, strlen(VALUE2), 0) < 0) {
210
+ fprintf(stderr, "Error fsetxattr cannot write key1\n");
211
+ rc = -1;
212
+ goto Exit;
213
+ }
214
+
215
+ /* Test reading attributes. */
216
+ value_len = io_uring_fgetxattr(&ring, fd, KEY1, value, XATTR_SIZE);
217
+ if (value_len != strlen(VALUE1) || strncmp(value, VALUE1, value_len)) {
218
+ fprintf(stderr, "Error: fgetxattr expected value: %s, returned value: %s\n", VALUE1, value);
219
+ rc = -1;
220
+ goto Exit;
221
+ }
222
+
223
+ value_len = io_uring_fgetxattr(&ring, fd, KEY2, value, XATTR_SIZE);
224
+ if (value_len != strlen(VALUE2) || strncmp(value, VALUE2, value_len)) {
225
+ fprintf(stderr, "Error: fgetxattr expected value: %s, returned value: %s\n", VALUE2, value);
226
+ rc = -1;
227
+ goto Exit;
228
+ }
229
+
230
+ /* Cleanup. */
231
+ Exit:
232
+ close(fd);
233
+ unlink(FILENAME);
234
+
235
+ io_uring_queue_exit(&ring);
236
+
237
+ return rc;
238
+ }
239
+
240
+ /* Test driver for setxattr and getxattr. */
241
+ static int test_xattr(void)
242
+ {
243
+ int rc = 0;
244
+ int value_len;
245
+ struct io_uring ring;
246
+ char value[XATTR_SIZE];
247
+
248
+ /* Init io-uring queue. */
249
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
250
+ if (ret) {
251
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
252
+ return -1;
253
+ }
254
+
255
+ /* Create the test file. */
256
+ t_create_file(FILENAME, 0);
257
+
258
+ /* Test writing attributes. */
259
+ if (io_uring_setxattr(&ring, FILENAME, KEY1, VALUE1, strlen(VALUE1), 0) < 0) {
260
+ fprintf(stderr, "Error setxattr cannot write key1\n");
261
+ rc = -1;
262
+ goto Exit;
263
+ }
264
+
265
+ if (io_uring_setxattr(&ring, FILENAME, KEY2, VALUE2, strlen(VALUE2), 0) < 0) {
266
+ fprintf(stderr, "Error setxattr cannot write key1\n");
267
+ rc = -1;
268
+ goto Exit;
269
+ }
270
+
271
+ /* Test reading attributes. */
272
+ value_len = io_uring_getxattr(&ring, FILENAME, KEY1, value, XATTR_SIZE);
273
+ if (value_len != strlen(VALUE1) || strncmp(value, VALUE1, value_len)) {
274
+ fprintf(stderr, "Error: getxattr expected value: %s, returned value: %s\n", VALUE1, value);
275
+ rc = -1;
276
+ goto Exit;
277
+ }
278
+
279
+ value_len = io_uring_getxattr(&ring, FILENAME, KEY2, value, XATTR_SIZE);
280
+ if (value_len != strlen(VALUE2) || strncmp(value, VALUE2, value_len)) {
281
+ fprintf(stderr, "Error: getxattr expected value: %s, returned value: %s\n", VALUE2, value);
282
+ rc = -1;
283
+ goto Exit;
284
+ }
285
+
286
+ /* Cleanup. */
287
+ Exit:
288
+ io_uring_queue_exit(&ring);
289
+ unlink(FILENAME);
290
+
291
+ return rc;
292
+ }
293
+
294
+ /* Test driver for failure cases of fsetxattr and fgetxattr. */
295
+ static int test_failure_fxattr(void)
296
+ {
297
+ struct io_uring ring;
298
+ char value[XATTR_SIZE];
299
+
300
+ /* Init io-uring queue. */
301
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
302
+ if (ret) {
303
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
304
+ return -1;
305
+ }
306
+
307
+ /* Create the test file. */
308
+ int fd = open(FILENAME, O_CREAT | O_RDWR, 0644);
309
+ if (fd < 0) {
310
+ fprintf(stderr, "Error: cannot open file: ret=%d\n", fd);
311
+ return -1;
312
+ }
313
+
314
+ /* Test writing attributes. */
315
+ if (io_uring_fsetxattr(&ring, -1, KEY1, VALUE1, strlen(VALUE1), 0) >= 0)
316
+ return 1;
317
+ if (io_uring_fsetxattr(&ring, fd, NULL, VALUE1, strlen(VALUE1), 0) >= 0)
318
+ return 1;
319
+ if (io_uring_fsetxattr(&ring, fd, KEY1, NULL, strlen(VALUE1), 0) >= 0)
320
+ return 1;
321
+ if (io_uring_fsetxattr(&ring, fd, KEY1, VALUE1, 0, 0) != 0)
322
+ return 1;
323
+ if (io_uring_fsetxattr(&ring, fd, KEY1, VALUE1, -1, 0) >= 0)
324
+ return 1;
325
+
326
+ /* Test reading attributes. */
327
+ if (io_uring_fgetxattr(&ring, -1, KEY1, value, XATTR_SIZE) >= 0)
328
+ return 1;
329
+ if (io_uring_fgetxattr(&ring, fd, NULL, value, XATTR_SIZE) >= 0)
330
+ return 1;
331
+ if (io_uring_fgetxattr(&ring, fd, KEY1, value, 0) != 0)
332
+ return 1;
333
+
334
+ /* Cleanup. */
335
+ close(fd);
336
+ unlink(FILENAME);
337
+ io_uring_queue_exit(&ring);
338
+ return 0;
339
+ }
340
+
341
+
342
+ /* Test driver for failure cases for setxattr and getxattr. */
343
+ static int test_failure_xattr(void)
344
+ {
345
+ struct io_uring ring;
346
+ char value[XATTR_SIZE];
347
+
348
+ /* Init io-uring queue. */
349
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
350
+ if (ret) {
351
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
352
+ return -1;
353
+ }
354
+
355
+ /* Create the test file. */
356
+ t_create_file(FILENAME, 0);
357
+
358
+ /* Test writing attributes. */
359
+ if (io_uring_setxattr(&ring, "complete garbage", KEY1, VALUE1, strlen(VALUE1), 0) >= 0)
360
+ return 1;
361
+ if (io_uring_setxattr(&ring, NULL, KEY1, VALUE1, strlen(VALUE1), 0) >= 0)
362
+ return 1;
363
+ if (io_uring_setxattr(&ring, FILENAME, NULL, VALUE1, strlen(VALUE1), 0) >= 0)
364
+ return 1;
365
+ if (io_uring_setxattr(&ring, FILENAME, KEY1, NULL, strlen(VALUE1), 0) >= 0)
366
+ return 1;
367
+ if (io_uring_setxattr(&ring, FILENAME, KEY1, VALUE1, 0, 0) != 0)
368
+ return 1;
369
+
370
+ /* Test reading attributes. */
371
+ if (io_uring_getxattr(&ring, "complete garbage", KEY1, value, XATTR_SIZE) >= 0)
372
+ return 1;
373
+ if (io_uring_getxattr(&ring, NULL, KEY1, value, XATTR_SIZE) >= 0)
374
+ return 1;
375
+ if (io_uring_getxattr(&ring, FILENAME, NULL, value, XATTR_SIZE) >= 0)
376
+ return 1;
377
+ if (io_uring_getxattr(&ring, FILENAME, KEY1, NULL, XATTR_SIZE) != 0)
378
+ return 1;
379
+ if (io_uring_getxattr(&ring, FILENAME, KEY1, value, 0) != 0)
380
+ return 1;
381
+
382
+ /* Cleanup. */
383
+ io_uring_queue_exit(&ring);
384
+ unlink(FILENAME);
385
+ return 0;
386
+ }
387
+
388
+ /* Test for invalid SQE, this will cause a segmentation fault if enabled. */
389
+ static int test_invalid_sqe(void)
390
+ {
391
+ #ifdef DESTRUCTIVE_TEST
392
+ struct io_uring_sqe *sqe = NULL;
393
+ struct io_uring_cqe *cqe = NULL;
394
+ struct io_uring ring;
395
+
396
+ /* Init io-uring queue. */
397
+ int ret = io_uring_queue_init(QUEUE_DEPTH, &ring, 0);
398
+ if (ret) {
399
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
400
+ return -1;
401
+ }
402
+
403
+ /* Pass invalid SQE. */
404
+ io_uring_prep_setxattr(sqe, FILENAME, KEY1, VALUE1, strlen(VALUE1), 0);
405
+
406
+ ret = io_uring_submit(&ring);
407
+ if (ret != 1) {
408
+ fprintf(stderr, "Error io_uring_submit_and_wait: ret=%d\n", ret);
409
+ return -1;
410
+ }
411
+
412
+ ret = io_uring_wait_cqe(&ring, &cqe);
413
+ if (ret) {
414
+ fprintf(stderr, "Error io_uring_wait_cqe: ret=%d\n", ret);
415
+ return -1;
416
+ }
417
+
418
+ ret = cqe->res;
419
+ io_uring_cqe_seen(&ring, cqe);
420
+
421
+ return ret;
422
+ #else
423
+ return 0;
424
+ #endif
425
+ }
426
+
427
+ /* Test driver. */
428
+ int main(int argc, char *argv[])
429
+ {
430
+ if (argc > 1)
431
+ return 0;
432
+
433
+ if (test_fxattr())
434
+ return EXIT_FAILURE;
435
+ if (no_xattr)
436
+ return EXIT_SUCCESS;
437
+ if (test_xattr() || test_failure_fxattr() || test_failure_xattr() ||
438
+ test_invalid_sqe())
439
+ return EXIT_FAILURE;
440
+
441
+ return EXIT_SUCCESS;
442
+ }