globus_xio  6.3
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
globus_xio_util.h
1 
2 #ifndef GLOBUS_XIO_UTIL_INCLUDE
3 #define GLOBUS_XIO_UTIL_INCLUDE
4 
5 #include "globus_xio.h"
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 globus_bool_t
12 globus_xio_get_env_pair(
13  const char * env_name,
14  int * min,
15  int * max);
16 
17 globus_bool_t
18 globus_xio_error_is_eof(
19  globus_result_t res);
20 
21 globus_bool_t
22 globus_xio_error_is_canceled(
23  globus_result_t res);
24 
25 globus_bool_t
26 globus_xio_driver_error_match(
27  globus_xio_driver_t driver,
28  globus_object_t * error,
29  int type);
30 
31 globus_bool_t
32 globus_xio_driver_error_match_with_cb(
33  globus_xio_driver_t driver,
34  globus_object_t * error,
35  globus_extension_error_match_cb_t callback,
36  void * type);
37 
38 globus_bool_t
39 globus_xio_error_match(
40  globus_result_t result,
41  int type);
42 
43 void
44 globus_xio_contact_destroy(
45  globus_xio_contact_t * contact_info);
46 
47 globus_result_t
48 globus_xio_contact_parse(
49  globus_xio_contact_t * contact_info,
50  const char * contact_string);
51 
52 globus_result_t
53 globus_xio_contact_info_to_string(
54  const globus_xio_contact_t * contact_info,
55  char ** contact_string);
56 
57 globus_result_t
58 globus_xio_contact_info_to_url(
59  const globus_xio_contact_t * contact_info,
60  char ** contact_string);
61 
62 globus_result_t
63 globus_xio_contact_info_to_encoded_string(
64  const globus_xio_contact_t * contact_info,
65  const globus_xio_contact_t * encode_chars,
66  char ** contact_string);
67 
68 globus_result_t
69 globus_xio_contact_copy(
70  globus_xio_contact_t * dst,
71  const globus_xio_contact_t * src);
72 
73 /*
74  * Utility macros
75  */
76 
77 /* all macros in this file require each function to 'declare' their name with
78  * this
79  */
80 #ifdef __GNUC__
81 #define GlobusXIOName(func) static const char * _xio_name __attribute__((__unused__)) = #func
82 #else
83 #define GlobusXIOName(func) static const char * _xio_name = #func
84 #endif
85 
86 #define GlobusXIOErrorCanceled() \
87  globus_error_put(GlobusXIOErrorObjCanceled())
88 
89 #define GlobusXIOErrorObjCanceled() \
90  globus_error_construct_error( \
91  GLOBUS_XIO_MODULE, \
92  GLOBUS_NULL, \
93  GLOBUS_XIO_ERROR_CANCELED, \
94  __FILE__, \
95  _xio_name, \
96  __LINE__, \
97  _XIOSL("Operation was canceled"))
98 #define GlobusXIOErrorTimeout() \
99  globus_error_put(GlobusXIOErrorObjTimeout())
100 
101 #define GlobusXIOErrorObjTimeout() \
102  globus_error_construct_error( \
103  GLOBUS_XIO_MODULE, \
104  GlobusXIOErrorObjTimeoutOnly(), \
105  GLOBUS_XIO_ERROR_CANCELED, \
106  __FILE__, \
107  _xio_name, \
108  __LINE__, \
109  _XIOSL("Operation was canceled"))
110 
111 #define GlobusXIOErrorObjTimeoutOnly() \
112  globus_error_construct_error( \
113  GLOBUS_XIO_MODULE, \
114  GLOBUS_NULL, \
115  GLOBUS_XIO_ERROR_TIMEOUT, \
116  __FILE__, \
117  _xio_name, \
118  __LINE__, \
119  _XIOSL("Operation timed out"))
120 
121 #define GlobusXIOErrorObjEOF() \
122  globus_error_construct_error( \
123  GLOBUS_XIO_MODULE, \
124  GLOBUS_NULL, \
125  GLOBUS_XIO_ERROR_EOF, \
126  __FILE__, \
127  _xio_name, \
128  __LINE__, \
129  _XIOSL("An end of file occurred"))
130 
131 #define GlobusXIOErrorEOF() \
132  globus_error_put( \
133  GlobusXIOErrorObjEOF()) \
134 
135 #define GlobusXIOErrorInvalidCommand(cmd_number) \
136  globus_error_put( \
137  globus_error_construct_error( \
138  GLOBUS_XIO_MODULE, \
139  GLOBUS_NULL, \
140  GLOBUS_XIO_ERROR_COMMAND, \
141  __FILE__, \
142  _xio_name, \
143  __LINE__, \
144  _XIOSL("An invalid command (%d) was issued"), \
145  (cmd_number)))
146 
147 #define GlobusXIOErrorContactString(reason) \
148  globus_error_put( \
149  globus_error_construct_error( \
150  GLOBUS_XIO_MODULE, \
151  GLOBUS_NULL, \
152  GLOBUS_XIO_ERROR_CONTACT_STRING, \
153  __FILE__, \
154  _xio_name, \
155  __LINE__, \
156  _XIOSL("Contact string invalid. %s"), \
157  (reason)))
158 
159 #define GlobusXIOErrorObjParameter(param_name) \
160  globus_error_construct_error( \
161  GLOBUS_XIO_MODULE, \
162  GLOBUS_NULL, \
163  GLOBUS_XIO_ERROR_PARAMETER, \
164  __FILE__, \
165  _xio_name, \
166  __LINE__, \
167  _XIOSL("Bad parameter, %s"), \
168  (param_name))
169 
170 #define GlobusXIOErrorParameter(param_name) \
171  globus_error_put( \
172  GlobusXIOErrorObjParameter(param_name))
173 
174 #define GlobusXIOErrorObjMemory(mem_name) \
175  globus_error_construct_error( \
176  GLOBUS_XIO_MODULE, \
177  GLOBUS_NULL, \
178  GLOBUS_XIO_ERROR_MEMORY, \
179  __FILE__, \
180  _xio_name, \
181  __LINE__, \
182  _XIOSL("Memory allocation failed on %s"), \
183  (mem_name))
184 
185 #define GlobusXIOErrorMemory(mem_name_obj) \
186  globus_error_put( \
187  GlobusXIOErrorObjMemory(mem_name_obj))
188 
189 #define GlobusXIOErrorObjSystemError(system_func, _errno) \
190  globus_error_wrap_errno_error( \
191  GLOBUS_XIO_MODULE, \
192  (_errno), \
193  GLOBUS_XIO_ERROR_SYSTEM_ERROR, \
194  __FILE__, \
195  _xio_name, \
196  __LINE__, \
197  _XIOSL("System error in %s"), \
198  (system_func))
199 
200 #define GlobusXIOErrorSystemError(system_func, _errno) \
201  globus_error_put( \
202  GlobusXIOErrorObjSystemError(system_func, _errno))
203 
204 #define GlobusXIOErrorSystemResource(reason) \
205  globus_error_put( \
206  globus_error_construct_error( \
207  GLOBUS_XIO_MODULE, \
208  GLOBUS_NULL, \
209  GLOBUS_XIO_ERROR_SYSTEM_RESOURCE, \
210  __FILE__, \
211  _xio_name, \
212  __LINE__, \
213  _XIOSL("System resource error, %s"), \
214  (reason)))
215 
216 #define GlobusXIOErrorInvalidStack(reason) \
217  globus_error_put( \
218  globus_error_construct_error( \
219  GLOBUS_XIO_MODULE, \
220  GLOBUS_NULL, \
221  GLOBUS_XIO_ERROR_STACK, \
222  __FILE__, \
223  _xio_name, \
224  __LINE__, \
225  _XIOSL("Invalid stack, %s"), \
226  (reason)))
227 
228 #define GlobusXIOErrorInvalidDriver(reason) \
229  globus_error_put( \
230  globus_error_construct_error( \
231  GLOBUS_XIO_MODULE, \
232  GLOBUS_NULL, \
233  GLOBUS_XIO_ERROR_DRIVER, \
234  __FILE__, \
235  _xio_name, \
236  __LINE__, \
237  _XIOSL("Invalid Driver, %s"), \
238  (reason)))
239 
240 #define GlobusXIOErrorPass() \
241  globus_error_put( \
242  globus_error_construct_error( \
243  GLOBUS_XIO_MODULE, \
244  GLOBUS_NULL, \
245  GLOBUS_XIO_ERROR_PASS, \
246  __FILE__, \
247  _xio_name, \
248  __LINE__, \
249  _XIOSL("Operation passed too far")))
250 
251 #define GlobusXIOErrorAlreadyRegistered() \
252  globus_error_put( \
253  globus_error_construct_error( \
254  GLOBUS_XIO_MODULE, \
255  GLOBUS_NULL, \
256  GLOBUS_XIO_ERROR_ALREADY_REGISTERED, \
257  __FILE__, \
258  _xio_name, \
259  __LINE__, \
260  _XIOSL("Operation already registered")))
261 
262 #define GlobusXIOErrorInvalidState(state) \
263  globus_error_put( \
264  globus_error_construct_error( \
265  GLOBUS_XIO_MODULE, \
266  GLOBUS_NULL, \
267  GLOBUS_XIO_ERROR_STATE, \
268  __FILE__, \
269  _xio_name, \
270  __LINE__, \
271  _XIOSL("Unexpected state, %d"), \
272  (state)))
273 
274 #define GlobusXIOErrorWrapFailed(failed_func, result) \
275  globus_error_put( \
276  globus_error_construct_error( \
277  GLOBUS_XIO_MODULE, \
278  globus_error_get((result)), \
279  GLOBUS_XIO_ERROR_WRAPPED, \
280  __FILE__, \
281  _xio_name, \
282  __LINE__, \
283  _XIOSL("%s failed."), \
284  (failed_func)))
285 
286 #define GlobusXIOErrorWrapFailedWithMessage(result, format, arg) \
287  globus_error_put( \
288  globus_error_construct_error( \
289  GLOBUS_XIO_MODULE, \
290  globus_error_get((result)), \
291  GLOBUS_XIO_ERROR_WRAPPED, \
292  __FILE__, \
293  _xio_name, \
294  __LINE__, \
295  (format), \
296  (arg)))
297 
298 #define GlobusXIOErrorWrapFailedWithMessage2(result, format, arg1, arg2) \
299  globus_error_put( \
300  globus_error_construct_error( \
301  GLOBUS_XIO_MODULE, \
302  globus_error_get((result)), \
303  GLOBUS_XIO_ERROR_WRAPPED, \
304  __FILE__, \
305  _xio_name, \
306  __LINE__, \
307  (format), \
308  (arg1), (arg2)))
309 
310 #define GlobusXIOErrorNotRegistered() \
311  globus_error_put( \
312  globus_error_construct_error( \
313  GLOBUS_XIO_MODULE, \
314  NULL, \
315  GLOBUS_XIO_ERROR_NOT_REGISTERED, \
316  __FILE__, \
317  _xio_name, \
318  __LINE__, \
319  _XIOSL("Not registered.")))
320 
321 #define GlobusXIOErrorNotActivated() \
322  globus_error_put( \
323  globus_error_construct_error( \
324  GLOBUS_XIO_MODULE, \
325  NULL, \
326  GLOBUS_XIO_ERROR_NOT_ACTIVATED, \
327  __FILE__, \
328  _xio_name, \
329  __LINE__, \
330  _XIOSL("Module not activated.")))
331 
332 #define GlobusXIOErrorUnloaded() \
333  globus_error_put( \
334  globus_error_construct_error( \
335  GLOBUS_XIO_MODULE, \
336  NULL, \
337  GLOBUS_XIO_ERROR_UNLOADED, \
338  __FILE__, \
339  _xio_name, \
340  __LINE__, \
341  _XIOSL("Driver in handle has been unloaded.")))
342 
343 #define GlobusXIOErrorParse(arg) \
344  globus_error_put( \
345  globus_error_construct_error( \
346  GLOBUS_XIO_MODULE, \
347  NULL, \
348  GLOBUS_XIO_ERROR_PARSE, \
349  __FILE__, \
350  _xio_name, \
351  __LINE__, \
352  _XIOSL("An error occured parsing the string: %s"), arg))
353 
354 
355 #define GlobusIXIOUtilCopyNIovec(iov, iovc, siov, siovc, bytes) \
356  do \
357  { \
358  globus_size_t _i; \
359  globus_size_t _tb = 0; \
360  globus_size_t _bytes; \
361  const struct iovec * _siov; \
362  struct iovec * _iov; \
363  int _iovc; \
364  int _siovc; \
365  \
366  _siov = (siov); \
367  _siovc = (siovc); \
368  _iov = (iov); \
369  _iovc = (iovc); \
370  _bytes = (bytes); \
371  \
372  for(_i = 0; _i < _siovc && _tb < _bytes; _i++) \
373  { \
374  if(_tb + _siov[_i].iov_len > _bytes) \
375  { \
376  _iov[_i].iov_len = _bytes - _tb; \
377  } \
378  else \
379  { \
380  _iov[_i].iov_len = _siov[_i].iov_len; \
381  } \
382  _tb += _siov[_i].iov_len; \
383  _iov[_i].iov_base = _siov[_i].iov_base; \
384  } \
385  _iovc = _i; \
386  } while(0)
387 
388 
389 
390 #define GlobusIXIOUtilTransferIovec(iov, siov, iovc) \
391  do \
392  { \
393  int _i; \
394  const struct iovec * _siov; \
395  struct iovec * _iov; \
396  int _iovc; \
397  \
398  _siov = (siov); \
399  _iov = (iov); \
400  _iovc = (iovc); \
401  \
402  for(_i = 0; _i < _iovc; _i++) \
403  { \
404  _iov[_i].iov_base = _siov[_i].iov_base; \
405  _iov[_i].iov_len = _siov[_i].iov_len; \
406  } \
407  } while(0)
408 
409 #define GlobusIXIOUtilAdjustIovec(iov, iovc, nbytes) \
410  do \
411  { \
412  globus_size_t _n = (nbytes); \
413  \
414  if(_n > 0) \
415  { \
416  struct iovec * _iov = (iov); \
417  int _iovc = (iovc); \
418  int _i; \
419  \
420  /* skip all completely filled iovecs */ \
421  for(_i = 0; \
422  _i < _iovc && _n >= _iov[_i].iov_len; \
423  _n -= _iov[_i].iov_len, _i++); \
424  \
425  if(_i < _iovc) \
426  { \
427  _iov[_i].iov_base = (char *) _iov[_i].iov_base + _n; \
428  _iov[_i].iov_len -= _n; \
429  (iov) += _i; \
430  } \
431  \
432  (iovc) -= _i; \
433  } \
434  } while(0)
435 
436 #define GlobusIXIOUtilTransferAdjustedIovec( \
437  new_iov, new_iovc, iov, iovc, nbytes) \
438  do \
439  { \
440  globus_size_t _n; \
441  const struct iovec * _iov; \
442  int _iovc; \
443  struct iovec * _new_iov; \
444  int _i; \
445  int _j; \
446  \
447  _iov = (iov); \
448  _iovc = (iovc); \
449  _new_iov = (new_iov); \
450  \
451  /* skip all completely filled iovecs */ \
452  for(_i = 0, _n = (nbytes); \
453  _i < _iovc && _n >= _iov[_i].iov_len; \
454  _n -= _iov[_i].iov_len, _i++); \
455  \
456  (new_iovc) = _iovc - _i; \
457  if(_i < _iovc) \
458  { \
459  _new_iov[0].iov_base = (char *) _iov[_i].iov_base + _n; \
460  _new_iov[0].iov_len = _iov[_i].iov_len - _n; \
461  \
462  /* copy remaining */ \
463  for(_j = 1, _i++; _i < _iovc; _j++, _i++) \
464  { \
465  _new_iov[_j].iov_base = _iov[_i].iov_base; \
466  _new_iov[_j].iov_len = _iov[_i].iov_len; \
467  } \
468  } \
469  } while(0)
470 
471 #define GlobusXIOUtilIovTotalLength( \
472  out_len, iov, iovc) \
473  do \
474  { \
475  int _i; \
476  const struct iovec * _iov; \
477  int _iovc; \
478  globus_size_t _out_len; \
479  _iov = (iov); \
480  _iovc = (iovc); \
481  _out_len = 0; \
482  for(_i = 0; _i < _iovc; _i++) \
483  { \
484  _out_len += _iov[_i].iov_len; \
485  } \
486  out_len = _out_len; \
487  } while(0)
488 
489 #define GlobusXIOUtilIovSerialize( \
490  out_buf, iov, iovc) \
491  do \
492  { \
493  int _i; \
494  int _ndx = 0; \
495  for(_i = 0; _i < iovc; _i++) \
496  { \
497  memcpy(&(out_buf)[_ndx], (iov)[_i].iov_base, (iov)[_i].iov_len);\
498  _ndx += (iov)[_i].iov_len; \
499  } \
500  } while(0)
501 
502 #ifdef __cplusplus
503 }
504 #endif
505 
506 #endif