From 7861327b7830c64675dd73d424de7d62007fd5a0 Mon Sep 17 00:00:00 2001
From: Micael Karlberg
Date: Wed, 6 Apr 2011 17:40:42 +0200
Subject: Accepting file descriptors (fd) in the config for socket type
ip_comm.
---
lib/inets/src/http_lib/http_transport.erl | 69 ++++++++++++++++++-------------
lib/inets/src/http_server/httpd_sup.erl | 45 ++++++++++++--------
2 files changed, 67 insertions(+), 47 deletions(-)
(limited to 'lib')
diff --git a/lib/inets/src/http_lib/http_transport.erl b/lib/inets/src/http_lib/http_transport.erl
index 0024d19fc1..173911b868 100644
--- a/lib/inets/src/http_lib/http_transport.erl
+++ b/lib/inets/src/http_lib/http_transport.erl
@@ -23,7 +23,7 @@
-export([
start/1,
connect/3, connect/4,
- listen/2, listen/3,
+ listen/2, listen/3, listen/4,
accept/2, accept/3,
close/2,
send/3,
@@ -136,10 +136,11 @@ connect({essl, SslConfig}, {Host, Port}, _, Timeout) ->
%%-------------------------------------------------------------------------
-%% listen(SocketType, Port) -> {ok, Socket} | {error, Reason}
+%% listen(SocketType, Addr, Port, Fd) -> {ok, Socket} | {error, Reason}
%% SocketType = ip_comm | {ssl, SSLConfig}
%% Port = integer()
-%% Socket = socket()
+%% Socket = socket()
+%% Fd = undefined | fd()
%%
%% Description: Sets up socket to listen on the port Port on the local
%% host using either gen_tcp or ssl. In the gen_tcp case the port
@@ -151,13 +152,8 @@ connect({essl, SslConfig}, {Host, Port}, _, Timeout) ->
listen(SocketType, Port) ->
listen(SocketType, undefined, Port).
-listen(ip_comm, Addr, Port) ->
- case (catch listen_ip_comm(Addr, Port)) of
- {'EXIT', Reason} ->
- {error, {exit, Reason}};
- Else ->
- Else
- end;
+listen(ip_comm = SocketType, Addr, Port) ->
+ listen(SocketType, Addr, Port, undefined);
%% Wrapper for backaward compatibillity
listen({ssl, SSLConfig}, Addr, Port) ->
@@ -186,9 +182,17 @@ listen({essl, SSLConfig} = Ssl, Addr, Port) ->
Opt2 = [{ssl_imp, new}, {reuseaddr, true} | Opt],
ssl:listen(Port, Opt2).
+listen(ip_comm, Addr, Port, Fd) ->
+ case (catch listen_ip_comm(Addr, Port, Fd)) of
+ {'EXIT', Reason} ->
+ {error, {exit, Reason}};
+ Else ->
+ Else
+ end.
+
-listen_ip_comm(Addr, Port) ->
- {NewPort, Opts, IpFamily} = get_socket_info(Addr, Port),
+listen_ip_comm(Addr, Port, Fd) ->
+ {NewPort, Opts, IpFamily} = get_socket_info(Addr, Port, Fd),
case IpFamily of
inet6fb4 ->
Opts2 = [inet6 | Opts],
@@ -223,29 +227,36 @@ listen_ip_comm(Addr, Port) ->
ipfamily_default(Addr, Port) ->
httpd_conf:lookup(Addr, Port, ipfamily, inet6fb4).
-get_socket_info(Addr, Port) ->
- Key = list_to_atom("httpd_" ++ integer_to_list(Port)),
- BaseOpts = [{backlog, 128}, {reuseaddr, true}],
+get_socket_info(Addr, Port, Fd0) ->
+ BaseOpts = [{backlog, 128}, {reuseaddr, true}],
IpFamilyDefault = ipfamily_default(Addr, Port),
- case init:get_argument(Key) of
- {ok, [[Value]]} ->
- {Fd, IpFamily} =
- case string:tokens(Value, [$|]) of
- [FdStr, IpFamilyStr] ->
- Fd0 = fd_of(FdStr),
- IpFamily0 = ip_family_of(IpFamilyStr),
- {Fd0, IpFamily0};
- [FdStr] ->
- {fd_of(FdStr), IpFamilyDefault};
- _ ->
- throw({error, {bad_descriptor, Value}})
- end,
+ %% The presence of a file descriptor takes precedence
+ case get_fd(Port, Fd0, IpFamilyDefault) of
+ {Fd, IpFamily} ->
{0, sock_opt(ip_comm, Addr, [{fd, Fd} | BaseOpts]), IpFamily};
- error ->
+ undefined ->
{Port, sock_opt(ip_comm, Addr, BaseOpts), IpFamilyDefault}
end.
+get_fd(Port, undefined = _Fd, IpFamilyDefault) ->
+ FdKey = list_to_atom("httpd_" ++ integer_to_list(Port)),
+ case init:get_argument(FdKey) of
+ {ok, [[Value]]} ->
+ case string:tokens(Value, [$|]) of
+ [FdStr, IpFamilyStr] ->
+ {fd_of(FdStr), ip_family_of(IpFamilyStr)};
+ [FdStr] ->
+ {fd_of(FdStr), IpFamilyDefault};
+ _ ->
+ throw({error, {bad_descriptor, Value}})
+ end;
+ error ->
+ undefined
+ end;
+get_fd(_Port, Fd, IpFamilyDefault) ->
+ {Fd, IpFamilyDefault}.
+
fd_of(FdStr) ->
case (catch list_to_integer(FdStr)) of
Fd when is_integer(Fd) ->
diff --git a/lib/inets/src/http_server/httpd_sup.erl b/lib/inets/src/http_server/httpd_sup.erl
index b248c9bcf0..d028a19bf0 100644
--- a/lib/inets/src/http_server/httpd_sup.erl
+++ b/lib/inets/src/http_server/httpd_sup.erl
@@ -182,24 +182,32 @@ httpd_child_spec(ConfigFile, AcceptTimeout, Debug) ->
Error
end.
-httpd_child_spec(Config, AcceptTimeout, Debug, Addr, 0) ->
- case start_listen(Addr, 0, Config) of
- {Pid, {NewPort, NewConfig, ListenSocket}} ->
- Name = {httpd_instance_sup, Addr, NewPort},
- StartFunc = {httpd_instance_sup, start_link,
- [NewConfig, AcceptTimeout,
- {Pid, ListenSocket}, Debug]},
- Restart = permanent,
- Shutdown = infinity,
- Modules = [httpd_instance_sup],
- Type = supervisor,
- {Name, StartFunc, Restart, Shutdown, Type, Modules};
- {Pid, {error, Reason}} ->
- exit(Pid, normal),
- {error, Reason}
- end;
-
httpd_child_spec(Config, AcceptTimeout, Debug, Addr, Port) ->
+ case Port == 0 orelse proplists:is_defined(fd, Config) of
+ true ->
+ httpd_child_spec_listen(Config, AcceptTimeout, Debug, Addr, Port);
+ false ->
+ httpd_child_spec_nolisten(Config, AcceptTimeout, Debug, Addr, Port)
+ end.
+
+httpd_child_spec_listen(Config, AcceptTimeout, Debug, Addr, Port) ->
+ case start_listen(Addr, Port, Config) of
+ {Pid, {NewPort, NewConfig, ListenSocket}} ->
+ Name = {httpd_instance_sup, Addr, NewPort},
+ StartFunc = {httpd_instance_sup, start_link,
+ [NewConfig, AcceptTimeout,
+ {Pid, ListenSocket}, Debug]},
+ Restart = permanent,
+ Shutdown = infinity,
+ Modules = [httpd_instance_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules};
+ {Pid, {error, Reason}} ->
+ exit(Pid, normal),
+ {error, Reason}
+ end.
+
+httpd_child_spec_nolisten(Config, AcceptTimeout, Debug, Addr, Port) ->
Name = {httpd_instance_sup, Addr, Port},
StartFunc = {httpd_instance_sup, start_link,
[Config, AcceptTimeout, Debug]},
@@ -224,7 +232,8 @@ listen(Address, Port, Config) ->
SocketType = proplists:get_value(socket_type, Config, ip_comm),
case http_transport:start(SocketType) of
ok ->
- case http_transport:listen(SocketType, Address, Port) of
+ Fd = proplists:get_value(fd, Config),
+ case http_transport:listen(SocketType, Address, Port, Fd) of
{ok, ListenSocket} ->
NewConfig = proplists:delete(port, Config),
{ok, NewPort} = inet:port(ListenSocket),
--
cgit v1.2.3
From 2f045f17afd8a286a06ceddf6fced1d3b81b4c5b Mon Sep 17 00:00:00 2001
From: Micael Karlberg
Date: Wed, 6 Apr 2011 18:11:58 +0200
Subject: Updated release notes and linked file (that is added markers in the
inets file).
---
lib/inets/doc/src/inets.xml | 54 +++++++++++++++++++++++++++++++--------------
lib/inets/doc/src/notes.xml | 17 +++++++++++++-
2 files changed, 54 insertions(+), 17 deletions(-)
(limited to 'lib')
diff --git a/lib/inets/doc/src/inets.xml b/lib/inets/doc/src/inets.xml
index c367d7fa77..a2bf42320f 100644
--- a/lib/inets/doc/src/inets.xml
+++ b/lib/inets/doc/src/inets.xml
@@ -1,4 +1,4 @@
-
+
@@ -32,8 +32,10 @@
The inets services API
This module provides the most basic API to the
- clients and servers, that are part of the Inets application,
- such as start and stop.
+ clients and servers, that are part of the Inets application,
+ such as start and stop.
+
+
@@ -42,7 +44,10 @@
this module:
service() = ftpc | tftp | httpc | httpd
property() = atom()
+
+
+
services() -> [{Service, Pid}]
@@ -54,11 +59,13 @@
Returns a list of currently running services.
- Services started as stand_alone will not
- be listed.
+ Services started as stand_alone will not be listed.
+
+
+
services_info() -> [{Service, Pid, Info}]
Returns a list of currently running services where
@@ -73,11 +80,13 @@
Returns a list of currently running services where each
- service is described by a [{Option, Value}] list. The
- information given in the list is specific for each service
- and it is probable that each service will have its own info
- function that gives you even more details about the
- service.
+ service is described by a [{Option, Value}] list. The
+ information given in the list is specific for each service
+ and it is probable that each service will have its own info
+ function that gives you even more details about the
+ service.
+
+
@@ -89,6 +98,8 @@
Returns a list of available service names.
+
+
@@ -101,18 +112,24 @@
Starts the Inets application. Default type
- is temporary. See also
- application(3)
+ is temporary. See also
+ application(3).
+
+
+
stop() -> ok
Stops the inets application.
Stops the inets application. See also
- application(3)
+ application(3).
+
+
+
start(Service, ServiceConfig) -> {ok, Pid} | {error, Reason}
start(Service, ServiceConfig, How) -> {ok, Pid} | {error, Reason}
@@ -144,8 +161,11 @@
some sense the calling process has now become the top
supervisor.
+
+
+
stop(Service, Reference) -> ok | {error, Reason}
Stops a started service of the inets application or takes
@@ -157,9 +177,11 @@
Stops a started service of the inets application or takes
- down a "stand_alone-service" gracefully. When the
- stand_alone option is used in start,
- only the pid is a valid argument to stop.
+ down a "stand_alone-service" gracefully. When the
+ stand_alone option is used in start,
+ only the pid is a valid argument to stop.
+
+
diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml
index f9411fed2a..db1752e6f9 100644
--- a/lib/inets/doc/src/notes.xml
+++ b/lib/inets/doc/src/notes.xml
@@ -77,6 +77,20 @@
Own Id: OTP-9157
+ -
+
[httpd] Extended support for file descriptors.
+ In order to be able to bind to a privileged port
+ without running the erlang VM as root, the support
+ for using file descriptors has been improved.
+ It is now possible to add to the config (option fd) when
+ calling the
+ inets:start(httpd, ...)
+ function.
+ Attila Rajmund Nohl
+ Own Id: OTP-9202
+ Aux Id: seq11819
+
+
@@ -162,7 +176,8 @@
are URL-encoded. Added support in http-client to use
URL-encoding. Also added the missing include directory
for the inets application.
- Own Id: OTP-8940 Aux Id: seq11735
+ Own Id: OTP-8940
+ Aux Id: seq11735
--
cgit v1.2.3
From d0f399b4b08b5cd9fb54bec5d71c82b560199c86 Mon Sep 17 00:00:00 2001
From: Micael Karlberg
Date: Tue, 12 Apr 2011 18:06:45 +0200
Subject: Proper release notes.
---
lib/inets/src/inets_app/inets.appup.src | 8 ++++++++
1 file changed, 8 insertions(+)
(limited to 'lib')
diff --git a/lib/inets/src/inets_app/inets.appup.src b/lib/inets/src/inets_app/inets.appup.src
index df18ffa9e8..c14f8d51f6 100644
--- a/lib/inets/src/inets_app/inets.appup.src
+++ b/lib/inets/src/inets_app/inets.appup.src
@@ -22,12 +22,14 @@
[
{load_module, ftp, soft_purge, soft_purge, []},
{load_module, http_util, soft_purge, soft_purge, []},
+ {load_module, http_transport, soft_purge, soft_purge, []},
{load_module, httpd_util, soft_purge, soft_purge, [http_util]},
{load_module, httpd_file, soft_purge, soft_purge, []},
{load_module, httpd_log, soft_purge, soft_purge, []},
{load_module, mod_esi, soft_purge, soft_purge, []},
{load_module, httpc, soft_purge, soft_purge, [httpc_handler]},
{load_module, httpc_request, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [http_transport]},
{update, httpd_request_handler, soft, soft_purge, soft_purge, []},
{update, httpc_handler, soft, soft_purge, soft_purge, [httpc_request]}
]
@@ -37,12 +39,14 @@
{load_module, ftp, soft_purge, soft_purge, []},
{load_module, http_chunk, soft_purge, soft_purge, []},
{load_module, http_util, soft_purge, soft_purge, []},
+ {load_module, http_transport, soft_purge, soft_purge, []},
{load_module, httpd_util, soft_purge, soft_purge, [http_util]},
{load_module, httpd_file, soft_purge, soft_purge, []},
{load_module, httpd_log, soft_purge, soft_purge, []},
{load_module, mod_esi, soft_purge, soft_purge, []},
{load_module, httpc, soft_purge, soft_purge, [httpc_handler]},
{load_module, httpc_request, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [http_transport]},
{update, httpd_request_handler, soft, soft_purge, soft_purge, []},
{update, httpc_handler, soft, soft_purge, soft_purge,
[httpc_request, http_chunk]}
@@ -64,12 +68,14 @@
[
{load_module, ftp, soft_purge, soft_purge, []},
{load_module, http_util, soft_purge, soft_purge, []},
+ {load_module, http_transport, soft_purge, soft_purge, []},
{load_module, httpd_util, soft_purge, soft_purge, [http_util]},
{load_module, httpd_file, soft_purge, soft_purge, []},
{load_module, httpd_log, soft_purge, soft_purge, []},
{load_module, mod_esi, soft_purge, soft_purge, []},
{load_module, httpc, soft_purge, soft_purge, [httpc_handler]},
{load_module, httpc_request, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [http_transport]},
{update, httpd_request_handler, soft, soft_purge, soft_purge, []},
{update, httpc_handler, soft, soft_purge, soft_purge, [httpc_request]}
]
@@ -79,12 +85,14 @@
{load_module, ftp, soft_purge, soft_purge, []},
{load_module, http_chunk, soft_purge, soft_purge, []},
{load_module, http_util, soft_purge, soft_purge, []},
+ {load_module, http_transport, soft_purge, soft_purge, []},
{load_module, httpd_util, soft_purge, soft_purge, [http_util]},
{load_module, httpd_file, soft_purge, soft_purge, []},
{load_module, httpd_log, soft_purge, soft_purge, []},
{load_module, mod_esi, soft_purge, soft_purge, []},
{load_module, httpc, soft_purge, soft_purge, [httpc_handler]},
{load_module, httpc_request, soft_purge, soft_purge, []},
+ {update, httpd_sup, soft, soft_purge, soft_purge, [http_transport]},
{update, httpd_request_handler, soft, soft_purge, soft_purge, []},
{update, httpc_handler, soft, soft_purge, soft_purge,
[httpc_request, http_chunk]}
--
cgit v1.2.3