static void afinet_dd_queue(LogPipe *s, LogMessage *msg, const LogPathOptions *path_options, gpointer user_data) { #if SYSLOG_NG_ENABLE_SPOOF_SOURCE AFInetDestDriver *self = (AFInetDestDriver *) s; /* NOTE: this code should probably become a LogTransport instance so that * spoofed packets are also going through the LogWriter queue */ if (self->spoof_source && self->lnet_ctx && msg->saddr && (msg->saddr->sa.sa_family == AF_INET || msg->saddr->sa.sa_family == AF_INET6) && log_writer_opened(self->super.writer)) { gboolean success = FALSE; g_assert(self->super.transport_mapper->sock_type == SOCK_DGRAM); g_static_mutex_lock(&self->lnet_lock); if (!self->lnet_buffer) self->lnet_buffer = g_string_sized_new(self->spoof_source_maxmsglen); log_writer_format_log(self->super.writer, msg, self->lnet_buffer); if (self->lnet_buffer->len > self->spoof_source_maxmsglen) g_string_truncate(self->lnet_buffer, self->spoof_source_maxmsglen); switch (self->super.dest_addr->sa.sa_family) { case AF_INET: success = afinet_dd_construct_ipv4_packet(self, msg, self->lnet_buffer); break; #if SYSLOG_NG_ENABLE_IPV6 case AF_INET6: success = afinet_dd_construct_ipv6_packet(self, msg, self->lnet_buffer); break; #endif default: g_assert_not_reached(); } if (success) { if (libnet_write(self->lnet_ctx) >= 0) { /* we have finished processing msg */ log_msg_ack(msg, path_options, AT_PROCESSED); log_msg_unref(msg); g_static_mutex_unlock(&self->lnet_lock); return; } else { msg_error("Error sending raw frame", evt_tag_str("error", libnet_geterror(self->lnet_ctx))); } } g_static_mutex_unlock(&self->lnet_lock); } #endif log_dest_driver_queue_method(s, msg, path_options, user_data); }
static void afinet_dd_queue(LogPipe *s, LogMessage *msg, const LogPathOptions *path_options) { #if ENABLE_SPOOF_SOURCE AFInetDestDriver *self = (AFInetDestDriver *) s; if (self->spoof_source && self->lnet_ctx && msg->saddr && (msg->saddr->sa.sa_family == AF_INET || msg->saddr->sa.sa_family == AF_INET6)) { gboolean success = FALSE; GString *msg_line = g_string_sized_new(256); g_assert((self->super.flags & AFSOCKET_DGRAM) != 0); log_writer_format_log((LogWriter *) self->super.writer, msg, msg_line); switch (self->super.dest_addr->sa.sa_family) { case AF_INET: success = afinet_dd_construct_ipv4_packet(self, msg, msg_line); break; #if ENABLE_IPV6 case AF_INET6: success = afinet_dd_construct_ipv6_packet(self, msg, msg_line); break; #endif default: g_assert_not_reached(); } if (success) { if (libnet_write(self->lnet_ctx) >= 0) { /* we have finished processing msg */ log_msg_ack(msg, path_options); log_msg_unref(msg); g_string_free(msg_line, TRUE); return; } else { msg_error("Error sending raw frame", evt_tag_str("error", libnet_geterror(self->lnet_ctx)), NULL); } } g_string_free(msg_line, TRUE); } #endif log_pipe_forward_msg(s, msg, path_options); }