static char* get_locale_name(char *loc) { char* ret = NULL; const char *keys = "."; // We lop off the .us.cray... int len = strcspn (loc, keys); ret = (char*) qio_malloc(len+1); if (ret) { qio_memcpy(ret, loc, len); ret[len] = '\0'; } return ret; }
qioerr qbuffer_flatten(qbuffer_t* buf, qbuffer_iter_t start, qbuffer_iter_t end, qbytes_t** bytes_out) { int64_t num_bytes = qbuffer_iter_num_bytes(start, end); ssize_t num_parts = qbuffer_iter_num_parts(start, end); struct iovec* iov = NULL; size_t iovcnt; size_t i,j; qbytes_t* ret; MAYBE_STACK_SPACE(struct iovec, iov_onstack); qioerr err; if( num_bytes < 0 || num_parts < 0 || start.offset < buf->offset_start || end.offset > buf->offset_end ) { *bytes_out = 0; QIO_RETURN_CONSTANT_ERROR(EINVAL, "range outside of buffer"); } err = qbytes_create_calloc(&ret, num_bytes); if( err ) { *bytes_out = 0; return err; } MAYBE_STACK_ALLOC(struct iovec, num_parts, iov, iov_onstack); if( ! iov ) { // The buffer was successfully allocated, so we have to release it here. qbytes_release(ret); *bytes_out = 0; return QIO_ENOMEM; } err = qbuffer_to_iov(buf, start, end, num_parts, iov, NULL, &iovcnt); if( err ) { MAYBE_STACK_FREE(iov, iov_onstack); // The buffer was successfully allocated, so we have to release it here. qbytes_release(ret); *bytes_out = 0; return err; } j = 0; for( i = 0; i < iovcnt; i++ ) { qio_memcpy(PTR_ADDBYTES(ret->data, j), iov[i].iov_base, iov[i].iov_len); j += iov[i].iov_len; } MAYBE_STACK_FREE(iov, iov_onstack); *bytes_out = ret; return 0; }
qioerr qbuffer_copyin(qbuffer_t* buf, qbuffer_iter_t start, qbuffer_iter_t end, const void* ptr, size_t ret_len) { int64_t num_bytes = qbuffer_iter_num_bytes(start, end); ssize_t num_parts = qbuffer_iter_num_parts(start, end); struct iovec* iov = NULL; size_t iovcnt; size_t i,j; MAYBE_STACK_SPACE(struct iovec, iov_onstack); qioerr err; if( num_bytes < 0 || num_parts < 0 || start.offset < buf->offset_start || end.offset > buf->offset_end ) { QIO_RETURN_CONSTANT_ERROR(EINVAL, "range outside of buffer"); } MAYBE_STACK_ALLOC(struct iovec, num_parts, iov, iov_onstack); if( ! iov ) return QIO_ENOMEM; err = qbuffer_to_iov(buf, start, end, num_parts, iov, NULL, &iovcnt); if( err ) goto error; j = 0; for( i = 0; i < iovcnt; i++ ) { if( j + iov[i].iov_len > ret_len ) goto error_nospace; qio_memcpy(iov[i].iov_base, PTR_ADDBYTES(ptr, j), iov[i].iov_len); j += iov[i].iov_len; } MAYBE_STACK_FREE(iov, iov_onstack); return 0; error_nospace: QIO_GET_CONSTANT_ERROR(err, EMSGSIZE, "no space in buffer"); error: MAYBE_STACK_FREE(iov, iov_onstack); return err; }
const char* sys_strerror_syserr_str(qioerr error, err_t* err_in_strerror) { char* ret = NULL; err_t code = qio_err_to_int(error); const char* msg = qio_err_msg(error); size_t extra_space = 0; size_t start = 0; size_t msg_len = 0; if( msg ) { msg_len = strlen(msg); extra_space = msg_len + 3; } *err_in_strerror = sys_strerror_internal(code, &ret, extra_space); if( msg && ret ) { start = strlen(ret); ret[start] = ':'; ret[start+1] = ' '; qio_memcpy(&ret[start+2], msg, msg_len); ret[start+2+msg_len] = '\0'; } return ret; }
sys_sockaddr_t sys_getaddrinfo_addr(sys_addrinfo_ptr_t a) { sys_sockaddr_t ret; qio_memcpy(&ret.addr, a->ai_addr, a->ai_addrlen); ret.len = a->ai_addrlen; return ret; }