libdiscord

libdiscord.git
git clone git://git.lenczewski.org/libdiscord.git
Log | Files | Refs | README | LICENSE

internal.c (2340B)


      1 #include "internal.h"
      2 
      3 int
      4 queue_ioreqs(struct io_uring *uring, struct ioreq *reqs, size_t len)
      5 {
      6 	for (size_t i = 0; i < len; i++) {
      7 		struct ioreq *ioreq = &reqs[i];
      8 
      9 		struct io_uring_sqe *sqe = io_uring_get_sqe(uring);
     10 		if (!sqe)
     11 			return -1;
     12 
     13 		switch (ioreq->type) {
     14 		case IOREQ_CONNECT:
     15 			io_uring_prep_connect(sqe,
     16 					      ioreq->tag.connect.fd,
     17 					      ioreq->tag.connect.addr,
     18 					      ioreq->tag.connect.addrlen);
     19 			break;
     20 
     21 		case IOREQ_RECV:
     22 			io_uring_prep_recv(sqe,
     23 					   ioreq->tag.recv.fd,
     24 					   ioreq->tag.recv.buf,
     25 					   ioreq->tag.recv.len,
     26 					   ioreq->tag.recv.flags);
     27 			break;
     28 
     29 		case IOREQ_RECVFROM:
     30 #if 0
     31 			io_uring_prep_recvfrom(sqe,
     32 					       ioreq->tag.recvfrom.fd,
     33 					       ioreq->tag.recvfrom.buf,
     34 					       ioreq->tag.recvfrom.len,
     35 					       ioreq->tag.recvfrom.flags,
     36 					       ioreq->tag.recvfrom.addr,
     37 					       ioreq->tag.recvfrom.addrlen);
     38 #endif
     39 			break;
     40 
     41 		case IOREQ_SEND:
     42 			io_uring_prep_send(sqe,
     43 					   ioreq->tag.send.fd,
     44 					   ioreq->tag.recv.buf,
     45 					   ioreq->tag.recv.len,
     46 					   ioreq->tag.recv.flags);
     47 			break;
     48 
     49 		case IOREQ_SENDTO:
     50 			io_uring_prep_sendto(sqe,
     51 					     ioreq->tag.sendto.fd,
     52 					     ioreq->tag.sendto.buf,
     53 					     ioreq->tag.sendto.len,
     54 					     ioreq->tag.sendto.flags,
     55 					     ioreq->tag.sendto.addr,
     56 					     ioreq->tag.sendto.addrlen);
     57 			break;
     58 
     59 		case IOREQ_CLOSE:
     60 			io_uring_prep_close(sqe,
     61 					    ioreq->tag.close.fd);
     62 			break;
     63 		}
     64 
     65 		io_uring_sqe_set_data(sqe, ioreq);
     66 	}
     67 
     68 	return 0;
     69 }
     70 
     71 extern inline int
     72 conn_queue_connect(struct conn *conn, struct io_uring *uring);
     73 
     74 extern inline void
     75 conn_finish_connect(struct conn *conn, int result);
     76 
     77 extern inline int
     78 conn_queue_recv(struct conn *conn, struct io_uring *uring);
     79 
     80 extern inline void
     81 conn_finish_recv(struct conn *conn, int result);
     82 
     83 extern inline int
     84 conn_queue_send(struct conn *conn, struct io_uring *uring);
     85 
     86 extern inline void
     87 conn_finish_send(struct conn *conn, int result);
     88 
     89 extern inline int
     90 conn_queue_close(struct conn *conn, struct io_uring *uring);
     91 
     92 extern inline void
     93 conn_finish_close(struct conn *conn, int result);
     94 
     95 extern inline int
     96 conn_do_tls_handshake(struct conn *conn, struct io_uring *uring);
     97 
     98 extern inline int
     99 conn_do_io(struct conn *conn, struct io_uring *uring, int result,
    100 	   struct discord_event *ev);
    101 
    102 #include "utils.c"