static ssize_t mailstream_low_ssl_write(mailstream_low * s, const void * buf, size_t count) { struct mailstream_ssl_data * ssl_data; int r; ssl_data = (struct mailstream_ssl_data *) s->data; r = wait_write(s); if (r <= 0) return r; r = gnutls_record_send(ssl_data->session, buf, count); if (r > 0) return r; switch (r) { case 0: return -1; case GNUTLS_E_AGAIN: case GNUTLS_E_INTERRUPTED: return 0; default: return r; } }
static ssize_t mailstream_low_ssl_write(mailstream_low * s, const void * buf, size_t count) { struct mailstream_ssl_data * ssl_data; int ssl_r; int r; ssl_data = (struct mailstream_ssl_data *) s->data; r = wait_write(s); if (r <= 0) return r; r = SSL_write(ssl_data->ssl_conn, buf, count); if (r > 0) return r; ssl_r = SSL_get_error(ssl_data->ssl_conn, r); switch (ssl_r) { case SSL_ERROR_NONE: return r; case SSL_ERROR_ZERO_RETURN: return -1; case SSL_ERROR_WANT_WRITE: return 0; default: return r; } }
static void chg_config(uchar clr, uchar set) { uchar old = get_config(); outb(PS2_CMND, 0x60); do_assert(wait_write()); outb(PS2_DATA, (old & ~clr) | set); }
static void ps2_command(uint port, uchar cmd, uchar * buf, int sz) { int i; if (port) outb(PS2_CMND, 0xD4); do_assert(wait_write()); outb(PS2_DATA, cmd); do_assert(wait_read()); if (inb(PS2_DATA) != 0xFA) { assert(0); } if (buf != NULL) { for (i = 0; wait_read() && i < sz; i++) { buf[i] = inb(PS2_DATA); } } }