diff options
| author | Robert Pluim | 2019-08-07 13:55:38 +0200 |
|---|---|---|
| committer | Robert Pluim | 2019-08-07 13:55:38 +0200 |
| commit | 76662cc47d0dd1482442914d0b1f5011f0c86c5e (patch) | |
| tree | 01e3f26615d579cc8889b7a4a296cc98c8129af7 /src/process.c | |
| parent | 742c2344bf076040f9c57f37b2220410f9e27304 (diff) | |
| download | emacs-76662cc47d0dd1482442914d0b1f5011f0c86c5e.tar.gz emacs-76662cc47d0dd1482442914d0b1f5011f0c86c5e.zip | |
fixup! Implement hostname->ip lookup function
Diffstat (limited to 'src/process.c')
| -rw-r--r-- | src/process.c | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/src/process.c b/src/process.c index 42909c4ba4f..7b1723b9f56 100644 --- a/src/process.c +++ b/src/process.c | |||
| @@ -2488,7 +2488,7 @@ usage: (make-pipe-process &rest ARGS) */) | |||
| 2488 | The address family of sa is not included in the result. */ | 2488 | The address family of sa is not included in the result. */ |
| 2489 | 2489 | ||
| 2490 | Lisp_Object | 2490 | Lisp_Object |
| 2491 | conv_sockaddr_to_lisp (struct sockaddr *sa, ptrdiff_t len, bool include_port) | 2491 | conv_sockaddr_to_lisp (struct sockaddr *sa, ptrdiff_t len) |
| 2492 | { | 2492 | { |
| 2493 | Lisp_Object address; | 2493 | Lisp_Object address; |
| 2494 | ptrdiff_t i; | 2494 | ptrdiff_t i; |
| @@ -2507,12 +2507,9 @@ conv_sockaddr_to_lisp (struct sockaddr *sa, ptrdiff_t len, bool include_port) | |||
| 2507 | { | 2507 | { |
| 2508 | DECLARE_POINTER_ALIAS (sin, struct sockaddr_in, sa); | 2508 | DECLARE_POINTER_ALIAS (sin, struct sockaddr_in, sa); |
| 2509 | len = sizeof (sin->sin_addr) + 1; | 2509 | len = sizeof (sin->sin_addr) + 1; |
| 2510 | if (!include_port) | ||
| 2511 | len--; | ||
| 2512 | address = Fmake_vector (make_number (len), Qnil); | 2510 | address = Fmake_vector (make_number (len), Qnil); |
| 2513 | p = XVECTOR (address); | 2511 | p = XVECTOR (address); |
| 2514 | if (include_port) | 2512 | p->contents[--len] = make_number (ntohs (sin->sin_port)); |
| 2515 | p->contents[--len] = make_number (ntohs (sin->sin_port)); | ||
| 2516 | cp = (unsigned char *) &sin->sin_addr; | 2513 | cp = (unsigned char *) &sin->sin_addr; |
| 2517 | break; | 2514 | break; |
| 2518 | } | 2515 | } |
| @@ -2522,12 +2519,9 @@ conv_sockaddr_to_lisp (struct sockaddr *sa, ptrdiff_t len, bool include_port) | |||
| 2522 | DECLARE_POINTER_ALIAS (sin6, struct sockaddr_in6, sa); | 2519 | DECLARE_POINTER_ALIAS (sin6, struct sockaddr_in6, sa); |
| 2523 | DECLARE_POINTER_ALIAS (ip6, uint16_t, &sin6->sin6_addr); | 2520 | DECLARE_POINTER_ALIAS (ip6, uint16_t, &sin6->sin6_addr); |
| 2524 | len = sizeof (sin6->sin6_addr) / 2 + 1; | 2521 | len = sizeof (sin6->sin6_addr) / 2 + 1; |
| 2525 | if (!include_port) | ||
| 2526 | len--; | ||
| 2527 | address = Fmake_vector (make_number (len), Qnil); | 2522 | address = Fmake_vector (make_number (len), Qnil); |
| 2528 | p = XVECTOR (address); | 2523 | p = XVECTOR (address); |
| 2529 | if (include_port) | 2524 | p->contents[--len] = make_number (ntohs (sin6->sin6_port)); |
| 2530 | p->contents[--len] = make_number (ntohs (sin6->sin6_port)); | ||
| 2531 | for (i = 0; i < len; i++) | 2525 | for (i = 0; i < len; i++) |
| 2532 | p->contents[i] = make_number (ntohs (ip6[i])); | 2526 | p->contents[i] = make_number (ntohs (ip6[i])); |
| 2533 | return address; | 2527 | return address; |
| @@ -2578,7 +2572,7 @@ conv_addrinfo_to_lisp (struct addrinfo *res) | |||
| 2578 | { | 2572 | { |
| 2579 | Lisp_Object protocol = make_number (res->ai_protocol); | 2573 | Lisp_Object protocol = make_number (res->ai_protocol); |
| 2580 | eassert (XINT (protocol) == res->ai_protocol); | 2574 | eassert (XINT (protocol) == res->ai_protocol); |
| 2581 | return Fcons (protocol, conv_sockaddr_to_lisp (res->ai_addr, res->ai_addrlen, true)); | 2575 | return Fcons (protocol, conv_sockaddr_to_lisp (res->ai_addr, res->ai_addrlen)); |
| 2582 | } | 2576 | } |
| 2583 | 2577 | ||
| 2584 | 2578 | ||
| @@ -2720,8 +2714,7 @@ set up yet, this function will block until socket setup has completed. */) | |||
| 2720 | 2714 | ||
| 2721 | channel = XPROCESS (process)->infd; | 2715 | channel = XPROCESS (process)->infd; |
| 2722 | return conv_sockaddr_to_lisp (datagram_address[channel].sa, | 2716 | return conv_sockaddr_to_lisp (datagram_address[channel].sa, |
| 2723 | datagram_address[channel].len, | 2717 | datagram_address[channel].len); |
| 2724 | true); | ||
| 2725 | } | 2718 | } |
| 2726 | 2719 | ||
| 2727 | DEFUN ("set-process-datagram-address", Fset_process_datagram_address, Sset_process_datagram_address, | 2720 | DEFUN ("set-process-datagram-address", Fset_process_datagram_address, Sset_process_datagram_address, |
| @@ -3582,7 +3575,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, | |||
| 3582 | #endif | 3575 | #endif |
| 3583 | 3576 | ||
| 3584 | contact = Fplist_put (contact, p->is_server? QClocal: QCremote, | 3577 | contact = Fplist_put (contact, p->is_server? QClocal: QCremote, |
| 3585 | conv_sockaddr_to_lisp (sa, addrlen, true)); | 3578 | conv_sockaddr_to_lisp (sa, addrlen)); |
| 3586 | #ifdef HAVE_GETSOCKNAME | 3579 | #ifdef HAVE_GETSOCKNAME |
| 3587 | if (!p->is_server) | 3580 | if (!p->is_server) |
| 3588 | { | 3581 | { |
| @@ -3591,7 +3584,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, | |||
| 3591 | DECLARE_POINTER_ALIAS (psa1, struct sockaddr, &sa1); | 3584 | DECLARE_POINTER_ALIAS (psa1, struct sockaddr, &sa1); |
| 3592 | if (getsockname (s, psa1, &len1) == 0) | 3585 | if (getsockname (s, psa1, &len1) == 0) |
| 3593 | contact = Fplist_put (contact, QClocal, | 3586 | contact = Fplist_put (contact, QClocal, |
| 3594 | conv_sockaddr_to_lisp (psa1, len1, true)); | 3587 | conv_sockaddr_to_lisp (psa1, len1)); |
| 3595 | } | 3588 | } |
| 3596 | #endif | 3589 | #endif |
| 3597 | } | 3590 | } |
| @@ -4255,8 +4248,7 @@ network_interface_list (void) | |||
| 4255 | namebuf[sizeof (ifq->ifr_name)] = 0; | 4248 | namebuf[sizeof (ifq->ifr_name)] = 0; |
| 4256 | res = Fcons (Fcons (build_string (namebuf), | 4249 | res = Fcons (Fcons (build_string (namebuf), |
| 4257 | conv_sockaddr_to_lisp (&ifq->ifr_addr, | 4250 | conv_sockaddr_to_lisp (&ifq->ifr_addr, |
| 4258 | sizeof (struct sockaddr), | 4251 | sizeof (struct sockaddr))), |
| 4259 | true)), | ||
| 4260 | res); | 4252 | res); |
| 4261 | } | 4253 | } |
| 4262 | 4254 | ||
| @@ -4459,9 +4451,9 @@ network_interface_info (Lisp_Object ifname) | |||
| 4459 | { | 4451 | { |
| 4460 | any = 1; | 4452 | any = 1; |
| 4461 | #ifdef HAVE_STRUCT_IFREQ_IFR_NETMASK | 4453 | #ifdef HAVE_STRUCT_IFREQ_IFR_NETMASK |
| 4462 | elt = conv_sockaddr_to_lisp (&rq.ifr_netmask, sizeof (rq.ifr_netmask), true); | 4454 | elt = conv_sockaddr_to_lisp (&rq.ifr_netmask, sizeof (rq.ifr_netmask)); |
| 4463 | #else | 4455 | #else |
| 4464 | elt = conv_sockaddr_to_lisp (&rq.ifr_addr, sizeof (rq.ifr_addr), true); | 4456 | elt = conv_sockaddr_to_lisp (&rq.ifr_addr, sizeof (rq.ifr_addr)); |
| 4465 | #endif | 4457 | #endif |
| 4466 | } | 4458 | } |
| 4467 | #endif | 4459 | #endif |
| @@ -4472,7 +4464,7 @@ network_interface_info (Lisp_Object ifname) | |||
| 4472 | if (ioctl (s, SIOCGIFBRDADDR, &rq) == 0) | 4464 | if (ioctl (s, SIOCGIFBRDADDR, &rq) == 0) |
| 4473 | { | 4465 | { |
| 4474 | any = 1; | 4466 | any = 1; |
| 4475 | elt = conv_sockaddr_to_lisp (&rq.ifr_broadaddr, sizeof (rq.ifr_broadaddr), true); | 4467 | elt = conv_sockaddr_to_lisp (&rq.ifr_broadaddr, sizeof (rq.ifr_broadaddr)); |
| 4476 | } | 4468 | } |
| 4477 | #endif | 4469 | #endif |
| 4478 | res = Fcons (elt, res); | 4470 | res = Fcons (elt, res); |
| @@ -4482,7 +4474,7 @@ network_interface_info (Lisp_Object ifname) | |||
| 4482 | if (ioctl (s, SIOCGIFADDR, &rq) == 0) | 4474 | if (ioctl (s, SIOCGIFADDR, &rq) == 0) |
| 4483 | { | 4475 | { |
| 4484 | any = 1; | 4476 | any = 1; |
| 4485 | elt = conv_sockaddr_to_lisp (&rq.ifr_addr, sizeof (rq.ifr_addr), true); | 4477 | elt = conv_sockaddr_to_lisp (&rq.ifr_addr, sizeof (rq.ifr_addr)); |
| 4486 | } | 4478 | } |
| 4487 | #endif | 4479 | #endif |
| 4488 | res = Fcons (elt, res); | 4480 | res = Fcons (elt, res); |
| @@ -4602,7 +4594,7 @@ nil if none were found. Each address is a vector of integers. */) | |||
| 4602 | for (lres = res; lres; lres = lres->ai_next) | 4594 | for (lres = res; lres; lres = lres->ai_next) |
| 4603 | { | 4595 | { |
| 4604 | addresses = Fcons (conv_sockaddr_to_lisp | 4596 | addresses = Fcons (conv_sockaddr_to_lisp |
| 4605 | (lres->ai_addr, lres->ai_addrlen, false), | 4597 | (lres->ai_addr, lres->ai_addrlen), |
| 4606 | addresses); | 4598 | addresses); |
| 4607 | } | 4599 | } |
| 4608 | addresses = Fnreverse (addresses); | 4600 | addresses = Fnreverse (addresses); |
| @@ -4879,12 +4871,12 @@ server_accept_connection (Lisp_Object server, int channel) | |||
| 4879 | if (!NILP (service)) | 4871 | if (!NILP (service)) |
| 4880 | contact = Fplist_put (contact, QCservice, service); | 4872 | contact = Fplist_put (contact, QCservice, service); |
| 4881 | contact = Fplist_put (contact, QCremote, | 4873 | contact = Fplist_put (contact, QCremote, |
| 4882 | conv_sockaddr_to_lisp (&saddr.sa, len, true)); | 4874 | conv_sockaddr_to_lisp (&saddr.sa, len)); |
| 4883 | #ifdef HAVE_GETSOCKNAME | 4875 | #ifdef HAVE_GETSOCKNAME |
| 4884 | len = sizeof saddr; | 4876 | len = sizeof saddr; |
| 4885 | if (getsockname (s, &saddr.sa, &len) == 0) | 4877 | if (getsockname (s, &saddr.sa, &len) == 0) |
| 4886 | contact = Fplist_put (contact, QClocal, | 4878 | contact = Fplist_put (contact, QClocal, |
| 4887 | conv_sockaddr_to_lisp (&saddr.sa, len, true)); | 4879 | conv_sockaddr_to_lisp (&saddr.sa, len)); |
| 4888 | #endif | 4880 | #endif |
| 4889 | 4881 | ||
| 4890 | pset_childp (p, contact); | 4882 | pset_childp (p, contact); |
| @@ -8116,7 +8108,7 @@ init_process_emacs (int sockfd) | |||
| 8116 | union u_sockaddr sa; | 8108 | union u_sockaddr sa; |
| 8117 | socklen_t salen = sizeof sa; | 8109 | socklen_t salen = sizeof sa; |
| 8118 | if (getsockname (sockfd, &sa.sa, &salen) == 0) | 8110 | if (getsockname (sockfd, &sa.sa, &salen) == 0) |
| 8119 | sockname = conv_sockaddr_to_lisp (&sa.sa, salen, true); | 8111 | sockname = conv_sockaddr_to_lisp (&sa.sa, salen); |
| 8120 | } | 8112 | } |
| 8121 | # endif | 8113 | # endif |
| 8122 | Vinternal__daemon_sockname = sockname; | 8114 | Vinternal__daemon_sockname = sockname; |