/* Privileged read loop */ static void privsep_read_loop(void) { while (1) { struct privsep_command cmd; int ret = readn(pfd, &cmd, sizeof(cmd)); if (ret <= 0) { /* Error or EOF, give up */ if (ret < 0) { flog(LOG_ERR, "Exiting, privsep_read_loop had readn error: %s", strerror(errno)); } else { flog(LOG_ERR, "Exiting, privsep_read_loop had readn return 0 bytes"); } } if (ret != sizeof(cmd)) { /* Short read, ignore */ return; } cmd.iface[IFNAMSIZ - 1] = '\0'; switch (cmd.type) { case SET_INTERFACE_LINKMTU: if (cmd.val < MIN_AdvLinkMTU || cmd.val > MAX_AdvLinkMTU) { flog(LOG_ERR, "(privsep) %s: LinkMTU (%u) is not within the defined bounds, ignoring", cmd.iface, cmd.val); break; } ret = set_interface_var(cmd.iface, PROC_SYS_IP6_LINKMTU, "LinkMTU", cmd.val); break; case SET_INTERFACE_CURHLIM: if (cmd.val < MIN_AdvCurHopLimit || cmd.val > MAX_AdvCurHopLimit) { flog(LOG_ERR, "(privsep) %s: CurHopLimit (%u) is not within the defined bounds, ignoring", cmd.iface, cmd.val); break; } ret = set_interface_var(cmd.iface, PROC_SYS_IP6_CURHLIM, "CurHopLimit", cmd.val); break; case SET_INTERFACE_REACHTIME: if (cmd.val < MIN_AdvReachableTime || cmd.val > MAX_AdvReachableTime) { flog(LOG_ERR, "(privsep) %s: BaseReachableTimer (%u) is not within the defined bounds, ignoring", cmd.iface, cmd.val); break; } ret = set_interface_var(cmd.iface, PROC_SYS_IP6_BASEREACHTIME_MS, "BaseReachableTimer (ms)", cmd.val); if (ret == 0) break; set_interface_var(cmd.iface, PROC_SYS_IP6_BASEREACHTIME, "BaseReachableTimer", cmd.val / 1000); break; case SET_INTERFACE_RETRANSTIMER: if (cmd.val < MIN_AdvRetransTimer || cmd.val > MAX_AdvRetransTimer) { flog(LOG_ERR, "(privsep) %s: RetransTimer (%u) is not within the defined bounds, ignoring", cmd.iface, cmd.val); break; } ret = set_interface_var(cmd.iface, PROC_SYS_IP6_RETRANSTIMER_MS, "RetransTimer (ms)", cmd.val); if (ret == 0) break; set_interface_var(cmd.iface, PROC_SYS_IP6_RETRANSTIMER, "RetransTimer", cmd.val / 1000 * USER_HZ); /* XXX user_hz */ break; default: /* Bad command */ break; } } }
/* Privileged read loop */ void privsep_read_loop(void) { struct privsep_command cmd; int ret; while (1) { ret = readn(pfd, &cmd, sizeof(cmd)); if (ret <= 0) { /* Error or EOF, give up */ close(pfd); _exit(0); } if (ret != sizeof(cmd)) { /* Short read, ignore */ /* BEGIN 3061302357 y00188255 2013-6-28 Modified */ return; /* END 3061302357 y00188255 2013-6-28 Modified */ } cmd.iface[IFNAMSIZ-1] = '\0'; switch(cmd.type) { case SET_INTERFACE_LINKMTU: if (cmd.val < MIN_AdvLinkMTU || cmd.val > MAX_AdvLinkMTU) { flog(LOG_ERR, "(privsep) %s: LinkMTU (%u) is not within the defined bounds, ignoring", cmd.iface, cmd.val); break; } ret = set_interface_var(cmd.iface, PROC_SYS_IP6_LINKMTU, "LinkMTU", cmd.val); break; case SET_INTERFACE_CURHLIM: if (cmd.val < MIN_AdvCurHopLimit || cmd.val > MAX_AdvCurHopLimit) { flog(LOG_ERR, "(privsep) %s: CurHopLimit (%u) is not within the defined bounds, ignoring", cmd.iface, cmd.val); break; } ret = set_interface_var(cmd.iface, PROC_SYS_IP6_CURHLIM, "CurHopLimit", cmd.val); break; case SET_INTERFACE_REACHTIME: if (cmd.val < MIN_AdvReachableTime || cmd.val > MAX_AdvReachableTime) { flog(LOG_ERR, "(privsep) %s: BaseReachableTimer (%u) is not within the defined bounds, ignoring", cmd.iface, cmd.val); break; } ret = set_interface_var(cmd.iface, PROC_SYS_IP6_BASEREACHTIME_MS, "BaseReachableTimer (ms)", cmd.val); if (ret == 0) break; set_interface_var(cmd.iface, PROC_SYS_IP6_BASEREACHTIME, "BaseReachableTimer", cmd.val / 1000); break; case SET_INTERFACE_RETRANSTIMER: if (cmd.val < MIN_AdvRetransTimer || cmd.val > MAX_AdvRetransTimer) { flog(LOG_ERR, "(privsep) %s: RetransTimer (%u) is not within the defined bounds, ignoring", cmd.iface, cmd.val); break; } ret = set_interface_var(cmd.iface, PROC_SYS_IP6_RETRANSTIMER_MS, "RetransTimer (ms)", cmd.val); if (ret == 0) break; set_interface_var(cmd.iface, PROC_SYS_IP6_RETRANSTIMER, "RetransTimer", cmd.val / 1000 * USER_HZ); /* XXX user_hz */ break; default: /* Bad command */ break; } } }