func getErrorString(code C.ulong) string { if code == 0 { return "" } msg := fmt.Sprintf("%s:%s:%s\n", C.GoString(C.ERR_lib_error_string(code)), C.GoString(C.ERR_func_error_string(code)), C.GoString(C.ERR_reason_error_string(code))) if len(msg) == 4 { //being lazy here, all the strings were empty return "" } //Check for extra line data var file *C.char var line C.int var data *C.char var flags C.int if int(C.ERR_get_error_line_data(&file, &line, &data, &flags)) != 0 { msg += fmt.Sprintf("%s:%s", C.GoString(file), int(line)) if flags&C.ERR_TXT_STRING != 0 { msg += ":" + C.GoString(data) } if flags&C.ERR_TXT_MALLOCED != 0 { C.CRYPTO_free(unsafe.Pointer(data)) } } return msg }
// errorFromErrorQueue needs to run in the same OS thread as the operation // that caused the possible error func errorFromErrorQueue() error { var errs []string for { err := C.ERR_get_error() if err == 0 { break } errs = append(errs, fmt.Sprintf("%s:%s:%s", C.GoString(C.ERR_lib_error_string(err)), C.GoString(C.ERR_func_error_string(err)), C.GoString(C.ERR_reason_error_string(err)))) } return errors.New(fmt.Sprintf("SSL errors: %s", strings.Join(errs, "\n"))) }