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