+ if (ch == '?') {
+ u.len = 0;
+ if (!stralloc_ready(&u, dlen - 1)) return (-1);
+ if (read(cdb, u.s, dlen - 1) != dlen - 1) { errno = EIO; return (-1); }
+ u.len = dlen - 1;
+ serv.len = 0;
+ if (!stralloc_cats(&serv, "addrcheck:") ||
+ !stralloc_cats(&serv, k + 1) ||
+ !stralloc_0(&serv) ||
+ !stralloc_0(&u))
+ return (-1);
+ D( fprintf(stderr, "asking user:\n\
+ user = %s; service = %s\n tail = %s; sender = %s\n\
+ address = %s; key = %s\n",
+ u.s, serv.s, tail, sender, key, k + 1); )
+
+ if (pipe(p) || (kid = fork()) == -1)
+ return (-1);
+ if (!kid) {
+ close(0); open("/dev/null", O_RDONLY);
+ dup2(p[1], 1);
+#ifndef DEBUG
+ close(2); open("/dev/null", O_WRONLY);
+#endif
+ close(p[0]); close(p[1]);
+ execl("/usr/bin/userv", "/usr/bin/userv",
+ "-f", "stdin=/dev/null", "-t", "10",
+ u.s, serv.s,
+ tail, sender, key, k + 1,
+ (char *)0);
+ _exit(127);
+ }
+ close(p[1]);
+ if (wait_pid(&wstat, kid) < 0) { close(p[0]); return (-1); }
+ D( fprintf(stderr, "userv exited with status %d\n", wstat); )
+ if (wstat) { close (p[0]); errno = EAGAIN; return (-1); }
+ n = read(p[0], &ch, 1);
+ if (n != 1) { close (p[0]); errno = EAGAIN; return (-1); }
+ close(p[0]);
+ D( fprintf(stderr, "userv answer was `%c'\n", ch); )
+ } else if (dlen != 1) {
+ errno = EIO;
+ return (-1);
+ }