static gssize log_transport_device_read_method(LogTransport *s, gpointer buf, gsize buflen, GSockAddr **sa) { LogTransportDevice *self = (LogTransportDevice *) s; gint rc; if (sa) *sa = NULL; do { if (self->timeout) alarm_set(self->timeout); rc = read(self->super.fd, buf, buflen); if (self->timeout > 0 && rc == -1 && errno == EINTR && alarm_has_fired()) { msg_notice("Nonblocking read has blocked, returning with an error", evt_tag_int("fd", self->super.fd), evt_tag_int("timeout", self->timeout), NULL); alarm_cancel(); break; } if (self->timeout) alarm_cancel(); } while (rc == -1 && errno == EINTR); return rc; }
static gssize log_transport_plain_write_method(LogTransport *s, const gpointer buf, gsize buflen) { LogTransportPlain *self = (LogTransportPlain *) s; gint rc; do { if (self->super.timeout) alarm_set(self->super.timeout); if (self->super.flags & LTF_APPEND) lseek(self->super.fd, 0, SEEK_END); rc = write(self->super.fd, buf, buflen); if (self->super.timeout > 0 && rc == -1 && errno == EINTR && alarm_has_fired()) { msg_notice("Nonblocking write has blocked, returning with an error", evt_tag_int("fd", self->super.fd), evt_tag_int("timeout", self->super.timeout), NULL); alarm_cancel(); break; } if (self->super.timeout) alarm_cancel(); if (self->super.flags & LTF_FSYNC) fsync(self->super.fd); } while (rc == -1 && errno == EINTR); return rc; }
static gssize log_transport_plain_read_method(LogTransport *s, gpointer buf, gsize buflen, GSockAddr **sa) { LogTransportPlain *self = (LogTransportPlain *) s; gint rc; if ((self->super.flags & LTF_RECV) == 0) { if (sa) *sa = NULL; do { if (self->super.timeout) alarm_set(self->super.timeout); rc = read(self->super.fd, buf, buflen); if (self->super.timeout > 0 && rc == -1 && errno == EINTR && alarm_has_fired()) { msg_notice("Nonblocking read has blocked, returning with an error", evt_tag_int("fd", self->super.fd), evt_tag_int("timeout", self->super.timeout), NULL); alarm_cancel(); break; } if (self->super.timeout) alarm_cancel(); } while (rc == -1 && errno == EINTR); } else { union { #if HAVE_STRUCT_SOCKADDR_STORAGE struct sockaddr_storage __sas; #endif struct sockaddr __sa; } sas; socklen_t salen = sizeof(sas); do { rc = recvfrom(self->super.fd, buf, buflen, 0, (struct sockaddr *) &sas, &salen); } while (rc == -1 && errno == EINTR); if (rc != -1 && salen && sa) (*sa) = g_sockaddr_new((struct sockaddr *) &sas, salen); } return rc; }
static void afuser_dd_queue(LogPipe *s, LogMessage *msg, const LogPathOptions *path_options) { AFUserDestDriver *self = (AFUserDestDriver *) s; gchar buf[8192]; struct utmp *ut; GString *timestamp; time_t now; now = msg->timestamps[LM_TS_RECVD].time.tv_sec; if (self->disable_until && self->disable_until > now) goto finish; timestamp = g_string_sized_new(0); log_stamp_format(&msg->timestamps[LM_TS_STAMP], timestamp, TS_FMT_FULL, -1, 0); g_snprintf(buf, sizeof(buf), "%s %s %s\n", timestamp->str, log_msg_get_value(msg, LM_V_HOST, NULL), log_msg_get_value(msg, LM_V_MESSAGE, NULL)); g_string_free(timestamp, TRUE); /* NOTE: there's a private implementations of getutent in utils.c on Systems which do not provide one. */ while ((ut = getutent())) { #if HAVE_MODERN_UTMP if (ut->ut_type == USER_PROCESS && ((self->username->len == 1 && self->username->str[0] == '*') || (self->username->len <= sizeof(ut->ut_user) && memcmp(self->username->str, ut->ut_user, self->username->len) == 0))) #else if ((self->username->len == 1 && self->username->str[0] == '*') || (self->username->len <= sizeof(ut->ut_name) && memcmp(self->username->str, ut->ut_name, self->username->len) == 0)) #endif { gchar line[128]; gchar *p = line; int fd; if (ut->ut_line[0] != '/') { strcpy(line, "/dev/"); p = line + 5; } else line[0] = 0; strncpy(p, ut->ut_line, sizeof(line) - (p - line)); fd = open(line, O_NOCTTY | O_APPEND | O_WRONLY | O_NONBLOCK); if (fd != -1) { alarm_set(10); if (write(fd, buf, strlen(buf)) < 0 && errno == EINTR && alarm_has_fired()) { msg_notice("Writing to the user terminal has blocked for 10 seconds, disabling for 10 minutes", evt_tag_str("user", self->username->str), NULL); self->disable_until = now + 600; } alarm_cancel(); close(fd); } } } endutent(); finish: log_msg_ack(msg, path_options); log_msg_unref(msg); }