我试图了解来自内核环形缓冲区的日志是如何被 solaris 操作系统中的 audit_binfile 和 audit_syslog 等插件捕获和修改的。我在网上看到有一个套接字通过它发送日志消息 -> /dev/log ,所以我尝试使用以下程序访问它:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <syslog.h>
#define SOCK_PATH "/dev/log"
int main(int argc, char *argv[])
{
struct sockaddr_un addr;
char buf[4096];
int fd, n, yes = 1;
// Create socket
if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// Set SO_REUSEADDR option
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
// Bind to /dev/log socket
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path)-1);
if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
// Read from socket and print log messages
while ((n = recv(fd, buf, sizeof(buf), 0)) > 0) {
buf[n] = '\0';
printf("%s", buf);
}
// Close socket
close(fd);
return 0;
}
当我运行它时,我得到这个错误 -> bind: Address already in use 即使我已经使用了 SO_REUSEADDR
请让我知道我出了什么问题,或者我对 /dev/log 的整个想法是错误的吗?非常感谢有关此的任何见解。提前致谢!
/dev/log 用于系统日志,而不是审计消息。