1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
/*---------------------------------------------------------------------------*
C HEADER cf_socket_p.h
Copyright (c) 2003-2006, James H. Woodyatt
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
*---------------------------------------------------------------------------*/
#ifndef _CF_SOCKET_P_H
#define _CF_SOCKET_P_H
#include "cf_common_p.h"
#include <stddef.h>
#include <sys/types.h>
#include <sys/socket.h>
#define Cf_socket_sockaddrx_struct(suffix) \
struct cf_socket_sockaddrx_##suffix##_s { \
size_t sx_socklen; \
struct sockaddr_##suffix sx_sockaddr_##suffix; \
}
#define Cf_socket_sockaddrx_t(suffix) Cf_socket_sockaddrx_##suffix##_t
#define Cf_socket_sockaddrx_typedef(suffix) \
typedef struct cf_socket_sockaddrx_##suffix##_s Cf_socket_sockaddrx_t(suffix)
#define Cf_socket_sockaddrx_val(suffix, v) \
((Cf_socket_sockaddrx_t(suffix)*) Data_custom_val(v))
Cf_socket_sockaddrx_struct(storage);
Cf_socket_sockaddrx_typedef(storage);
struct cf_socket_sockaddrx_unit_s {
size_t sx_socklen;
struct sockaddr sx_sockaddr;
};
typedef struct cf_socket_sockaddrx_unit_s Cf_socket_sockaddrx_unit_t;
#define Cf_socket_sockaddrx_unit_val(v) \
((Cf_socket_sockaddrx_unit_t*) Data_custom_val(v))
typedef value (*Cf_socket_sockaddrx_cons_f)
(const struct sockaddr* saPtr, size_t saLen);
struct cf_socket_domain_s {
int d_domain; /* PF_INET, PF_LOCAL, ... */
int d_family; /* AF_INET, AF_LOCAL, ... */
Cf_socket_sockaddrx_cons_f d_consaddr; /* sockaddr alloc function */
size_t d_socklen; /* sizeof(sockaddr_xxx) */
};
typedef struct cf_socket_domain_s Cf_socket_domain_t;
#define Cf_socket_domain_val(v) ((Cf_socket_domain_t*) Data_custom_val(v))
extern value cf_socket_domain_alloc(const Cf_socket_domain_t* ptr);
struct cf_socket_s {
int s_fd;
int s_socktype;
int s_protocol;
Cf_socket_domain_t s_domain;
};
typedef struct cf_socket_s Cf_socket_t;
#define Cf_socket_val(v) ((Cf_socket_t*) Data_custom_val(v))
extern value cf_socket_alloc
(int fd, int socktype, int protocol, const Cf_socket_domain_t* domainPtr);
extern int cf_socket_msg_flags_to_int(value flagsVal);
extern value cf_socket_msg_flags_of_int(int flags);
struct cf_socket_option_context_s {
int xopt_fd;
int xopt_level;
int xopt_name;
};
typedef struct cf_socket_option_context_s Cf_socket_option_context_t;
typedef value (*Cf_socket_getsockopt_f)
(const Cf_socket_option_context_t* contextPtr);
typedef void (*Cf_socket_setsockopt_f)
(const Cf_socket_option_context_t* contextPtr, value x);
struct cf_socket_option_s {
int opt_level;
int opt_name;
Cf_socket_getsockopt_f opt_get;
Cf_socket_setsockopt_f opt_set;
const char* opt_name_str;
};
typedef struct cf_socket_option_s Cf_socket_option_t;
struct cf_socket_sockopt_lift_s {
value ol_val;
const Cf_socket_option_t ol_option;
};
typedef struct cf_socket_sockopt_lift_s Cf_socket_sockopt_lift_t;
#define Cf_socket_option_val(v) \
((const Cf_socket_option_t**) Data_custom_val(v))
extern value cf_socket_option_alloc(const Cf_socket_option_t* ptr);
extern void cf_socket_getsockopt_guard
(const Cf_socket_option_context_t* contextPtr, void* optval,
socklen_t* optlen);
extern void cf_socket_setsockopt_guard
(const Cf_socket_option_context_t* contextPtr, const void* optval,
socklen_t optlen);
extern value cf_socket_getsockopt_bool
(const Cf_socket_option_context_t* contextPtr);
extern void cf_socket_setsockopt_bool
(const Cf_socket_option_context_t* contextPtr, value x);
extern value cf_socket_getsockopt_int
(const Cf_socket_option_context_t* contextPtr);
extern void cf_socket_setsockopt_int
(const Cf_socket_option_context_t* contextPtr, value x);
extern value cf_socket_getsockopt_int_option
(const Cf_socket_option_context_t* contextPtr);
extern void cf_socket_setsockopt_int_option
(const Cf_socket_option_context_t* contextPtr, value x);
extern value cf_socket_getsockopt_float
(const Cf_socket_option_context_t* contextPtr);
extern void cf_socket_setsockopt_float
(const Cf_socket_option_context_t* contextPtr, value x);
#endif /* defined(_CF_SOCKET_P_H) */
/*--- End of File [ cf_socket_p.h ] ---*/
|