1 #ifndef FM_INTERNAL_H 2 #define FM_INTERNAL_H 3 4 #define MAGIC_NUMBER 0x4356ffa9 /* random magic */ 5 #define REVERSE_MAGIC_NUMBER 0xa9ff5643 /* byte reversed random 6 * magic */ 7 #define MAGIC_FLOAT 0.0078125 /* random float */ 8 9 extern FMdata_type FMstr_to_data_type(const char *str); 10 extern FMdata_type FMarray_str_to_data_type(const char *str, 11 long *element_count_ptr); 12 extern const char *data_type_to_str(FMdata_type data_type); 13 extern int field_offset_compar(const void *a, const void *b); 14 extern void dump_FMFormat(FMFormat ioformat); 15 extern FMContext new_FMContext(); 16 17 typedef enum { 18 FMType_pointer, FMType_array, FMType_string, FMType_subformat, FMType_simple 19 }FMTypeEnum; 20 21 typedef struct FMTypeDesc { 22 struct FMTypeDesc *next; 23 FMTypeEnum type; 24 FMdata_type data_type; 25 int pointer_recursive; 26 int field_index; 27 int static_size; 28 int control_field_index; 29 } FMTypeDesc; 30 31 typedef struct FMDimen { 32 int static_size; 33 int control_field_index; 34 } FMDimen; 35 36 typedef struct _FMVarInfoStruct { 37 int string; 38 int var_array; 39 int byte_vector; 40 FMdata_type data_type; 41 int dimen_count; 42 FMDimen *dimens; 43 FMTypeDesc type_desc; 44 } FMVarInfoStruct, *FMVarInfoList; 45 46 typedef struct _xml_output_info *xml_output_info; 47 48 struct _format_wire_format_1; 49 typedef struct _format_wire_format_1 *format_rep; 50 51 typedef struct _server_ID_struct { 52 int length; 53 char *value; 54 } server_ID_type; 55 56 typedef struct _FMFormatBody { 57 int ref_count; 58 FMContext context; 59 char *format_name; 60 int format_index; 61 server_ID_type server_ID; 62 int record_length; 63 int byte_reversal; 64 FMfloat_format float_format; 65 int pointer_size; 66 int IOversion; 67 int field_count; 68 int variant; 69 int recursive; 70 int alignment; 71 int column_major_arrays; 72 FMStructDescList master_struct_list; 73 FMStructDescList orig_struct_list; /* we don't own this memory */ 74 FMFormat superformat; 75 FMFormat *subformats; 76 FMFieldList field_list; 77 FMVarInfoList var_list; 78 FMFormat *field_subformats; 79 FMOptInfo *opt_info; 80 xml_output_info xml_out; 81 format_rep server_format_rep; 82 void *ffs_info; 83 void (*free_ffs_info)(void*); 84 } FMFormatBody; 85 86 extern long 87 FMget_array_element_count(FMFormat f, FMVarInfoList var, char *data, 88 int encode); 89 90 extern FMTypeDesc* 91 gen_FMTypeDesc(FMFieldList fl, int field, const char *typ); 92 93 typedef struct _FMgetFieldStruct { 94 int offset; 95 int size; 96 FMdata_type data_type; 97 unsigned char byte_swap; 98 unsigned char src_float_format; 99 unsigned char target_float_format; 100 } FMgetFieldStruct; 101 102 extern FMfloat_format ffs_reverse_float_formats[]; 103 extern char *base_data_type(const char *str); 104 105 struct _format_server; 106 107 typedef struct _FMContextStruct { 108 int ref_count; 109 int reg_format_count; 110 int byte_reversal; 111 int native_pointer_size; 112 FMfloat_format native_float_format; 113 int native_column_major_arrays; /* False for C, True for Fortran */ 114 int errno_val; 115 char *result; 116 117 FMContext master_context; 118 int self_server; 119 int self_server_fallback; 120 void *server_client_data; 121 void *server_fd; 122 int server_pid; 123 int format_server_identifier; 124 int server_byte_reversal; 125 126 int format_list_size; 127 FMFormat *format_list; 128 } FMContextStruct; 129 130 typedef struct _format_server *format_server; 131 132 #if SIZEOF_INT == 4 133 #define INT4 int 134 #define UINT4 unsigned int 135 #endif 136 137 #define INT2 short 138 #define UINT2 unsigned short 139 140 struct _field_wire_format_0 { /* 16 bytes total */ 141 UINT2 field_name_offset; 142 UINT2 field_type_offset; 143 INT4 field_size; 144 INT4 field_offset; 145 }; 146 147 struct _field_wire_format_1 { /* 16 bytes total */ 148 UINT4 field_name_offset; 149 UINT4 field_type_offset; 150 INT4 field_size; 151 INT4 field_offset; 152 }; 153 154 struct _opt_info_wire_format { /* 12 bytes total */ 155 INT4 info_type; 156 INT4 info_len; 157 INT4 info_offset; 158 }; 159 160 struct _format_wire_format_0 { 161 /*byte 0*/ UINT2 format_rep_length; /* transmitted in net byte order */ 162 /*byte 2*/ unsigned char record_byte_order; 163 /*byte 3*/ unsigned char server_rep_version; 164 /*byte 4*/ unsigned char subformat_count; 165 /*byte 5*/ unsigned char recursive_flag; 166 /*byte 6*/ unsigned char unused1_in_format_0; 167 /*byte 7*/ unsigned char unused2_in_format_0; 168 }; 169 170 struct _format_wire_format_1 { 171 /*byte 0*/ UINT2 format_rep_length; /* transmitted in net byte order */ 172 /*byte 2*/ unsigned char record_byte_order; 173 /*byte 3*/ unsigned char server_rep_version; 174 /*byte 4*/ unsigned char subformat_count; 175 /*byte 5*/ unsigned char recursive_flag; 176 /*byte 6*/ UINT2 top_bytes_format_rep_length; /* transmitted in net byte order */ 177 }; 178 179 struct _subformat_wire_format_0 { /* 20 bytes for base */ 180 /*byte 0*/ UINT2 subformat_rep_length; /* transmitted in net byte order */ 181 /*byte 2*/ unsigned char server_rep_version; 182 /*byte 3*/ unsigned char record_byte_order; 183 /*byte 4*/ unsigned char pointer_size; 184 /*byte 5*/ unsigned char header_size; 185 /*byte 6*/ UINT2 name_offset; /* native host byte order */ 186 /*byte 8*/ UINT2 field_count; 187 /*byte 10*/ UINT2 floating_point_rep; 188 /*byte 12*/ INT4 record_length; 189 /*byte 16*/ UINT2 opt_info_offset; 190 /*byte 18*/ unsigned char column_major_arrays; /* false for C, true for Fortran */ 191 /*byte 19*/ unsigned char alignment; 192 }; 193 194 struct _subformat_wire_format_1 { /* 28 bytes for base */ 195 /*byte 0*/ UINT2 subformat_rep_length; /* transmitted in net byte order */ 196 /*byte 2*/ unsigned char server_rep_version; 197 /*byte 3*/ unsigned char record_byte_order; 198 /*byte 4*/ UINT4 name_offset; /* native host byte order */ 199 /*byte 8*/ UINT4 field_count; 200 /*byte 12*/ INT4 record_length; 201 /*byte 16*/ unsigned char pointer_size; 202 /*byte 17*/ unsigned char header_size; 203 /*byte 18*/ UINT2 floating_point_rep; 204 /*byte 20*/ UINT2 opt_info_offset; 205 /*byte 22*/ unsigned char column_major_arrays; /* false for C, true for Fortran */ 206 /*byte 23*/ unsigned char alignment; 207 /*byte 24*/ UINT2 top_bytes_subformat_rep_length; /* transmitted in net byte order */ 208 /*byte 26*/ unsigned char unused0_f1; 209 /*byte 27*/ unsigned char unused1_f1; 210 }; 211 212 struct _format_wire_format { 213 union { 214 struct _format_wire_format_0 f0; 215 struct _format_wire_format_1 f1; 216 }f; 217 }; 218 219 struct _subformat_wire_format { 220 union { 221 struct _subformat_wire_format_0 f0; 222 struct _subformat_wire_format_1 f1; 223 }f; 224 }; 225 226 typedef struct { 227 unsigned char version; 228 unsigned char salt; 229 unsigned INT2 port; 230 unsigned INT4 IP_addr; 231 unsigned INT2 format_identifier; 232 } version_1_format_ID; 233 234 typedef struct { 235 unsigned char version; 236 unsigned char unused; 237 unsigned INT2 rep_len; 238 unsigned INT4 hash1; 239 unsigned INT4 hash2; 240 } version_2_format_ID; 241 242 typedef struct { 243 unsigned char version; 244 unsigned char top_byte_rep_len; 245 unsigned INT2 rep_len; 246 unsigned INT4 hash1; 247 unsigned INT4 hash2; 248 } version_3_format_ID; 249 250 #define DEFAULT_FS_PORT 5347 251 252 #if SIZEOF_LONG_DOUBLE != 0 && SIZEOF_LONG_DOUBLE != SIZEOF_DOUBLE 253 #define MAX_FLOAT_TYPE long double 254 #else 255 #define MAX_FLOAT_TYPE double 256 #define MAX_FLOAT_GET get_FMdouble 257 #endif 258 #if SIZEOF_LONG_LONG != 0 259 #define MAX_INTEGER_TYPE long long 260 #else 261 #define MAX_INTEGER_TYPE long 262 #endif 263 264 #define MAX_UNSIGNED_TYPE unsigned MAX_INTEGER_TYPE 265 266 typedef int (*IOinterface_func)(void *conn, void *buffer, int length, 267 int *errno_p, char **result_p); 268 269 #if !defined(HAVE_IOVEC_DEFINE) && !defined(_STRUCT_IOVEC) && !(defined(_BITS_UIO_H)) 270 #define HAVE_IOVEC_DEFINE 271 struct iovec { 272 const void *iov_base; 273 long iov_len; 274 }; 275 #else 276 #include <sys/socket.h> 277 #endif 278 279 typedef int (*IOinterface_funcv)(void *conn, struct iovec *iov, 280 int icount, int *errno_p, 281 char **result_p); 282 283 typedef int (*IOinterface_close)(void *conn); 284 285 typedef int (*IOinterface_poll)(void *conn); 286 287 typedef void *(*IOinterface_open)(const char *path, 288 const char *flag_str, 289 int *input, int *output); 290 typedef void (*IOinterface_init)(void ); 291 292 extern IOinterface_func os_file_read_func; 293 extern IOinterface_func os_file_write_func; 294 295 extern IOinterface_func os_read_func; 296 extern IOinterface_func os_write_func; 297 extern int os_max_iov; 298 extern IOinterface_close os_close_func; 299 extern IOinterface_poll os_poll_func; 300 extern IOinterface_open os_file_open_func; 301 extern IOinterface_func os_server_read_func; 302 extern IOinterface_func os_server_write_func; 303 extern IOinterface_init os_sockets_init_func; 304 305 extern int version_of_format_ID(void *server_ID); 306 extern int FFS_gen_authentication (unsigned char *outbuf); 307 extern int serverAtomicRead(void *fd, void *buffer, int length); 308 extern void stringify_server_ID(unsigned char *ID, char *buffer, int len); 309 extern void 310 generate_format3_server_ID(server_ID_type *server_ID, 311 struct _format_wire_format_1 *server_format_rep); 312 extern void 313 add_format_to_iofile(FMContext fmc, FMFormat ioformat, int id_size, 314 void *id_buffer, int index); 315 typedef enum { 316 local_only, never_local, host_only, host_and_fallback 317 } action_t; 318 319 extern int establish_server_connection(FMContext iofile, action_t action); 320 extern void general_format_server(int port, int do_restart, int verbose, int do_proxy); 321 extern void dump_FMFormat(FMFormat ioformat); 322 extern int format_server_restarted(FMContext context); 323 extern int FMhas_XML_info(FMFormat format); 324 extern int get_internal_format_server_identifier(format_server fs); 325 #endif 326