Пример #1
0
char *
uim_helper_buffer_get_message(char *buf)
{
  size_t msg_size;
  char *msg, *msg_term;

  if (UIM_CATCH_ERROR_BEGIN())
    return NULL;

  if (!buf)
    return NULL;

  msg_term = strstr(buf, "\n\n");
  if (msg_term) {
    msg_size = msg_term + 2 - buf;
    msg = uim_malloc(msg_size + 1);
    memcpy(msg, buf, msg_size);
    msg[msg_size] = '\0';
    uim_helper_buffer_shift(buf, msg_size);
  } else {
    msg = NULL;
  }

  UIM_CATCH_ERROR_END();

  return msg;
}
Пример #2
0
static void
write_message(struct client *cl)
{
    int ret, message_len, out_len;
    char *out;

    out = cl->wbuf;
    message_len = out_len = strlen(cl->wbuf);
    while (out_len > 0) {
        if ((ret = write(cl->fd, out, out_len)) < 0) {
            if (errno == EAGAIN) {
#if 0
                fprintf(stderr, "EAGAIN: fd = %d\n", cl->fd);
#endif
            } else {
                perror("uim-helper_server write(2) failed");
                if (errno == EPIPE) {
                    fprintf(stderr, "fd = %d\n", cl->fd);
                    FD_CLR(cl->fd, &s_fdset_read);
                    FD_CLR(cl->fd, &s_fdset_write);
                    if (cl->fd == s_max_fd)
                        s_max_fd--;
                    close_client(cl);
                }
            }
            break;
        } else {
            out += ret;
            out_len -= ret;
        }
    }
    if (out_len == 0) {
        free(cl->wbuf);
        cl->wbuf = uim_strdup("");
        FD_CLR(cl->fd, &s_fdset_write);
    } else {
        uim_helper_buffer_shift(cl->wbuf, message_len - out_len);
    }
}