%% ``Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB. %% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings %% AB. All Rights Reserved.'' %% %% $Id: httpd_sup.erl,v 1.1 2008/12/17 09:53:34 mikpe Exp $ %%---------------------------------------------------------------------- %% Purpose: The top supervisor for the inets application %%---------------------------------------------------------------------- -module(httpd_sup). -behaviour(supervisor). -include("httpd_verbosity.hrl"). %% public -export([start/2, start_link/2, start2/2, start_link2/2, stop/1, stop/2, stop2/1]). -export([init/1]). -define(D(F, A), io:format("~p:" ++ F ++ "~n", [?MODULE|A])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% supervisor callback functions start(ConfigFile, Verbosity) -> case start_link(ConfigFile, Verbosity) of {ok, Pid} -> unlink(Pid), {ok, Pid}; Else -> Else end. start_link(ConfigFile, Verbosity) -> case get_addr_and_port(ConfigFile) of {ok, ConfigList, Addr, Port} -> Name = make_name(Addr, Port), SupName = {local, Name}, supervisor:start_link(SupName, ?MODULE, [ConfigFile, ConfigList, Verbosity, Addr, Port]); {error, Reason} -> error_logger:error_report(Reason), {stop, Reason}; Else -> error_logger:error_report(Else), {stop, Else} end. start2(ConfigList, Verbosity) -> case start_link2(ConfigList, Verbosity) of {ok, Pid} -> unlink(Pid), {ok, Pid}; Else -> Else end. start_link2(ConfigList, Verbosity) -> case get_addr_and_port2(ConfigList) of {ok, Addr, Port} -> Name = make_name(Addr, Port), SupName = {local, Name}, supervisor:start_link(SupName, ?MODULE, [undefined, ConfigList, Verbosity, Addr, Port]); {error, Reason} -> error_logger:error_report(Reason), {stop, Reason}; Else -> error_logger:error_report(Else), {stop, Else} end. stop(Pid) when pid(Pid) -> do_stop(Pid); stop(ConfigFile) when list(ConfigFile) -> case get_addr_and_port(ConfigFile) of {ok, _, Addr, Port} -> stop(Addr, Port); Error -> Error end; stop(StartArgs) -> ok. stop(Addr, Port) when integer(Port) -> Name = make_name(Addr, Port), case whereis(Name) of Pid when pid(Pid) -> do_stop(Pid), ok; _ -> not_started end. stop2(ConfigList) when list(ConfigList) -> {ok, Addr, Port} = get_addr_and_port2(ConfigList), stop(Addr, Port). do_stop(Pid) -> exit(Pid, shutdown). init([ConfigFile, ConfigList, Verbosity, Addr, Port]) -> init(ConfigFile, ConfigList, Verbosity, Addr, Port); init(BadArg) -> {error, {badarg, BadArg}}. init(ConfigFile, ConfigList, Verbosity, Addr, Port) -> Flags = {one_for_one, 0, 1}, AccSupVerbosity = get_acc_sup_verbosity(Verbosity), MiscSupVerbosity = get_misc_sup_verbosity(Verbosity), Sups = [sup_spec(httpd_acceptor_sup, Addr, Port, AccSupVerbosity), sup_spec(httpd_misc_sup, Addr, Port, MiscSupVerbosity), worker_spec(httpd_manager, Addr, Port, ConfigFile, ConfigList, Verbosity, [gen_server])], {ok, {Flags, Sups}}. sup_spec(Name, Addr, Port, Verbosity) -> {{Name, Addr, Port}, {Name, start, [Addr, Port, Verbosity]}, permanent, 2000, supervisor, [Name, supervisor]}. worker_spec(Name, Addr, Port, ConfigFile, ConfigList, Verbosity, Modules) -> {{Name, Addr, Port}, {Name, start_link, [ConfigFile, ConfigList, Verbosity]}, permanent, 2000, worker, [Name] ++ Modules}. make_name(Addr,Port) -> httpd_util:make_name("httpd_sup",Addr,Port). %% get_addr_and_port get_addr_and_port(ConfigFile) -> case httpd_conf:load(ConfigFile) of {ok, ConfigList} -> {ok, Addr, Port} = get_addr_and_port2(ConfigList), {ok, ConfigList, Addr, Port}; Error -> Error end. get_addr_and_port2(ConfigList) -> Port = httpd_util:key1search(ConfigList, port, 80), Addr = httpd_util:key1search(ConfigList, bind_address), {ok, Addr, Port}. get_acc_sup_verbosity(V) -> case key1search(V, all) of undefined -> key1search(V, acceptor_sup_verbosity, ?default_verbosity); Verbosity -> Verbosity end. get_misc_sup_verbosity(V) -> case key1search(V, all) of undefined -> key1search(V, misc_sup_verbosity, ?default_verbosity); Verbosity -> Verbosity end. key1search(L, K) -> httpd_util:key1search(L, K). key1search(L, K, D) -> httpd_util:key1search(L, K, D).