int _assuan_sock_check_nonce (assuan_context_t ctx, assuan_fd_t fd, assuan_sock_nonce_t *nonce) { #ifdef HAVE_W32_SYSTEM char buffer[16], *p; size_t nleft; int n; if (sizeof nonce->nonce != 16) { gpg_err_set_errno (EINVAL); return -1; } if (nonce->length == 42 && nonce->nonce[0] == 42) return 0; /* Not a Unix domain socket. */ if (nonce->length != 16) { gpg_err_set_errno (EINVAL); return -1; } p = buffer; nleft = 16; while (nleft) { n = _assuan_read (ctx, SOCKET2HANDLE(fd), p, nleft); if (n < 0 && errno == EINTR) ; else if (n < 0 && errno == EAGAIN) Sleep (100); else if (n < 0) return -1; else if (!n) { gpg_err_set_errno (EIO); return -1; } else { p += n; nleft -= n; } } if (memcmp (buffer, nonce->nonce, 16)) { gpg_err_set_errno (EACCES); return -1; } #else (void)fd; (void)nonce; #endif return 0; }
ssize_t _assuan_simple_read (assuan_context_t ctx, void *buffer, size_t size) { return _assuan_read (ctx, ctx->inbound.fd, buffer, size); }