diff --git a/bin/ksh/edit.c b/bin/ksh/edit.c index 3089d195d..a06cbe7b4 100644 --- a/bin/ksh/edit.c +++ b/bin/ksh/edit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: edit.c,v 1.69 2019/06/28 13:34:59 deraadt Exp $ */ +/* $OpenBSD: edit.c,v 1.70 2023/06/21 22:22:08 millert Exp $ */ /* * Command line editing - common code @@ -294,6 +294,67 @@ static void glob_table(const char *pat, XPtrV *wp, struct table *tp); static void glob_path(int flags, const char *pat, XPtrV *wp, const char *path); +static char * +plain_fmt_entry(void *arg, int i, char *buf, int bsize) +{ + const char *str = ((char *const *)arg)[i]; + char *buf0 = buf; + int ch; + + if (buf == NULL || bsize <= 0) + internal_errorf("%s: buf %lx, bsize %d", + __func__, (long) buf, bsize); + + while ((ch = (unsigned char)*str++) != '\0') { + if (iscntrl(ch)) { + if (bsize < 3) + break; + *buf++ = '^'; + *buf++ = UNCTRL(ch); + bsize -= 2; + continue; + } + if (bsize < 2) + break; + *buf++ = ch; + bsize--; + } + *buf = '\0'; + + return buf0; +} + +/* Compute the length of string taking into account escape characters. */ +static size_t +strlen_esc(const char *str) +{ + size_t len = 0; + int ch; + + while ((ch = (unsigned char)*str++) != '\0') { + if (iscntrl(ch)) + len++; + len++; + } + return len; +} + +static int +pr_list(char *const *ap) +{ + char *const *pp; + int nwidth; + int i, n; + + for (n = 0, nwidth = 0, pp = ap; *pp; n++, pp++) { + i = strlen_esc(*pp); + nwidth = (i > nwidth) ? i : nwidth; + } + print_columns(shl_out, n, plain_fmt_entry, (void *) ap, nwidth + 1, 0); + + return n; +} + void x_print_expansions(int nwords, char *const *words, int is_command) { diff --git a/bin/ksh/edit.h b/bin/ksh/edit.h index 0b604cd64..1d573e1f6 100644 --- a/bin/ksh/edit.h +++ b/bin/ksh/edit.h @@ -1,4 +1,4 @@ -/* $OpenBSD: edit.h,v 1.12 2018/06/18 17:03:58 millert Exp $ */ +/* $OpenBSD: edit.h,v 1.13 2023/06/21 22:22:08 millert Exp $ */ /* NAME: * edit.h - globals for edit modes @@ -16,6 +16,10 @@ #define BEL 0x07 +#undef CTRL +#define CTRL(x) ((x) == '?' ? 0x7F : (x) & 0x1F) /* ASCII */ +#define UNCTRL(x) ((x) == 0x7F ? '?' : (x) | 0x40) /* ASCII */ + /* tty driver characters we are interested in */ typedef struct { int erase; diff --git a/bin/ksh/emacs.c b/bin/ksh/emacs.c index 5370e814f..3c9b0074d 100644 --- a/bin/ksh/emacs.c +++ b/bin/ksh/emacs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: emacs.c,v 1.89 2021/10/09 21:38:00 halex Exp $ */ +/* $OpenBSD: emacs.c,v 1.90 2023/06/21 22:22:08 millert Exp $ */ /* * Emacs-like command line editing and history @@ -32,10 +32,6 @@ static Area aedit; #define AEDIT &aedit /* area for kill ring and macro defns */ -#undef CTRL -#define CTRL(x) ((x) == '?' ? 0x7F : (x) & 0x1F) /* ASCII */ -#define UNCTRL(x) ((x) == 0x7F ? '?' : (x) | 0x40) /* ASCII */ - /* values returned by keyboard functions */ #define KSTD 0 #define KEOL 1 /* ^M, ^J */ diff --git a/bin/ksh/exec.c b/bin/ksh/exec.c index 887f6f95a..69a1cb97b 100644 --- a/bin/ksh/exec.c +++ b/bin/ksh/exec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: exec.c,v 1.76 2022/10/10 14:57:48 kn Exp $ */ +/* $OpenBSD: exec.c,v 1.77 2023/06/21 22:22:08 millert Exp $ */ /* * execute command tree @@ -1340,33 +1340,6 @@ pr_menu(char *const *ap) return n; } -/* XXX: horrible kludge to fit within the framework */ - -static char *plain_fmt_entry(void *arg, int i, char *buf, int buflen); - -static char * -plain_fmt_entry(void *arg, int i, char *buf, int buflen) -{ - shf_snprintf(buf, buflen, "%s", ((char *const *)arg)[i]); - return buf; -} - -int -pr_list(char *const *ap) -{ - char *const *pp; - int nwidth; - int i, n; - - for (n = 0, nwidth = 0, pp = ap; *pp; n++, pp++) { - i = strlen(*pp); - nwidth = (i > nwidth) ? i : nwidth; - } - print_columns(shl_out, n, plain_fmt_entry, (void *) ap, nwidth + 1, 0); - - return n; -} - /* * [[ ... ]] evaluation routines */ diff --git a/bin/ksh/sh.h b/bin/ksh/sh.h index 93beef31d..bffb374e0 100644 --- a/bin/ksh/sh.h +++ b/bin/ksh/sh.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sh.h,v 1.76 2020/07/07 10:33:58 jca Exp $ */ +/* $OpenBSD: sh.h,v 1.77 2023/06/21 22:22:08 millert Exp $ */ /* * Public Domain Bourne/Korn shell @@ -441,7 +441,6 @@ void flushcom(int); char * search(const char *, const char *, int, int *); int search_access(const char *, int, int *); int pr_menu(char *const *); -int pr_list(char *const *); /* expr.c */ int evaluate(const char *, int64_t *, int, bool); int v_evaluate(struct tbl *, const char *, volatile int, bool); diff --git a/share/man/man9/uvm_init.9 b/share/man/man9/uvm_init.9 index 636a16a13..a8493cd90 100644 --- a/share/man/man9/uvm_init.9 +++ b/share/man/man9/uvm_init.9 @@ -1,4 +1,4 @@ -.\" $OpenBSD: uvm_init.9,v 1.6 2023/06/20 16:30:30 cheloha Exp $ +.\" $OpenBSD: uvm_init.9,v 1.7 2023/06/21 21:16:21 cheloha Exp $ .\" $NetBSD: uvm.9,v 1.14 2000/06/29 06:08:44 mrg Exp $ .\" .\" Copyright (c) 1998 Matthew R. Green @@ -28,7 +28,7 @@ .\" XXX this manual sets nS to 1 or 0 in the description, to obtain .\" synopsis-like function prototypes. any better way? .\" -.Dd $Mdocdate: June 20 2023 $ +.Dd $Mdocdate: June 21 2023 $ .Dt UVM_INIT 9 .Os .Sh NAME @@ -168,7 +168,7 @@ argument is ignored. .Ft void .Fn uvm_kernacc "caddr_t addr" "size_t len" "int rw" .Ft void -.Fn uvm_meter "void *" +.Fn uvm_meter .Ft int .Fn uvm_sysctl "int *name" "u_int namelen" "void *oldp" "size_t *oldlenp" "void *newp " "size_t newlen" "struct proc *p" .Ft int @@ -212,7 +212,7 @@ access, in the kernel address space. .Pp The .Fn uvm_meter -function periodically recomputes the load average. +function calculates the load average and wakes up the swapper if necessary. .Pp The .Fn uvm_sysctl diff --git a/sys/dev/pci/if_iwx.c b/sys/dev/pci/if_iwx.c index 8aa8740bc..407a0616a 100644 --- a/sys/dev/pci/if_iwx.c +++ b/sys/dev/pci/if_iwx.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwx.c,v 1.171 2023/05/11 16:55:46 stsp Exp $ */ +/* $OpenBSD: if_iwx.c,v 1.172 2023/06/21 23:24:10 mlarkin Exp $ */ /* * Copyright (c) 2014, 2016 genua gmbh @@ -724,7 +724,7 @@ iwx_init_fw_sec(struct iwx_softc *sc, const struct iwx_fw_sects *fws, return 0; } - + void iwx_fw_version_str(char *buf, size_t bufsize, uint32_t major, uint32_t minor, uint32_t api) @@ -1075,7 +1075,7 @@ iwx_ctxt_info_gen3_init(struct iwx_softc *sc, const struct iwx_fw_sects *fws) IWX_SETBITS(sc, IWX_CSR_CTXT_INFO_BOOT_CTRL, IWX_CSR_AUTO_FUNC_BOOT_ENA); - + /* kick FW self load */ if (!iwx_nic_lock(sc)) { iwx_dma_contig_free(&sc->iml_dma); @@ -1713,7 +1713,7 @@ iwx_read_mem(struct iwx_softc *sc, uint32_t addr, void *buf, int dwords) int iwx_write_mem(struct iwx_softc *sc, uint32_t addr, const void *buf, int dwords) { - int offs; + int offs; const uint32_t *vals = buf; if (iwx_nic_lock(sc)) { @@ -2343,7 +2343,7 @@ iwx_prepare_card_hw(struct iwx_softc *sc) IWX_SETBITS(sc, IWX_CSR_DBG_LINK_PWR_MGMT_REG, IWX_CSR_RESET_LINK_PWR_MGMT_DISABLED); DELAY(1000); - + for (ntries = 0; ntries < 10; ntries++) { /* If HW is not ready, prepare the conditions to check again */ IWX_SETBITS(sc, IWX_CSR_HW_IF_CONFIG_REG, @@ -2709,7 +2709,7 @@ iwx_stop_device(struct iwx_softc *sc) */ iwx_conf_msix_hw(sc, 1); - /* + /* * Upon stop, the APM issues an interrupt if HW RF kill is set. * Clear the interrupt again. */ @@ -4396,7 +4396,7 @@ iwx_run_init_mvm_ucode(struct iwx_softc *sc, int readnvm) if (IEEE80211_ADDR_EQ(etheranyaddr, sc->sc_ic.ic_myaddr)) IEEE80211_ADDR_COPY(sc->sc_ic.ic_myaddr, sc->sc_nvm.hw_addr); - + } return 0; } @@ -4657,7 +4657,7 @@ iwx_rx_frame(struct iwx_softc *sc, struct mbuf *m, int chanidx, struct ieee80211_frame *wh; struct ieee80211_node *ni; - if (chanidx < 0 || chanidx >= nitems(ic->ic_channels)) + if (chanidx < 0 || chanidx >= nitems(ic->ic_channels)) chanidx = ieee80211_chan2ieee(ic, ic->ic_ibss_chan); wh = mtod(m, struct ieee80211_frame *); @@ -5209,7 +5209,7 @@ iwx_rx_mpdu_mq(struct iwx_softc *sc, struct mbuf *m, void *pktdata, /* Padding is inserted after the IV. */ hdrlen += IEEE80211_CCMP_HDRLEN; } - + memmove(m->m_data + 2, m->m_data, hdrlen); m_adj(m, 2); } @@ -5245,7 +5245,7 @@ iwx_rx_mpdu_mq(struct iwx_softc *sc, struct mbuf *m, void *pktdata, struct ieee80211_qosframe *qwh = mtod(m, struct ieee80211_qosframe *); qwh->i_qos[0] &= htole16(~IEEE80211_QOS_AMSDU); - } + } } /* @@ -5890,7 +5890,7 @@ iwx_send_cmd(struct iwx_softc *sc, struct iwx_host_cmd *hcmd) } else if (generation == sc->sc_generation) { free(sc->sc_cmd_resp_pkt[idx], M_DEVBUF, sc->sc_cmd_resp_len[idx]); - sc->sc_cmd_resp_pkt[idx] = NULL; + sc->sc_cmd_resp_pkt[idx] = NULL; } } out: @@ -6946,7 +6946,7 @@ iwx_fill_probe_req(struct iwx_softc *sc, struct iwx_scan_probe_req *preq) frm = ieee80211_add_xrates(frm, rs); remain -= frm - pos; - if (isset(sc->sc_enabled_capa, + if (isset(sc->sc_enabled_capa, IWX_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT)) { if (remain < 3) return ENOBUFS; @@ -7271,7 +7271,7 @@ iwx_ack_rates(struct iwx_softc *sc, struct iwx_node *in, int *cck_rates, } for (i = IWX_FIRST_OFDM_RATE; i <= IWX_LAST_NON_HT_RATE; i++) { if ((iwx_ridx2rate(rs, i) & IEEE80211_RATE_BASIC) == 0) - continue; + continue; ofdm |= (1 << (i - IWX_FIRST_OFDM_RATE)); if (lowest_present_ofdm == -1 || lowest_present_ofdm > i) lowest_present_ofdm = i; @@ -7479,7 +7479,7 @@ iwx_mac_ctxt_cmd(struct iwx_softc *sc, struct iwx_node *in, uint32_t action, IWX_MAC_FILTER_IN_PROBE_REQUEST | IWX_MAC_FILTER_IN_CRC32); } else if (!assoc || !ni->ni_associd || !ni->ni_dtimperiod) { - /* + /* * Allow beacons to pass through as long as we are not * associated or we do not have dtim period information. */ @@ -7580,7 +7580,7 @@ iwx_scan(struct iwx_softc *sc) } int -iwx_bgscan(struct ieee80211com *ic) +iwx_bgscan(struct ieee80211com *ic) { struct iwx_softc *sc = IC2IFP(ic)->if_softc; int err; @@ -7799,7 +7799,7 @@ iwx_rs_vht_rates(struct iwx_softc *sc, struct ieee80211_node *ni, int num_ss) /* Should not happen; Values above cover the possible range. */ panic("invalid VHT Rx MCS value %u", rx_mcs); } - + return ((1 << (max_mcs + 1)) - 1); } @@ -8136,7 +8136,7 @@ iwx_auth(struct iwx_softc *sc) return err; } in->in_phyctxt = &sc->sc_phyctxt[0]; - IEEE80211_ADDR_COPY(in->in_macaddr, in->in_ni.ni_macaddr); + IEEE80211_ADDR_COPY(in->in_macaddr, in->in_ni.ni_macaddr); err = iwx_mac_ctxt_cmd(sc, in, IWX_FW_CTXT_ACTION_ADD, 0); if (err) { @@ -8186,7 +8186,7 @@ iwx_auth(struct iwx_softc *sc) if (in->in_ni.ni_intval) duration = in->in_ni.ni_intval * 9; else - duration = 900; + duration = 900; return iwx_schedule_session_protection(sc, in, duration); rm_mgmt_queue: if (generation == sc->sc_generation) @@ -8344,7 +8344,7 @@ iwx_run(struct iwx_softc *sc) return err; } #ifdef notyet - /* + /* * Disabled for now. Default beacon filter settings * prevent net80211 from getting ERP and HT protection * updates from beacons. @@ -8422,7 +8422,7 @@ iwx_run_stop(struct iwx_softc *sc) printf("%s: could not disable beacon filter (error %d)\n", DEVNAME(sc), err); return err; - } + } /* Mark station as disassociated. */ err = iwx_mac_ctxt_cmd(sc, in, IWX_FW_CTXT_ACTION_MODIFY, 0); @@ -9199,7 +9199,7 @@ iwx_init(struct ifnet *ifp) ieee80211_begin_scan(ifp); - /* + /* * ieee80211_begin_scan() ends up scheduling iwx_newstate_task(). * Wait until the transition to SCAN state has completed. */ @@ -10042,7 +10042,7 @@ iwx_rx_pkt(struct iwx_softc *sc, struct iwx_rx_data *data, struct mbuf_list *ml) iwx_mcc_update(sc, notif); break; } - + case IWX_REPLY_ERROR: { struct iwx_error_resp *resp; SYNC_RESP_STRUCT(resp, pkt); @@ -10149,7 +10149,7 @@ iwx_rx_pkt(struct iwx_softc *sc, struct iwx_rx_data *data, struct mbuf_list *ml) /* * uCode sets bit 0x80 when it originates the notification, * i.e. when the notification is not a direct response to a - * command sent by the driver. + * command sent by the driver. * For example, uCode issues IWX_REPLY_RX when it sends a * received frame to the driver. */ @@ -10459,7 +10459,7 @@ iwx_match(struct device *parent, iwx_match_t match __unused, void *aux) * Part of this complexity comes from iwlwifi supporting both iwm(4) and iwx(4) * devices in the same driver. * - * Our table below contains mostly "new" entries declared in iwlwifi + * Our table below contains mostly "new" entries declared in iwlwifi * with the _IWL_DEV_INFO() macro (with a leading underscore). * Other devices are matched based on PCI vendor/product ID as usual, * unless matching specific PCI subsystem vendor/product IDs is required. @@ -11341,7 +11341,7 @@ fail4: while (--txq_i >= 0) iwx_free_rx_ring(sc, &sc->rxq); if (sc->ict_dma.vaddr != NULL) iwx_dma_contig_free(&sc->ict_dma); - + fail1: iwx_dma_contig_free(&sc->ctxt_info_dma); iwx_dma_contig_free(&sc->prph_scratch_dma); iwx_dma_contig_free(&sc->prph_info_dma); diff --git a/sys/kern/sched_bsd.c b/sys/kern/sched_bsd.c index 3a82cca9b..753edaed6 100644 --- a/sys/kern/sched_bsd.c +++ b/sys/kern/sched_bsd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sched_bsd.c,v 1.75 2023/06/20 16:30:30 cheloha Exp $ */ +/* $OpenBSD: sched_bsd.c,v 1.76 2023/06/21 21:16:21 cheloha Exp $ */ /* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */ /*- @@ -234,6 +234,7 @@ schedcpu(void *arg) } SCHED_UNLOCK(s); } + uvm_meter(); wakeup(&lbolt); timeout_add_sec(to, 1); } @@ -668,7 +669,6 @@ scheduler_start(void) rrticks_init = hz / 10; schedcpu(&schedcpu_to); - uvm_meter(NULL); #ifndef SMALL_KERNEL if (perfpolicy == PERFPOL_AUTO) diff --git a/sys/uvm/uvm_extern.h b/sys/uvm/uvm_extern.h index 85124bd81..a6fc5f041 100644 --- a/sys/uvm/uvm_extern.h +++ b/sys/uvm/uvm_extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_extern.h,v 1.169 2023/06/20 16:30:30 cheloha Exp $ */ +/* $OpenBSD: uvm_extern.h,v 1.170 2023/06/21 21:16:21 cheloha Exp $ */ /* $NetBSD: uvm_extern.h,v 1.57 2001/03/09 01:02:12 chs Exp $ */ /* @@ -414,7 +414,7 @@ void uvmspace_free(struct vmspace *); struct vmspace *uvmspace_share(struct process *); int uvm_share(vm_map_t, vaddr_t, vm_prot_t, vm_map_t, vaddr_t, vsize_t); -void uvm_meter(void *); +void uvm_meter(void); int uvm_sysctl(int *, u_int, void *, size_t *, void *, size_t, struct proc *); struct vm_page *uvm_pagealloc(struct uvm_object *, diff --git a/sys/uvm/uvm_meter.c b/sys/uvm/uvm_meter.c index 8fc7c1030..cd0efeeca 100644 --- a/sys/uvm/uvm_meter.c +++ b/sys/uvm/uvm_meter.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uvm_meter.c,v 1.43 2023/06/20 16:30:30 cheloha Exp $ */ +/* $OpenBSD: uvm_meter.c,v 1.44 2023/06/21 21:16:21 cheloha Exp $ */ /* $NetBSD: uvm_meter.c,v 1.21 2001/07/14 06:36:03 matt Exp $ */ /* @@ -65,9 +65,6 @@ int maxslp = MAXSLP; /* patchable ... */ struct loadavg averunnable; -#define UVM_METER_INTVL 5 -struct timeout uvm_meter_to = TIMEOUT_INITIALIZER(uvm_meter, NULL); - /* * constants for averages over 1, 5, and 15 minutes when sampling at * 5 second intervals. @@ -85,13 +82,15 @@ void uvm_total(struct vmtotal *); void uvmexp_read(struct uvmexp *); /* - * uvm_meter: recompute load averages + * uvm_meter: calculate load average and wake up the swapper (if needed) */ void -uvm_meter(void *unused) +uvm_meter(void) { - timeout_add_sec(&uvm_meter_to, UVM_METER_INTVL); - uvm_loadav(&averunnable); + if ((gettime() % 5) == 0) + uvm_loadav(&averunnable); + if (proc0.p_slptime > (maxslp / 2)) + wakeup(&proc0); } /* diff --git a/usr.sbin/smtpd/lka_filter.c b/usr.sbin/smtpd/lka_filter.c index 7eabb178f..9b18173c7 100644 --- a/usr.sbin/smtpd/lka_filter.c +++ b/usr.sbin/smtpd/lka_filter.c @@ -1,4 +1,4 @@ -/* $OpenBSD: lka_filter.c,v 1.70 2023/05/15 12:03:04 op Exp $ */ +/* $OpenBSD: lka_filter.c,v 1.72 2023/06/21 17:59:24 op Exp $ */ /* * Copyright (c) 2018 Gilles Chehade @@ -593,40 +593,29 @@ lka_filter_process_response(const char *name, const char *line) { uint64_t reqid; uint64_t token; - char buffer[LINE_MAX]; char *ep = NULL; - char *kind = NULL; - char *qid = NULL; - /*char *phase = NULL;*/ - char *response = NULL; - char *parameter = NULL; + const char *kind = NULL; + const char *qid = NULL; + const char *response = NULL; + const char *parameter = NULL; struct filter_session *fs; - (void)strlcpy(buffer, line, sizeof buffer); - if ((ep = strchr(buffer, '|')) == NULL) + kind = line; + + if ((ep = strchr(kind, '|')) == NULL) fatalx("Missing token: %s", line); - ep[0] = '\0'; - - kind = buffer; - qid = ep+1; - if ((ep = strchr(qid, '|')) == NULL) - fatalx("Missing reqid: %s", line); - ep[0] = '\0'; + errno = 0; reqid = strtoull(qid, &ep, 16); - if (qid[0] == '\0' || *ep != '\0') + if (qid[0] == '\0' || *ep != '|') fatalx("Invalid reqid: %s", line); if (errno == ERANGE && reqid == ULLONG_MAX) fatal("Invalid reqid: %s", line); - qid = ep+1; - if ((ep = strchr(qid, '|')) == NULL) - fatal("Missing directive: %s", line); - ep[0] = '\0'; - + qid = ep + 1; token = strtoull(qid, &ep, 16); - if (qid[0] == '\0' || *ep != '\0') + if (qid[0] == '\0' || *ep != '|') fatalx("Invalid token: %s", line); if (errno == ERANGE && token == ULLONG_MAX) fatal("Invalid token: %s", line); @@ -637,7 +626,7 @@ lka_filter_process_response(const char *name, const char *line) if ((fs = tree_get(&sessions, reqid)) == NULL) return; - if (strcmp(kind, "filter-dataline") == 0) { + if (strncmp(kind, "filter-dataline|", 16) == 0) { if (fs->phase != FILTER_DATA_LINE) fatalx("filter-dataline out of dataline phase"); filter_data_next(token, reqid, response); @@ -646,19 +635,13 @@ lka_filter_process_response(const char *name, const char *line) if (fs->phase == FILTER_DATA_LINE) fatalx("filter-result in dataline phase"); - if ((ep = strchr(response, '|'))) { + if ((ep = strchr(response, '|')) != NULL) parameter = ep + 1; - ep[0] = '\0'; - } if (strcmp(response, "proceed") == 0) { - if (parameter != NULL) - fatalx("Unexpected parameter after proceed: %s", line); filter_protocol_next(token, reqid, 0); return; } else if (strcmp(response, "junk") == 0) { - if (parameter != NULL) - fatalx("Unexpected parameter after junk: %s", line); if (fs->phase == FILTER_COMMIT) fatalx("filter-reponse junk after DATA"); filter_result_junk(reqid); @@ -667,11 +650,11 @@ lka_filter_process_response(const char *name, const char *line) if (parameter == NULL) fatalx("Missing parameter: %s", line); - if (strcmp(response, "rewrite") == 0) + if (strncmp(response, "rewrite|", 8) == 0) filter_result_rewrite(reqid, parameter); - else if (strcmp(response, "reject") == 0) + else if (strncmp(response, "reject|", 7) == 0) filter_result_reject(reqid, parameter); - else if (strcmp(response, "disconnect") == 0) + else if (strncmp(response, "disconnect|", 11) == 0) filter_result_disconnect(reqid, parameter); else fatalx("Invalid directive: %s", line);