static bool try_command(json_t *cmd, int timeout) { w_stm_t client = NULL; w_jbuffer_t buffer; w_jbuffer_t output_pdu_buffer; int err; client = w_stm_connect(sock_name, timeout * 1000); if (client == NULL) { return false; } if (!cmd) { w_stm_close(client); return true; } w_json_buffer_init(&buffer); // Send command if (!w_ser_write_pdu(server_pdu, &buffer, client, cmd)) { err = errno; w_log(W_LOG_ERR, "error sending PDU to server\n"); w_json_buffer_free(&buffer); w_stm_close(client); errno = err; return false; } w_json_buffer_reset(&buffer); w_json_buffer_init(&output_pdu_buffer); do { if (!w_json_buffer_passthru( &buffer, output_pdu, &output_pdu_buffer, client)) { err = errno; w_json_buffer_free(&buffer); w_json_buffer_free(&output_pdu_buffer); w_stm_close(client); errno = err; return false; } } while (persistent); w_json_buffer_free(&buffer); w_json_buffer_free(&output_pdu_buffer); w_stm_close(client); return true; }
static bool try_command(json_t *cmd, int timeout) { int fd; int res; int tries; int bufsize; w_jbuffer_t buffer; fd = socket(PF_LOCAL, SOCK_STREAM, 0); if (fd == -1) { perror("socket"); return false; } tries = 0; do { res = connect(fd, (struct sockaddr*)&un, sizeof(un)); if (res == 0) { break; } if (timeout && tries < timeout && should_start(errno)) { // Wait for socket to come up sleep(1); continue; } } while (++tries < timeout); if (res) { close(fd); return false; } if (!cmd) { close(fd); return true; } bufsize = WATCHMAN_IO_BUF_SIZE; setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize)); w_json_buffer_init(&buffer); // Send command if (!w_ser_write_pdu(server_pdu, &buffer, fd, cmd)) { w_log(W_LOG_ERR, "error sending PDU to server\n"); w_json_buffer_free(&buffer); close(fd); return false; } w_json_buffer_reset(&buffer); do { if (!w_json_buffer_passthru(&buffer, output_pdu, fd)) { w_json_buffer_free(&buffer); close(fd); return false; } } while (persistent); w_json_buffer_free(&buffer); close(fd); return true; }