Page MenuHomeFreeBSD

D61146.1794142046.diff
No OneTemporary

Authored By
Unknown
Size
3 KB
Referenced Files
None
Subscribers
None

D61146.1794142046.diff

diff --git a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
--- a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
+++ b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_device_tbl.c
@@ -82,10 +82,10 @@
/* maximum number of ticks between updates of device table */
uint32_t device_tbl_refresh = 10 * 100;
-/* socket for /var/run/devd.pipe */
+/* socket for /var/run/devd.seqpacket.pipe */
static int devd_sock = -1;
-/* used to wait notifications from /var/run/devd.pipe */
+/* used to wait notifications from /var/run/devd.seqpacket.pipe */
static void *devd_fd;
/* some constants */
@@ -401,29 +401,26 @@
static int
create_devd_socket(void)
{
+ struct sockaddr_un devd_addr = {
+ .sun_family = AF_LOCAL,
+ .sun_len = sizeof(devd_addr),
+ .sun_path = PATH_DEVD_PIPE,
+ };
int d_sock;
- struct sockaddr_un devd_addr;
- bzero(&devd_addr, sizeof(struct sockaddr_un));
-
- if ((d_sock = socket(PF_LOCAL, SOCK_STREAM, 0)) < 0) {
+ if ((d_sock = socket(PF_LOCAL, SOCK_SEQPACKET, 0)) < 0) {
syslog(LOG_ERR, "Failed to create the socket for %s: %m",
- PATH_DEVD_PIPE);
+ devd_addr.sun_path);
return (-1);
}
- devd_addr.sun_family = PF_LOCAL;
- devd_addr.sun_len = sizeof(devd_addr);
- strlcpy(devd_addr.sun_path, PATH_DEVD_PIPE,
- sizeof(devd_addr.sun_path) - 1);
-
if (connect(d_sock, (struct sockaddr *)&devd_addr,
sizeof(devd_addr)) == -1) {
syslog(LOG_ERR,"Failed to connect socket for %s: %m",
- PATH_DEVD_PIPE);
+ devd_addr.sun_path);
if (close(d_sock) < 0 )
syslog(LOG_ERR,"Failed to close socket for %s: %m",
- PATH_DEVD_PIPE);
+ devd_addr.sun_path);
return (-1);
}
@@ -439,46 +436,29 @@
static void
devd_socket_callback(int fd, void *arg __unused)
{
- char buf[512];
- int read_len = -1;
+ char buf[DEVCTL_BUFFER];
+ ssize_t len;
assert(fd == devd_sock);
HRDBG("called");
-again:
- read_len = read(fd, buf, sizeof(buf));
- if (read_len < 0) {
- if (errno == EBADF) {
- devd_sock = -1;
- if (devd_fd != NULL) {
- fd_deselect(devd_fd);
- devd_fd = NULL;
- }
- syslog(LOG_ERR, "Closing devd_fd, revert to "
- "devinfo polling");
- }
-
- } else if (read_len == 0) {
- syslog(LOG_ERR, "zero bytes read from devd pipe... "
- "closing socket!");
-
- if (close(devd_sock) < 0 )
- syslog(LOG_ERR, "Failed to close devd socket: %m");
-
+ if ((len = read(fd, buf, sizeof(buf))) > 0) {
+ /* Only refresh device table on a device add or remove event. */
+ if (buf[0] == '+' || buf[0] == '-')
+ refresh_device_tbl(1);
+ } else {
+ if (len == 0)
+ syslog(LOG_ERR, "zero bytes read(2) on devd socket");
+ else
+ syslog(LOG_ERR, "read(2) on devd socket: %m");
+ syslog(LOG_ERR, "Reverting to devinfo polling");
+ (void)close(devd_sock);
devd_sock = -1;
if (devd_fd != NULL) {
fd_deselect(devd_fd);
devd_fd = NULL;
}
- syslog(LOG_ERR, "Closing devd_fd, revert to devinfo polling");
-
- } else {
- if (read_len == sizeof(buf))
- goto again;
- /* Only refresh device table on a device add or remove event. */
- if (buf[0] == '+' || buf[0] == '-')
- refresh_device_tbl(1);
}
}
diff --git a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.h b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.h
--- a/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.h
+++ b/usr.sbin/bsnmpd/modules/snmp_hostres/hostres_snmp.h
@@ -81,7 +81,13 @@
#endif /*NDEBUG*/
/* path to devd(8) output pipe */
-#define PATH_DEVD_PIPE "/var/run/devd.pipe"
+#define PATH_DEVD_PIPE "/var/run/devd.seqpacket.pipe"
+/*
+ * XXXGL: the kernel has DEVCTL_BUFFER slightly less than 1024. The devd(8)
+ * has DEVCTL_MAXBUF set to 8192. This needs to be in /usr/include and
+ * documented.
+ */
+#define DEVCTL_BUFFER 1024
#define IS_KERNPROC(kp) (((kp)->ki_flag & P_KPROC) == P_KPROC)

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 8, 12:47 PM (22 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41586312
Default Alt Text
D61146.1794142046.diff (3 KB)

Event Timeline