/** * @brief call to process any new requests from Erlang */ void erlcmd_process(struct erlcmd *handler) { ssize_t amount_read = read(STDIN_FILENO, handler->buffer + handler->index, sizeof(handler->buffer) - handler->index); if (amount_read < 0) { /* EINTR is ok to get, since we were interrupted by a signal. */ if (errno == EINTR) return; /* Everything else is unexpected. */ err(EXIT_FAILURE, "read"); } else if (amount_read == 0) { /* EOF. Erlang process was terminated. This happens after a release or if there was an error. */ exit(EXIT_SUCCESS); } handler->index += amount_read; for (;;) { size_t bytes_processed = erlcmd_try_dispatch(handler); if (bytes_processed == 0) { /* Only have part of the command to process. */ break; } else if (handler->index > bytes_processed) { /* Processed the command and there's more data. */ memmove(handler->buffer, &handler->buffer[bytes_processed], handler->index - bytes_processed); handler->index -= bytes_processed; } else { /* Processed the whole buffer. */ handler->index = 0; break; } } }
/** * @brief Call to process any new requests from Erlang * * @return 1 if the program should exit gracefully */ int erlcmd_process(struct erlcmd *handler) { #ifdef __WIN32__ DWORD amount_read; BOOL rc = GetOverlappedResult(handler->h, &handler->overlapped, &amount_read, FALSE); if (!rc) { DWORD last_error = GetLastError(); // Check if this was a spurious event. if (last_error == ERROR_IO_PENDING) return 0; // Error - most likely the Erlang port connected to us was closed. // Tell the caller to exit gracefully. return 1; } ResetEvent(handler->overlapped.hEvent); #else ssize_t amount_read = read(STDIN_FILENO, handler->buffer + handler->index, sizeof(handler->buffer) - handler->index); if (amount_read < 0) { /* EINTR is ok to get, since we were interrupted by a signal. */ if (errno == EINTR) return 0; /* Everything else is unexpected. */ err(EXIT_FAILURE, "read"); } else if (amount_read == 0) { /* EOF. Erlang process was terminated. This happens after a release or if there was an error. */ return 1; } #endif handler->index += amount_read; for (;;) { size_t bytes_processed = erlcmd_try_dispatch(handler); if (bytes_processed == 0) { /* Only have part of the command to process. */ break; } else if (handler->index > bytes_processed) { /* Processed the command and there's more data. */ memmove(handler->buffer, &handler->buffer[bytes_processed], handler->index - bytes_processed); handler->index -= bytes_processed; } else { /* Processed the whole buffer. */ handler->index = 0; break; } } #ifdef __WIN32__ start_async_read(handler); #endif return 0; }