summaryrefslogtreecommitdiffstats
path: root/input/packet/ulogd_inppkt_UNIXSOCK.c
diff options
context:
space:
mode:
Diffstat (limited to 'input/packet/ulogd_inppkt_UNIXSOCK.c')
-rw-r--r--input/packet/ulogd_inppkt_UNIXSOCK.c57
1 files changed, 27 insertions, 30 deletions
diff --git a/input/packet/ulogd_inppkt_UNIXSOCK.c b/input/packet/ulogd_inppkt_UNIXSOCK.c
index 39944bf..f1d1534 100644
--- a/input/packet/ulogd_inppkt_UNIXSOCK.c
+++ b/input/packet/ulogd_inppkt_UNIXSOCK.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <inttypes.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/ether.h>
@@ -370,7 +371,7 @@ struct ulogd_unixsock_option_t {
static int handle_packet(struct ulogd_pluginstance *upi, struct ulogd_unixsock_packet_t *pkt, uint16_t total_len)
{
char *data = NULL;
- struct iphdr *ip;
+ unsigned int ip_version = pkt->payload.version;
struct ulogd_key *ret = upi->output.keys;
uint8_t oob_family;
uint16_t payload_len;
@@ -386,22 +387,22 @@ static int handle_packet(struct ulogd_pluginstance *upi, struct ulogd_unixsock_p
payload_len = ntohs(pkt->payload_length);
- ip = &pkt->payload;
- if (ip->version == 4)
+ if (ip_version == 4)
oob_family = AF_INET;
- else if (ip->version == 6)
+ else if (ip_version == 6)
oob_family = AF_INET6;
- else oob_family = 0;
+ else
+ oob_family = 0;
okey_set_u8(&ret[UNIXSOCK_KEY_OOB_FAMILY], oob_family);
- okey_set_ptr(&ret[UNIXSOCK_KEY_RAW_PCKT], ip);
+ okey_set_ptr(&ret[UNIXSOCK_KEY_RAW_PCKT], &pkt->payload);
okey_set_u32(&ret[UNIXSOCK_KEY_RAW_PCKTLEN], payload_len);
/* options */
if (total_len > payload_len + sizeof(uint16_t)) {
/* option starts at the next aligned address after the payload */
new_offset = USOCK_ALIGN(payload_len);
- options_start = (void*)ip + new_offset;
+ options_start = (void*)&pkt->payload + new_offset;
data = options_start;
total_len -= (options_start - (char*)pkt);
@@ -459,7 +460,7 @@ static int handle_packet(struct ulogd_pluginstance *upi, struct ulogd_unixsock_p
"ulogd2: unknown option %d\n",
option_number);
break;
- };
+ }
}
}
@@ -473,35 +474,31 @@ static int handle_packet(struct ulogd_pluginstance *upi, struct ulogd_unixsock_p
static int _create_unix_socket(const char *unix_path)
{
+ struct sockaddr_un server_sock = { .sun_family = AF_UNIX };
int ret = -1;
- struct sockaddr_un server_sock;
int s;
- struct stat st_dummy;
- s = socket(AF_UNIX, SOCK_STREAM, 0);
- if (s < 0) {
+ if (strlen(unix_path) >= sizeof(server_sock.sun_path)) {
ulogd_log(ULOGD_ERROR,
- "ulogd2: could not create unix socket\n");
+ "ulogd2: unix socket path '%s' too long\n",
+ unix_path);
return -1;
}
- server_sock.sun_family = AF_UNIX;
- strncpy(server_sock.sun_path, unix_path, sizeof(server_sock.sun_path));
- server_sock.sun_path[sizeof(server_sock.sun_path)-1] = '\0';
+ strcpy(server_sock.sun_path, unix_path);
- if (stat(unix_path, &st_dummy) == 0 && st_dummy.st_size > 0) {
+ s = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (s < 0) {
ulogd_log(ULOGD_ERROR,
- "ulogd2: unix socket \'%s\' already exists\n",
- unix_path);
- close(s);
+ "ulogd2: could not create unix socket\n");
return -1;
}
ret = bind(s, (struct sockaddr *)&server_sock, sizeof(server_sock));
if (ret < 0) {
ulogd_log(ULOGD_ERROR,
- "ulogd2: could not bind to unix socket \'%s\'\n",
- server_sock.sun_path);
+ "ulogd2: could not bind to unix socket '%s'\n",
+ server_sock.sun_path);
close(s);
return -1;
}
@@ -509,8 +506,8 @@ static int _create_unix_socket(const char *unix_path)
ret = listen(s, 10);
if (ret < 0) {
ulogd_log(ULOGD_ERROR,
- "ulogd2: could not bind to unix socket \'%s\'\n",
- server_sock.sun_path);
+ "ulogd2: could not listen to unix socket '%s'\n",
+ server_sock.sun_path);
close(s);
return -1;
}
@@ -632,9 +629,9 @@ static int unixsock_instance_read_cb(int fd, unsigned int what, void *param)
packet_sig = ntohl(unixsock_packet->marker);
if (packet_sig != ULOGD_SOCKET_MARK) {
ulogd_log(ULOGD_ERROR,
- "ulogd2: invalid packet marked received "
- "(read %lx, expected %lx), closing socket.\n",
- packet_sig, ULOGD_SOCKET_MARK);
+ "ulogd2: invalid packet marked received "
+ "(read %" PRIx32 ", expected %" PRIx32 "), closing socket.\n",
+ packet_sig, ULOGD_SOCKET_MARK);
_disconnect_client(ui);
return -1;
@@ -663,13 +660,13 @@ static int unixsock_instance_read_cb(int fd, unsigned int what, void *param)
}
} else {
- ulogd_log(ULOGD_DEBUG, " We have %d bytes, but need %d. Requesting more\n",
- ui->unixsock_buf_avail, needed_len + sizeof(uint32_t));
+ ulogd_log(ULOGD_DEBUG, " We have %u bytes, but need %zu. Requesting more\n",
+ ui->unixsock_buf_avail, needed_len + sizeof(uint32_t));
return 0;
}
/* handle_packet has shifted data in buffer */
- };
+ }
return 0;
}