comparison src/process.c @ 25248:f0fc8443bdbb

(Fopen_network_stream): Use getaddrinfo.
author Karl Heuer <kwzh@gnu.org>
date Thu, 12 Aug 1999 16:35:22 +0000
parents 4f3c8f1cec96
children ccf83ed7326a
comparison
equal deleted inserted replaced
25247:cf628ae92f06 25248:f0fc8443bdbb
839 { 839 {
840 CHECK_PROCESS (process, 0); 840 CHECK_PROCESS (process, 0);
841 CHECK_NATNUM (height, 0); 841 CHECK_NATNUM (height, 0);
842 CHECK_NATNUM (width, 0); 842 CHECK_NATNUM (width, 0);
843 if (set_window_size (XINT (XPROCESS (process)->infd), 843 if (set_window_size (XINT (XPROCESS (process)->infd),
844 XINT (height), XINT(width)) <= 0) 844 XINT (height), XINT (width)) <= 0)
845 return Qnil; 845 return Qnil;
846 else 846 else
847 return Qt; 847 return Qt;
848 } 848 }
849 849
1813 (name, buffer, host, service) 1813 (name, buffer, host, service)
1814 Lisp_Object name, buffer, host, service; 1814 Lisp_Object name, buffer, host, service;
1815 { 1815 {
1816 Lisp_Object proc; 1816 Lisp_Object proc;
1817 register int i; 1817 register int i;
1818
1819 #ifndef HAVE_GETADDRINFO
1818 struct sockaddr_in address; 1820 struct sockaddr_in address;
1819 struct servent *svc_info; 1821 struct servent *svc_info;
1820 struct hostent *host_info_ptr, host_info; 1822 struct hostent *host_info_ptr, host_info;
1821 char *(addr_list[2]); 1823 char *(addr_list[2]);
1822 IN_ADDR numeric_addr; 1824 IN_ADDR numeric_addr;
1825 struct hostent host_info_fixed;
1826 int port;
1827 #else /* ! HAVE_GETADDRINFO */
1828 struct addrinfo hints, *res, *lres;
1829 int ret = 0;
1830 int xerrno = 0;
1831 char *portstring, portbuf [128];
1832 #endif /* ! HAVE_GETADDRINFO */
1823 int s, outch, inch; 1833 int s, outch, inch;
1824 char errstring[80];
1825 int port;
1826 struct hostent host_info_fixed;
1827 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; 1834 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1828 int retry = 0; 1835 int retry = 0;
1829 int count = specpdl_ptr - specpdl; 1836 int count = specpdl_ptr - specpdl;
1830 1837
1831 #ifdef WINDOWSNT 1838 #ifdef WINDOWSNT
1834 #endif 1841 #endif
1835 1842
1836 GCPRO4 (name, buffer, host, service); 1843 GCPRO4 (name, buffer, host, service);
1837 CHECK_STRING (name, 0); 1844 CHECK_STRING (name, 0);
1838 CHECK_STRING (host, 0); 1845 CHECK_STRING (host, 0);
1846
1847 #ifdef HAVE_GETADDRINFO
1848 /*
1849 * SERVICE can either be a string or int.
1850 * Convert to a C string for later use by getaddrinfo.
1851 */
1852 if (INTEGERP (service))
1853 {
1854 sprintf (portbuf, "%d", XINT (service));
1855 portstring = portbuf;
1856 }
1857 else
1858 {
1859 CHECK_STRING (service, 0);
1860 portstring = XSTRING (service)->data;
1861 }
1862 #else /* ! HAVE_GETADDRINFO */
1839 if (INTEGERP (service)) 1863 if (INTEGERP (service))
1840 port = htons ((unsigned short) XINT (service)); 1864 port = htons ((unsigned short) XINT (service));
1841 else 1865 else
1842 { 1866 {
1843 CHECK_STRING (service, 0); 1867 CHECK_STRING (service, 0);
1844 svc_info = getservbyname (XSTRING (service)->data, "tcp"); 1868 svc_info = getservbyname (XSTRING (service)->data, "tcp");
1845 if (svc_info == 0) 1869 if (svc_info == 0)
1846 error ("Unknown service \"%s\"", XSTRING (service)->data); 1870 error ("Unknown service \"%s\"", XSTRING (service)->data);
1847 port = svc_info->s_port; 1871 port = svc_info->s_port;
1848 } 1872 }
1873 #endif /* ! HAVE_GETADDRINFO */
1874
1849 1875
1850 /* Slow down polling to every ten seconds. 1876 /* Slow down polling to every ten seconds.
1851 Some kernels have a bug which causes retrying connect to fail 1877 Some kernels have a bug which causes retrying connect to fail
1852 after a connect. Polling can interfere with gethostbyname too. */ 1878 after a connect. Polling can interfere with gethostbyname too. */
1853 #ifdef POLL_FOR_INPUT 1879 #ifdef POLL_FOR_INPUT
1854 bind_polling_period (10); 1880 bind_polling_period (10);
1855 #endif 1881 #endif
1856 1882
1857 #ifndef TERM 1883 #ifndef TERM
1884 #ifdef HAVE_GETADDRINFO
1885 {
1886 immediate_quit = 1;
1887 QUIT;
1888 memset (&hints, 0, sizeof (hints));
1889 hints.ai_flags = AI_NUMERICHOST;
1890 hints.ai_family = AF_UNSPEC;
1891 hints.ai_socktype = SOCK_STREAM;
1892 hints.ai_protocol = 0;
1893 ret = getaddrinfo (XSTRING (host)->data, portstring, &hints, &res);
1894 if (!ret) /* numeric */
1895 {
1896 freeaddrinfo (res);
1897 hints.ai_flags = AI_CANONNAME;
1898 }
1899 else /* non-numeric */
1900 {
1901 hints.ai_flags = 0;
1902 }
1903 ret = getaddrinfo (XSTRING (host)->data, portstring, &hints, &res);
1904 if (ret)
1905 {
1906 error ("%s/%s %s", XSTRING (host)->data, portstring,
1907 gai_strerror (ret));
1908 }
1909 immediate_quit = 0;
1910 }
1911
1912 for (lres = res; lres ; lres = lres->ai_next)
1913 {
1914 s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol);
1915 if (s < 0)
1916 report_file_error ("error creating socket", Fcons (name, Qnil));
1917
1918 /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
1919 when connect is interrupted. So let's not let it get interrupted.
1920 Note we do not turn off polling, because polling is only used
1921 when not interrupt_input, and thus not normally used on the systems
1922 which have this bug. On systems which use polling, there's no way
1923 to quit if polling is turned off. */
1924 if (interrupt_input)
1925 unrequest_sigio ();
1926
1927 loop:
1928
1929 immediate_quit = 1;
1930 QUIT;
1931
1932 ret = connect (s, lres->ai_addr, lres->ai_addrlen);
1933
1934 if (ret == -1 && errno != EISCONN)
1935 {
1936 xerrno = errno;
1937
1938 immediate_quit = 0;
1939
1940 if (errno == EINTR)
1941 goto loop;
1942 if (errno == EADDRINUSE && retry < 20)
1943 {
1944 /* A delay here is needed on some FreeBSD systems,
1945 and it is harmless, since this retrying takes time anyway
1946 and should be infrequent. */
1947 Fsleep_for (make_number (1), Qnil);
1948 retry++;
1949 goto loop;
1950 }
1951
1952 close (s);
1953 }
1954 if (ret == 0) /* We got a valid connect */
1955 break;
1956 } /* address loop */
1957 freeaddrinfo (res);
1958 if (ret != 0)
1959 {
1960 if (interrupt_input)
1961 request_sigio ();
1962
1963 errno = xerrno;
1964 report_file_error ("connection failed",
1965 Fcons (host, Fcons (name, Qnil)));
1966 }
1967 #else /* ! HAVE_GETADDRINFO */
1968
1858 while (1) 1969 while (1)
1859 { 1970 {
1860 #ifdef TRY_AGAIN 1971 #ifdef TRY_AGAIN
1861 h_errno = 0; 1972 h_errno = 0;
1862 #endif 1973 #endif
1943 2054
1944 errno = xerrno; 2055 errno = xerrno;
1945 report_file_error ("connection failed", 2056 report_file_error ("connection failed",
1946 Fcons (host, Fcons (name, Qnil))); 2057 Fcons (host, Fcons (name, Qnil)));
1947 } 2058 }
2059 #endif /* ! HAVE_GETADDRINFO */
1948 2060
1949 immediate_quit = 0; 2061 immediate_quit = 0;
1950 2062
1951 #ifdef POLL_FOR_INPUT 2063 #ifdef POLL_FOR_INPUT
1952 unbind_to (count, Qnil); 2064 unbind_to (count, Qnil);
2805 2917
2806 vs = get_vms_process_pointer (p->pid); 2918 vs = get_vms_process_pointer (p->pid);
2807 if (vs) 2919 if (vs)
2808 { 2920 {
2809 if (!vs->iosb[0]) 2921 if (!vs->iosb[0])
2810 return(0); /* Really weird if it does this */ 2922 return (0); /* Really weird if it does this */
2811 if (!(vs->iosb[0] & 1)) 2923 if (!(vs->iosb[0] & 1))
2812 return -1; /* I/O error */ 2924 return -1; /* I/O error */
2813 } 2925 }
2814 else 2926 else
2815 error ("Could not get VMS process pointer"); 2927 error ("Could not get VMS process pointer");