Exemple #1
0
int
_gpgme_io_read ( int fd, void *buffer, size_t count )
{
    int nread;
    struct reader_context_s *c = find_reader (fd,1);

    DEBUG2 ("fd %d: about to read %d bytes\n", fd, (int)count );
    if ( !c ) {
        DEBUG0 ( "no reader thread\n");
        return -1;
    }
    if (c->eof_shortcut) {
        DEBUG1 ("fd %d: EOF (again)", fd );
        return 0;
    }

    LOCK (c->mutex);
    if (c->readpos == c->writepos && !c->error) { /*no data avail*/
        UNLOCK (c->mutex);
        DEBUG2 ("fd %d: waiting for data from thread %p", fd, c->thread_hd);
        WaitForSingleObject (c->have_data_ev, INFINITE);
        DEBUG2 ("fd %d: data from thread %p available", fd, c->thread_hd);
        LOCK (c->mutex);
    }
    
    if (c->readpos == c->writepos || c->error) {
        UNLOCK (c->mutex);
        c->eof_shortcut = 1;
        if (c->eof) {
            DEBUG1 ("fd %d: EOF", fd );
            return 0;
        }
        if (!c->error) {
            DEBUG1 ("fd %d: EOF but eof flag not set", fd );
            return 0;
        }
        DEBUG1 ("fd %d: read error", fd );
        return -1;
    }
      
    nread = c->readpos < c->writepos? c->writepos - c->readpos
                                    : READBUF_SIZE - c->readpos;
    if (nread > count)
        nread = count;
    memcpy (buffer, c->buffer+c->readpos, nread);
    c->readpos = (c->readpos + nread) % READBUF_SIZE;
    if (c->readpos == c->writepos && !c->eof) {
        if ( !ResetEvent (c->have_data_ev) )
            DEBUG1 ("ResetEvent failed: ec=%d", (int)GetLastError ());
    }
    if (!SetEvent (c->have_space_ev))
        DEBUG1 ("SetEvent failed: ec=%d", (int)GetLastError ());
    UNLOCK (c->mutex);

    DEBUG2 ("fd %d: got %d bytes\n", fd, nread );
    if (nread > 0)
      _gpgme_debug (2, "fd %d: got `%.*s'\n", fd, nread, buffer);

    return nread;
}
Exemple #2
0
int
_gpgme_assuan_log_cb (assuan_context_t ctx, void *hook,
		      unsigned int cat, const char *msg)
{
  if (msg == NULL)
    return 1;

  _gpgme_debug (DEBUG_ASSUAN, "%s", msg);
  return 0;
}
Exemple #3
0
/* Finish construction of *LINE and send it to the debug output
   stream.  */
void
_gpgme_debug_end(void **line)
{
    if(!*line)
        return;

    /* The smallest possible level is 1, so force logging here by
       using that.  */
    _gpgme_debug(1, "%s", *line);
    free(*line);
    *line = NULL;
}
Exemple #4
0
int
_gpgme_io_write ( int fd, const void *buffer, size_t count )
{
    struct writer_context_s *c = find_writer (fd,1);

    DEBUG2 ("fd %d: about to write %d bytes\n", fd, (int)count );
    _gpgme_debug (2, "fd %d: write `%.*s'\n", fd, (int) count, buffer);
    if ( !c ) {
        DEBUG0 ( "no writer thread\n");
        return -1;
    }

    LOCK (c->mutex);
    if ( c->nbytes ) { /* bytes are pending for send */
        /* Reset the is_empty event.  Better safe than sorry.  */
        if (!ResetEvent (c->is_empty))
            DEBUG1 ("ResetEvent failed: ec=%d", (int)GetLastError ());
        UNLOCK (c->mutex);
        DEBUG2 ("fd %d: waiting for empty buffer in thread %p",
                fd, c->thread_hd);
        WaitForSingleObject (c->is_empty, INFINITE);
        DEBUG2 ("fd %d: thread %p buffer is empty", fd, c->thread_hd);
        LOCK (c->mutex);
    }
    
    if ( c->error) {
        UNLOCK (c->mutex);
        DEBUG1 ("fd %d: write error", fd );
        return -1;
    }

    /* If no error occured, the number of bytes in the buffer must be
       zero.  */
    assert (!c->nbytes);

    if (count > WRITEBUF_SIZE)
        count = WRITEBUF_SIZE;
    memcpy (c->buffer, buffer, count);
    c->nbytes = count;

    /* We have to reset the is_empty event early, because it is also
       used by the select() implementation to probe the channel.  */
    if (!ResetEvent (c->is_empty))
        DEBUG1 ("ResetEvent failed: ec=%d", (int)GetLastError ());
    if (!SetEvent (c->have_data))
        DEBUG1 ("SetEvent failed: ec=%d", (int)GetLastError ());
    UNLOCK (c->mutex);

    DEBUG2 ("fd %d:         copied %d bytes\n",
                   fd, (int)count );
    return (int)count;
}
Exemple #5
0
int
_gpgme_io_write(int fd, const void *buffer, size_t count)
{
    int saved_errno;
    int nwritten;

    DEBUG2("fd %d: about to write %d bytes\n", fd, (int) count);
    _gpgme_debug(2, "fd %d: write `%.*s'\n", fd, (int) count, buffer);
    do
    {
        nwritten = _gpgme_ath_write(fd, buffer, count);
    }
    while(nwritten == -1 && errno == EINTR);
    saved_errno = errno;
    DEBUG2("fd %d:          wrote %d bytes\n", fd, (int) nwritten);
    errno = saved_errno;
    return nwritten;
}
Exemple #6
0
int
_gpgme_io_read(int fd, void *buffer, size_t count)
{
    int nread;
    int saved_errno;

    DEBUG2("fd %d: about to read %d bytes\n", fd, (int) count);
    do
    {
        nread = _gpgme_ath_read(fd, buffer, count);
    }
    while(nread == -1 && errno == EINTR);
    saved_errno = errno;
    DEBUG2("fd %d: got %d bytes\n", fd, nread);
    if(nread > 0)
        _gpgme_debug(2, "fd %d: got `%.*s'\n", fd, nread, buffer);
    errno = saved_errno;
    return nread;
}
Exemple #7
0
int
_gpgme_io_recvmsg(int fd, struct msghdr *msg, int flags)
{
    int nread;
    int saved_errno;
    struct iovec *iov;

    nread = 0;
    iov = msg->msg_iov;
    while(iov < msg->msg_iov + msg->msg_iovlen)
    {
        nread += iov->iov_len;
        iov++;
    }

    DEBUG2("fd %d: about to receive %d bytes\n",
           fd, (int) nread);
    do
    {
        nread = _gpgme_ath_recvmsg(fd, msg, flags);
    }
    while(nread == -1 && errno == EINTR);
    saved_errno = errno;
    DEBUG2("fd %d: got %d bytes\n", fd, nread);
    if(nread > 0)
    {
        int nr = nread;

        iov = msg->msg_iov;
        while(nr > 0)
        {
            int len = nr > iov->iov_len ? iov->iov_len : nr;
            _gpgme_debug(2, "fd %d: got `%.*s'\n", fd, len,
                         msg->msg_iov->iov_base);
            iov++;
            nr -= len;
        }
    }
    errno = saved_errno;
    return nread;
}
Exemple #8
0
int
_gpgme_io_sendmsg(int fd, const struct msghdr *msg, int flags)
{
    int saved_errno;
    int nwritten;
    struct iovec *iov;

    nwritten = 0;
    iov = msg->msg_iov;
    while(iov < msg->msg_iov + msg->msg_iovlen)
    {
        nwritten += iov->iov_len;
        iov++;
    }

    DEBUG2("fd %d: about to write %d bytes\n", fd, (int) nwritten);
    iov = msg->msg_iov;
    while(nwritten > 0)
    {
        int len = nwritten > iov->iov_len ? iov->iov_len : nwritten;
        _gpgme_debug(2, "fd %d: write `%.*s'\n", fd, len,
                     msg->msg_iov->iov_base);
        iov++;
        nwritten -= len;
    }

    do
    {
        nwritten = _gpgme_ath_sendmsg(fd, msg, flags);
    }
    while(nwritten == -1 && errno == EINTR);
    saved_errno = errno;
    DEBUG2("fd %d:          wrote %d bytes\n", fd, (int) nwritten);
    errno = saved_errno;
    return nwritten;
}