2 #ifndef GLOBUS_XIO_UTIL_INCLUDE
3 #define GLOBUS_XIO_UTIL_INCLUDE
5 #include "globus_xio.h"
12 globus_xio_get_env_pair(
13 const char * env_name,
18 globus_xio_error_is_eof(
22 globus_xio_error_is_canceled(
26 globus_xio_driver_error_match(
27 globus_xio_driver_t driver,
28 globus_object_t * error,
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,
39 globus_xio_error_match(
40 globus_result_t result,
44 globus_xio_contact_destroy(
45 globus_xio_contact_t * contact_info);
48 globus_xio_contact_parse(
49 globus_xio_contact_t * contact_info,
50 const char * contact_string);
53 globus_xio_contact_info_to_string(
54 const globus_xio_contact_t * contact_info,
55 char ** contact_string);
58 globus_xio_contact_info_to_url(
59 const globus_xio_contact_t * contact_info,
60 char ** contact_string);
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);
69 globus_xio_contact_copy(
70 globus_xio_contact_t * dst,
71 const globus_xio_contact_t * src);
81 #define GlobusXIOName(func) static const char * _xio_name __attribute__((__unused__)) = #func
83 #define GlobusXIOName(func) static const char * _xio_name = #func
86 #define GlobusXIOErrorCanceled() \
87 globus_error_put(GlobusXIOErrorObjCanceled())
89 #define GlobusXIOErrorObjCanceled() \
90 globus_error_construct_error( \
93 GLOBUS_XIO_ERROR_CANCELED, \
97 _XIOSL("Operation was canceled"))
98 #define GlobusXIOErrorTimeout() \
99 globus_error_put(GlobusXIOErrorObjTimeout())
101 #define GlobusXIOErrorObjTimeout() \
102 globus_error_construct_error( \
104 GlobusXIOErrorObjTimeoutOnly(), \
105 GLOBUS_XIO_ERROR_CANCELED, \
109 _XIOSL("Operation was canceled"))
111 #define GlobusXIOErrorObjTimeoutOnly() \
112 globus_error_construct_error( \
115 GLOBUS_XIO_ERROR_TIMEOUT, \
119 _XIOSL("Operation timed out"))
121 #define GlobusXIOErrorObjEOF() \
122 globus_error_construct_error( \
125 GLOBUS_XIO_ERROR_EOF, \
129 _XIOSL("An end of file occurred"))
131 #define GlobusXIOErrorEOF() \
133 GlobusXIOErrorObjEOF()) \
135 #define GlobusXIOErrorInvalidCommand(cmd_number) \
137 globus_error_construct_error( \
140 GLOBUS_XIO_ERROR_COMMAND, \
144 _XIOSL("An invalid command (%d) was issued"), \
147 #define GlobusXIOErrorContactString(reason) \
149 globus_error_construct_error( \
152 GLOBUS_XIO_ERROR_CONTACT_STRING, \
156 _XIOSL("Contact string invalid. %s"), \
159 #define GlobusXIOErrorObjParameter(param_name) \
160 globus_error_construct_error( \
163 GLOBUS_XIO_ERROR_PARAMETER, \
167 _XIOSL("Bad parameter, %s"), \
170 #define GlobusXIOErrorParameter(param_name) \
172 GlobusXIOErrorObjParameter(param_name))
174 #define GlobusXIOErrorObjMemory(mem_name) \
175 globus_error_construct_error( \
178 GLOBUS_XIO_ERROR_MEMORY, \
182 _XIOSL("Memory allocation failed on %s"), \
185 #define GlobusXIOErrorMemory(mem_name_obj) \
187 GlobusXIOErrorObjMemory(mem_name_obj))
189 #define GlobusXIOErrorObjSystemError(system_func, _errno) \
190 globus_error_wrap_errno_error( \
193 GLOBUS_XIO_ERROR_SYSTEM_ERROR, \
197 _XIOSL("System error in %s"), \
200 #define GlobusXIOErrorSystemError(system_func, _errno) \
202 GlobusXIOErrorObjSystemError(system_func, _errno))
204 #define GlobusXIOErrorSystemResource(reason) \
206 globus_error_construct_error( \
209 GLOBUS_XIO_ERROR_SYSTEM_RESOURCE, \
213 _XIOSL("System resource error, %s"), \
216 #define GlobusXIOErrorInvalidStack(reason) \
218 globus_error_construct_error( \
221 GLOBUS_XIO_ERROR_STACK, \
225 _XIOSL("Invalid stack, %s"), \
228 #define GlobusXIOErrorInvalidDriver(reason) \
230 globus_error_construct_error( \
233 GLOBUS_XIO_ERROR_DRIVER, \
237 _XIOSL("Invalid Driver, %s"), \
240 #define GlobusXIOErrorPass() \
242 globus_error_construct_error( \
245 GLOBUS_XIO_ERROR_PASS, \
249 _XIOSL("Operation passed too far")))
251 #define GlobusXIOErrorAlreadyRegistered() \
253 globus_error_construct_error( \
256 GLOBUS_XIO_ERROR_ALREADY_REGISTERED, \
260 _XIOSL("Operation already registered")))
262 #define GlobusXIOErrorInvalidState(state) \
264 globus_error_construct_error( \
267 GLOBUS_XIO_ERROR_STATE, \
271 _XIOSL("Unexpected state, %d"), \
274 #define GlobusXIOErrorWrapFailed(failed_func, result) \
276 globus_error_construct_error( \
278 globus_error_get((result)), \
279 GLOBUS_XIO_ERROR_WRAPPED, \
283 _XIOSL("%s failed."), \
286 #define GlobusXIOErrorWrapFailedWithMessage(result, format, arg) \
288 globus_error_construct_error( \
290 globus_error_get((result)), \
291 GLOBUS_XIO_ERROR_WRAPPED, \
298 #define GlobusXIOErrorWrapFailedWithMessage2(result, format, arg1, arg2) \
300 globus_error_construct_error( \
302 globus_error_get((result)), \
303 GLOBUS_XIO_ERROR_WRAPPED, \
310 #define GlobusXIOErrorNotRegistered() \
312 globus_error_construct_error( \
315 GLOBUS_XIO_ERROR_NOT_REGISTERED, \
319 _XIOSL("Not registered.")))
321 #define GlobusXIOErrorNotActivated() \
323 globus_error_construct_error( \
326 GLOBUS_XIO_ERROR_NOT_ACTIVATED, \
330 _XIOSL("Module not activated.")))
332 #define GlobusXIOErrorUnloaded() \
334 globus_error_construct_error( \
337 GLOBUS_XIO_ERROR_UNLOADED, \
341 _XIOSL("Driver in handle has been unloaded.")))
343 #define GlobusXIOErrorParse(arg) \
345 globus_error_construct_error( \
348 GLOBUS_XIO_ERROR_PARSE, \
352 _XIOSL("An error occured parsing the string: %s"), arg))
355 #define GlobusIXIOUtilCopyNIovec(iov, iovc, siov, siovc, bytes) \
359 globus_size_t _tb = 0; \
360 globus_size_t _bytes; \
361 const struct iovec * _siov; \
362 struct iovec * _iov; \
372 for(_i = 0; _i < _siovc && _tb < _bytes; _i++) \
374 if(_tb + _siov[_i].iov_len > _bytes) \
376 _iov[_i].iov_len = _bytes - _tb; \
380 _iov[_i].iov_len = _siov[_i].iov_len; \
382 _tb += _siov[_i].iov_len; \
383 _iov[_i].iov_base = _siov[_i].iov_base; \
390 #define GlobusIXIOUtilTransferIovec(iov, siov, iovc) \
394 const struct iovec * _siov; \
395 struct iovec * _iov; \
402 for(_i = 0; _i < _iovc; _i++) \
404 _iov[_i].iov_base = _siov[_i].iov_base; \
405 _iov[_i].iov_len = _siov[_i].iov_len; \
409 #define GlobusIXIOUtilAdjustIovec(iov, iovc, nbytes) \
412 globus_size_t _n = (nbytes); \
416 struct iovec * _iov = (iov); \
417 int _iovc = (iovc); \
422 _i < _iovc && _n >= _iov[_i].iov_len; \
423 _n -= _iov[_i].iov_len, _i++); \
427 _iov[_i].iov_base = (char *) _iov[_i].iov_base + _n; \
428 _iov[_i].iov_len -= _n; \
436 #define GlobusIXIOUtilTransferAdjustedIovec( \
437 new_iov, new_iovc, iov, iovc, nbytes) \
441 const struct iovec * _iov; \
443 struct iovec * _new_iov; \
449 _new_iov = (new_iov); \
452 for(_i = 0, _n = (nbytes); \
453 _i < _iovc && _n >= _iov[_i].iov_len; \
454 _n -= _iov[_i].iov_len, _i++); \
456 (new_iovc) = _iovc - _i; \
459 _new_iov[0].iov_base = (char *) _iov[_i].iov_base + _n; \
460 _new_iov[0].iov_len = _iov[_i].iov_len - _n; \
463 for(_j = 1, _i++; _i < _iovc; _j++, _i++) \
465 _new_iov[_j].iov_base = _iov[_i].iov_base; \
466 _new_iov[_j].iov_len = _iov[_i].iov_len; \
471 #define GlobusXIOUtilIovTotalLength( \
472 out_len, iov, iovc) \
476 const struct iovec * _iov; \
478 globus_size_t _out_len; \
482 for(_i = 0; _i < _iovc; _i++) \
484 _out_len += _iov[_i].iov_len; \
486 out_len = _out_len; \
489 #define GlobusXIOUtilIovSerialize( \
490 out_buf, iov, iovc) \
495 for(_i = 0; _i < iovc; _i++) \
497 memcpy(&(out_buf)[_ndx], (iov)[_i].iov_base, (iov)[_i].iov_len);\
498 _ndx += (iov)[_i].iov_len; \