xref: /PHP-7.4/ext/sockets/conversions.h (revision bdeb220f)
1 #ifndef PHP_SOCK_CONVERSIONS_H
2 #define PHP_SOCK_CONVERSIONS_H 1
3 
4 #include <php.h>
5 
6 #ifndef PHP_WIN32
7 # include <netinet/in.h>
8 # include <sys/socket.h>
9 #else
10 # include <Ws2tcpip.h>
11 #endif
12 
13 #include "php_sockets.h"
14 
15 /* TYPE DEFINITIONS */
16 struct err_s {
17 	int		has_error;
18 	char	*msg;
19 	int		level;
20 	int		should_free;
21 };
22 
23 struct key_value {
24 	const char	*key;
25 	unsigned	key_size;
26 	void		*value;
27 };
28 
29 /* the complete types of these two are not relevant to the outside */
30 typedef struct _ser_context ser_context;
31 typedef struct _res_context res_context;
32 
33 #define KEY_RECVMSG_RET "recvmsg_ret"
34 
35 typedef void (from_zval_write_field)(const zval *arr_value, char *field, ser_context *ctx);
36 typedef void (to_zval_read_field)(const char *data, zval *zv, res_context *ctx);
37 
38 /* VARIABLE DECLARATIONS */
39 extern const struct key_value empty_key_value_list[];
40 
41 /* AUX FUNCTIONS */
42 void err_msg_dispose(struct err_s *err);
43 void allocations_dispose(zend_llist **allocations);
44 
45 /* CONVERSION FUNCTIONS */
46 void from_zval_write_int(const zval *arr_value, char *field, ser_context *ctx);
47 void to_zval_read_int(const char *data, zval *zv, res_context *ctx);
48 
49 #ifdef IPV6_PKTINFO
50 void from_zval_write_in6_pktinfo(const zval *container, char *in6_pktinfo_c, ser_context *ctx);
51 void to_zval_read_in6_pktinfo(const char *data, zval *zv, res_context *ctx);
52 #endif
53 
54 #ifdef SO_PASSCRED
55 void from_zval_write_ucred(const zval *container, char *ucred_c, ser_context *ctx);
56 void to_zval_read_ucred(const char *data, zval *zv, res_context *ctx);
57 #endif
58 
59 #ifdef SCM_RIGHTS
60 size_t calculate_scm_rights_space(const zval *arr, ser_context *ctx);
61 void from_zval_write_fd_array(const zval *arr, char *int_arr, ser_context *ctx);
62 void to_zval_read_fd_array(const char *data, zval *zv, res_context *ctx);
63 #endif
64 
65 void from_zval_write_msghdr_send(const zval *container, char *msghdr_c, ser_context *ctx);
66 void from_zval_write_msghdr_recv(const zval *container, char *msghdr_c, ser_context *ctx);
67 void to_zval_read_msghdr(const char *msghdr_c, zval *zv, res_context *ctx);
68 
69 /* ENTRY POINTS FOR CONVERSIONS */
70 void *from_zval_run_conversions(const zval				*container,
71 								php_socket				*sock,
72 								from_zval_write_field	*writer,
73 								size_t					struct_size,
74 								const char				*top_name,
75 								zend_llist				**allocations /* out */,
76 								struct err_s			*err /* in/out */);
77 
78 zval *to_zval_run_conversions(const char				*structure,
79 							  to_zval_read_field		*reader,
80 							  const char				*top_name,
81 							  const struct key_value	*key_value_pairs,
82 							  struct err_s				*err, zval *zv);
83 
84 #endif
85