err = 0;
break;
case TRY_AGAIN:
- update_error(glb_cc, ETIMEDOUT, posix_error,
+ err = update_error(glb_cc, ETIMEDOUT, posix_error,
"Cannot resolve the server hostname (%s)", host);
- err = set_error(glb_cc, ECONNREFUSED, posix_error,
- "Failed to make network connection to server %s", host);
goto end;
case NETDB_INTERNAL:
err = update_error(glb_cc, errno, posix_error,
break;
}
- if (err) {
- err = set_error(glb_cc, ECONNREFUSED, posix_error,
- "Failed to make network connection to server %s", host);
+ if (err)
goto end;
- }
err = 0;
end:
+ if (err) /* XXX: rather invent own error */
+ err = update_error(glb_cc, ECONNREFUSED, posix_error,
+ "Failed to make network connection to server %s", host);
+
if (ar.ent != NULL)
free_hostent(ar.ent);
return err;
}
+/* XXX: 0 returned returned by ssl_read() means error or EOF ? */
size_t canl_io_read(canl_ctx cc, canl_io_handler io, void *buffer, size_t size, struct timeval *timeout)
{
io_handler *io_cc = (io_handler*) io;
}
b_recvd = ssl_read(glb_cc, io_cc, buffer, size, timeout);
- if (b_recvd <= 0) {
- update_error(glb_cc, "Can't read from connection");
- }
+
return b_recvd;
}
}
b_written = ssl_write(glb_cc, io_cc, buffer, size, timeout);
- if (b_written <= 0) {
- update_error(glb_cc, "Can't write to connection");
- }
+
return b_written;
}
end:
if (fclose(key_file)){
err = errno;
- update_error(cc, "cannot close file with key");
+ update_error(cc, errno, posix_error, "cannot close file with key");
}
return 1;
}
end:
if (fclose(cert_file)){
err = errno;
- update_error(cc, "cannot close file with certificate");
+ update_error(cc, errno, posix_error, "cannot close file with certificate");
}
return 1;
}
CANL_ERROR_ORIGIN err_orig);
static void get_error_string(glb_ctx *cc, char *code_str);
+/* TODO: produce error messages immediately (to chain them) */
/* Save error message into err_msg
* use NULL for empty err_format */
-void update_error (glb_ctx *cc, const char *err_format, ...)
+int update_error (glb_ctx *cc, unsigned long err_code, CANL_ERROR_ORIGIN err_orig,
+ const char *err_format, ...)
{
unsigned int err_msg_len = 0;
unsigned int err_msg_sum = 0; // sum of msg and format lengths
char *old_msg = NULL;
if (!cc)
- return;
+ return EINVAL;
if (err_format == NULL) {
- return;
+ return EINVAL;
}
separator_len = strlen(separator);
if (!(cc->err_msg)) {
vasprintf(&cc->err_msg, err_format, ap);
va_end(ap);
- return;
+ return resolve_error(cc, err_code, err_orig);
}
err_format_len = vasprintf(&new_msg, err_format, ap);
err_msg_sum = err_format_len + err_msg_len + separator_len + 1;
cc->err_msg = (char *) malloc ((err_msg_sum)*sizeof(char));
if (cc->err_msg == NULL)
- return;
+ return ENOMEM;
strncpy(cc->err_msg, new_msg, err_format_len + 1);
strncat (cc->err_msg, separator, separator_len + 1);
free(new_msg);
free(old_msg);
+
+ return resolve_error(cc, err_code, err_orig);
}
/* If there was some error message in ctx, delete it and make new */
void reset_error (glb_ctx *cc, unsigned long err_code);
int set_error (glb_ctx *cc, unsigned long err_code, CANL_ERROR_ORIGIN err_orig,
const char *err_format, ...);
-void update_error (glb_ctx *cc, const char *err_format, ...);
+int update_error (glb_ctx *cc, unsigned long err_code, CANL_ERROR_ORIGIN err_orig,
+ const char *err_format, ...);
void free_hostent(struct hostent *h); //TODO is there some standard funcion to free hostent?
int asyn_getservbyname(int a_family, asyn_result *ares_result,char const *name,
struct timeval *timeout);
err = do_set_ctx_own_cert_file(glb_cc, cert, key);
if(err) {
- update_error(glb_cc, "can't set cert or key to context");
+// update_error(glb_cc, "can't set cert or key to context");
}
return err;
}