• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src/router/busybox/networking/

Lines Matching refs:sep

213 #define is_rpc_service(sep)       ((sep)->se_rpcver_lo != 0)
215 #define is_rpc_service(sep) 0
395 static void register_rpc(servtab_t *sep)
402 if (getsockname(sep->se_fd, (struct sockaddr *) &ir_sin, &size) < 0) {
407 for (n = sep->se_rpcver_lo; n <= sep->se_rpcver_hi; n++) {
408 pmap_unset(sep->se_rpcprog, n);
409 if (!pmap_set(sep->se_rpcprog, n, sep->se_proto_no, ntohs(ir_sin.sin_port)))
411 sep->se_service, sep->se_proto,
412 sep->se_rpcprog, n, sep->se_proto_no, ntohs(ir_sin.sin_port));
416 static void unregister_rpc(servtab_t *sep)
420 for (n = sep->se_rpcver_lo; n <= sep->se_rpcver_hi; n++) {
421 if (!pmap_unset(sep->se_rpcprog, n))
422 bb_perror_msg("pmap_unset(%u,%u)", sep->se_rpcprog, n);
487 static void prepare_socket_fd(servtab_t *sep)
491 fd = socket(sep->se_family, sep->se_socktype, 0);
499 if (is_rpc_service(sep)) {
504 set_nport(sep->se_lsa, 0);
508 if (real_uid == 0 && sep->se_family == AF_INET
509 && (pwd = getpwnam(sep->se_user)) != NULL
512 r = bindresvport(fd, &sep->se_lsa->u.sin);
514 r = bind(fd, &sep->se_lsa->u.sa, sep->se_lsa->len);
519 getsockname(fd, &sep->se_lsa->u.sa, &sep->se_lsa->len);
525 if (sep->se_family == AF_UNIX) {
527 sun = (struct sockaddr_un*)&(sep->se_lsa->u.sa);
530 r = bind(fd, &sep->se_lsa->u.sa, sep->se_lsa->len);
534 sep->se_service, sep->se_proto);
539 if (sep->se_socktype == SOCK_STREAM)
543 sep->se_fd = fd;
586 static servtab_t *dup_servtab(servtab_t *sep)
592 *newtab = *sep; /* struct copy */
615 servtab_t *sep;
618 sep = new_servtab();
622 free(sep);
632 sep->se_local_hostname = xstrdup(arg);
638 default_local_hostname = sep->se_local_hostname;
642 sep->se_local_hostname = xstrdup(default_local_hostname);
645 sep->se_service = xstrdup(arg);
652 free_servtab_strings(sep);
653 /* Just "goto more" can make sep to carry over e.g.
656 free(sep);
666 sep->se_socktype = SOCK_xxx[1 + index_in_strings(
673 sep->se_proto = arg = xstrdup(token[2]);
675 sep->se_family = AF_UNIX;
678 sep->se_family = AF_INET;
683 sep->se_family = AF_INET6;
685 bb_error_msg("%s: no support for IPv6", sep->se_proto);
693 p = strchr(sep->se_service, '/');
695 bb_error_msg("no rpc version: '%s'", sep->se_service);
705 sep->se_rpcver_lo = sep->se_rpcver_hi = n;
709 if (n > INT_MAX || (int)n < sep->se_rpcver_lo)
711 sep->se_rpcver_hi = n;
722 sep->se_proto_no = IPPROTO_TCP; /* = 6 */
724 sep->se_proto_no = IPPROTO_UDP; /* = 17 */
727 if (!sep->se_proto_no) /* not tcp/udp?? */
733 sep->se_max = max_concurrency;
737 sep->se_max = bb_strtou(p, NULL, 10);
741 sep->se_wait = (arg[0] != 'n' || arg[1] != 'o');
742 if (!sep->se_wait) /* "no" seen */
748 sep->se_user = xstrdup(token[4]);
749 arg = strchr(sep->se_user, '.');
751 arg = strchr(sep->se_user, ':');
754 sep->se_group = xstrdup(arg);
758 sep->se_program = xstrdup(token[5]);
760 if (strcmp(sep->se_program, "internal") == 0
761 && strlen(sep->se_service) <= 7
762 && (sep->se_socktype == SOCK_STREAM
763 || sep->se_socktype == SOCK_DGRAM)
767 if (strncmp(builtins[i].bi_service7, sep->se_service, 7) == 0)
769 bb_error_msg("unknown internal service %s", sep->se_service);
772 sep->se_builtin = &builtins[i];
774 if (sep->se_wait != (sep->se_socktype == SOCK_DGRAM))
780 sep->se_argv[argc++] = xstrdup(arg);
783 if (sep->se_socktype == SOCK_STREAM) {
784 if (sep->se_proto_no == IPPROTO_UDP)
787 if (sep->se_socktype == SOCK_DGRAM) {
788 if (sep->se_proto_no == IPPROTO_TCP)
794 // sep->se_local_hostname, sep->se_service, sep->se_proto, sep->se_wait, sep->se_proto_no,
795 // sep->se_max, sep->se_count, sep->se_time, sep->se_user, sep->se_group, sep->se_program);
799 while ((hostdelim = strrchr(sep->se_local_hostname, ',')) != NULL) {
800 nsep = dup_servtab(sep);
805 nsep->se_next = sep->se_next;
806 sep->se_next = nsep;
813 return sep;
818 servtab_t *sep;
821 sep = new_servtab();
822 *sep = *cp; /* struct copy */
823 sep->se_fd = -1;
825 sep->se_rpcprog = -1;
828 sep->se_next = serv_list;
829 serv_list = sep;
831 return sep;
847 servtab_t *sep, *cp, **sepp;
856 for (sep = serv_list; sep; sep = sep->se_next)
857 sep->se_checked = 0;
867 for (sep = serv_list; sep; sep = sep->se_next)
868 if (same_serv_addr_proto(sep, cp))
871 sep = insert_in_servlist(cp);
879 if (is_rpc_service(sep))
880 unregister_rpc(sep);
881 sep->se_rpcver_lo = cp->se_rpcver_lo;
882 sep->se_rpcver_hi = cp->se_rpcver_hi;
890 add_fd_to_set(sep->se_fd);
892 sep->se_wait = cp->se_wait;
893 sep->se_max = cp->se_max;
896 SWAP(char*, sep->se_user, cp->se_user);
897 SWAP(char*, sep->se_group, cp->se_group);
898 SWAP(char*, sep->se_program, cp->se_program);
900 SWAP(char*, sep->se_argv[i], cp->se_argv[i]);
908 sep->se_checked = 1;
911 switch (sep->se_family) {
916 safe_strncpy(sun->sun_path, sep->se_service, sizeof(sun->sun_path));
920 n = bb_strtou(sep->se_service, NULL, 10);
922 if (is_rpc_service(sep)) {
923 sep->se_rpcprog = n;
925 struct rpcent *rp = getrpcbyname(sep->se_service);
927 bb_error_msg("%s: unknown rpc service", sep->se_service);
930 sep->se_rpcprog = rp->r_number;
932 if (sep->se_fd == -1)
933 prepare_socket_fd(sep);
934 if (sep->se_fd != -1)
935 register_rpc(sep);
945 safe_strncpy(protoname, sep->se_proto, 4);
946 sp = getservbyname(sep->se_service, protoname);
949 sep->se_service, sep->se_proto);
954 if (LONE_CHAR(sep->se_local_hostname, '*')) {
955 lsa = xzalloc_lsa(sep->se_family);
958 lsa = host_and_af2sockaddr(sep->se_local_hostname,
959 ntohs(port), sep->se_family);
962 sep->se_service, sep->se_proto,
963 sep->se_local_hostname);
968 } /* end of "switch (sep->se_family)" */
971 if (sep->se_lsa == NULL
972 || lsa->len != sep->se_lsa->len
973 || memcmp(&lsa->u.sa, &sep->se_lsa->u.sa, lsa->len) != 0
975 remove_fd_from_set(sep->se_fd);
976 maybe_close(sep->se_fd);
977 free(sep->se_lsa);
978 sep->se_lsa = lsa;
979 sep->se_fd = -1;
983 if (sep->se_fd == -1)
984 prepare_socket_fd(sep);
986 sep = cp->se_next;
988 cp = sep;
996 while ((sep = *sepp)) {
997 if (sep->se_checked) {
998 sepp = &sep->se_next;
1001 *sepp = sep->se_next;
1002 remove_fd_from_set(sep->se_fd);
1003 maybe_close(sep->se_fd);
1005 if (is_rpc_service(sep))
1006 unregister_rpc(sep);
1008 if (sep->se_family == AF_UNIX)
1009 unlink(sep->se_service);
1010 free_servtab_strings(sep);
1011 free(sep);
1022 servtab_t *sep;
1029 for (sep = serv_list; sep; sep = sep->se_next) {
1030 if (sep->se_wait != pid)
1035 sep->se_program, WEXITSTATUS(status));
1038 sep->se_program, WTERMSIG(status));
1039 sep->se_wait = 1;
1040 add_fd_to_set(sep->se_fd);
1050 servtab_t *sep;
1053 for (sep = serv_list; sep; sep = sep->se_next) {
1054 if (sep->se_fd == -1) {
1055 prepare_socket_fd(sep);
1057 if (sep->se_fd != -1 && is_rpc_service(sep))
1058 register_rpc(sep);
1067 servtab_t *sep;
1069 /* XXX signal race walking sep list */
1070 for (sep = serv_list; sep; sep = sep->se_next) {
1071 if (sep->se_fd == -1)
1074 switch (sep->se_family) {
1076 unlink(sep->se_service);
1080 if (sep->se_wait == 1 && is_rpc_service(sep))
1081 unregister_rpc(sep); /* XXX signal race */
1086 close(sep->se_fd);
1096 servtab_t *sep, *sep2;
1186 for (sep = serv_list; ready_fd_cnt && sep; sep = sep->se_next) {
1187 if (sep->se_fd == -1 || !FD_ISSET(sep->se_fd, &readable))
1191 ctrl = sep->se_fd;
1194 if (!sep->se_wait) {
1195 if (sep->se_socktype == SOCK_STREAM) {
1196 ctrl = accepted_fd = accept(sep->se_fd, NULL, NULL);
1199 bb_perror_msg("accept (for %s)", sep->se_service);
1204 if (sep->se_socktype == SOCK_DGRAM
1205 && sep->se_family != AF_UNIX
1216 new_udp_fd = socket(sep->se_family, SOCK_DGRAM, 0);
1219 recv(sep->se_fd, line, LINE_SIZE, MSG_DONTWAIT);
1226 if (bind(new_udp_fd, &sep->se_lsa->u.sa, sep->se_lsa->len) < 0) {
1237 if (sep->se_builtin == NULL
1238 || (sep->se_socktype == SOCK_STREAM
1239 && sep->se_builtin->bi_fork))
1242 if (sep->se_max != 0) {
1243 if (++sep->se_count == 1)
1244 sep->se_time = monotonic_sec();
1245 else if (sep->se_count >= sep->se_max) {
1248 if (now - sep->se_time <= CNT_INTERVAL) {
1250 sep->se_service, sep->se_proto);
1251 remove_fd_from_set(sep->se_fd);
1252 close(sep->se_fd);
1253 sep->se_fd = -1;
1254 sep->se_count = 0;
1260 sep->se_count = 0;
1267 if (BB_MMU && sep->se_builtin)
1286 if (sep->se_wait) {
1289 sep->se_wait = pid;
1290 remove_fd_from_set(sep->se_fd);
1295 xmove_fd(new_udp_fd, sep->se_fd);
1304 if (sep->se_builtin) {
1306 close(sep->se_fd); /* listening socket */
1310 if (sep->se_socktype == SOCK_STREAM)
1311 sep->se_builtin->bi_stream_fn(ctrl, sep);
1313 sep->se_builtin->bi_dgram_fn(ctrl, sep);
1324 len_and_sockaddr *lsa = xzalloc_lsa(sep->se_family);
1337 pwd = getpwnam(sep->se_user);
1339 bb_error_msg("%s: no such %s", sep->se_user, "user");
1342 if (sep->se_group && (grp = getgrnam(sep->se_group)) == NULL) {
1343 bb_error_msg("%s: no such %s", sep->se_group, "group");
1352 if (sep->se_group)
1356 } else if (sep->se_group) {
1373 if (!sep->se_wait) /* only for usual "tcp nowait" */
1382 BB_EXECVP(sep->se_program, sep->se_argv);
1383 bb_perror_msg("can't execute '%s'", sep->se_program);
1386 if (sep->se_socktype != SOCK_STREAM)
1389 } /* for (sep = servtab...) */
1403 static void FAST_FUNC echo_stream(int s, servtab_t *sep UNUSED_PARAM)
1424 static void FAST_FUNC echo_dg(int s, servtab_t *sep)
1429 len_and_sockaddr *lsa = alloca(LSA_LEN_SIZE + sep->se_lsa->len);
1431 lsa->len = sep->se_lsa->len;
1444 static void FAST_FUNC discard_stream(int s, servtab_t *sep UNUSED_PARAM)
1463 static void FAST_FUNC discard_dg(int s, servtab_t *sep UNUSED_PARAM)
1483 static void FAST_FUNC chargen_stream(int s, servtab_t *sep UNUSED_PARAM)
1511 static void FAST_FUNC chargen_dg(int s, servtab_t *sep)
1515 len_and_sockaddr *lsa = alloca(LSA_LEN_SIZE + sep->se_lsa->len);
1519 lsa->len = sep->se_lsa->len;
1560 static void FAST_FUNC machtime_stream(int s, servtab_t *sep UNUSED_PARAM)
1567 static void FAST_FUNC machtime_dg(int s, servtab_t *sep)
1570 len_and_sockaddr *lsa = alloca(LSA_LEN_SIZE + sep->se_lsa->len);
1572 lsa->len = sep->se_lsa->len;
1585 static void FAST_FUNC daytime_stream(int s, servtab_t *sep UNUSED_PARAM)
1592 static void FAST_FUNC daytime_dg(int s, servtab_t *sep)
1595 len_and_sockaddr *lsa = alloca(LSA_LEN_SIZE + sep->se_lsa->len);
1597 lsa->len = sep->se_lsa->len;