- {
- pwd = getpwnam(sep->se_user);
- if (pwd == NULL) {
- bb_error_msg("getpwnam: %s: no such user", sep->se_user);
- goto do_exit1;
- }
- if (setsid() < 0)
- bb_perror_msg("%s: setsid", sep->se_service);
- if (sep->se_group && (grp = getgrnam(sep->se_group)) == NULL) {
- bb_error_msg("getgrnam: %s: no such group", sep->se_group);
- goto do_exit1;
- }
- if (uid != 0) {
- /* a user running private inetd */
- if (uid != pwd->pw_uid)
- _exit(1);
- } else if (pwd->pw_uid) {
- if (sep->se_group)
- pwd->pw_gid = grp->gr_gid;
- xsetgid((gid_t) pwd->pw_gid);
- initgroups(pwd->pw_name, pwd->pw_gid);
- xsetuid((uid_t) pwd->pw_uid);
- } else if (sep->se_group) {
- xsetgid(grp->gr_gid);
- setgroups(1, &grp->gr_gid);
- }
- dup2(ctrl, 0);
- if (ctrl) close(ctrl);
- dup2(0, 1);
- dup2(0, 2);
- if (rlim_ofile.rlim_cur != rlim_ofile_cur)
- if (setrlimit(RLIMIT_NOFILE, &rlim_ofile) < 0)
- bb_perror_msg("setrlimit");
- closelog();
- for (tmpint = rlim_ofile_cur - 1; --tmpint > 2;)
- (void) close(tmpint);
- sigaction(SIGPIPE, &sapipe, NULL);
- execv(sep->se_server, sep->se_argv);
- bb_perror_msg("execv %s", sep->se_server);
- do_exit1:
- if (sep->se_socktype != SOCK_STREAM)
- recv(0, buf, sizeof(buf), 0);
- _exit(1);
- }
+ /* child */
+ setsid();
+ /* "nowait" udp */
+ if (new_udp_fd >= 0) {
+ len_and_sockaddr *lsa = xzalloc_lsa(sep->se_family);
+ /* peek at the packet and remember peer addr */
+ int r = recvfrom(ctrl, NULL, 0, MSG_PEEK|MSG_DONTWAIT,
+ &lsa->u.sa, &lsa->len);
+ if (r < 0)
+ goto do_exit1;
+ /* make this socket "connected" to peer addr:
+ * only packets from this peer will be recv'ed,
+ * and bare write()/send() will work on it */
+ connect(ctrl, &lsa->u.sa, lsa->len);
+ free(lsa);
+ }
+ /* prepare env and exec program */
+ pwd = getpwnam(sep->se_user);
+ if (pwd == NULL) {
+ bb_error_msg("%s: no such user", sep->se_user);
+ goto do_exit1;