Rework service init functions to pass down service name. This is
[ira/wip.git] / source / web_server / web_server.c
index 762806c84f32bd4abacdea8e5dab8aaf37ebbb4c..bd212cff7d28df7fcaa37c7703a2f0b60fad60c4 100644 (file)
@@ -7,7 +7,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -16,8 +16,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 #include "system/network.h"
 #include "lib/socket/netif.h"
 #include "lib/tls/tls.h"
+#include "param/param.h"
 
 /* don't allow connections to hang around forever */
-#define HTTP_TIMEOUT 30
+#define HTTP_TIMEOUT 120
 
 /*
   destroy a web connection
@@ -79,13 +79,13 @@ static void websrv_recv(struct stream_connection *conn, uint16_t flags)
        if (NT_STATUS_IS_ERR(status)) goto failed;
        if (!NT_STATUS_IS_OK(status)) return;
 
-       status = data_blob_append(web, &web->input.partial, buf, nread);
-       if (!NT_STATUS_IS_OK(status)) goto failed;
+       if (!data_blob_append(web, &web->input.partial, buf, nread))
+               goto failed;
 
        /* parse any lines that are available */
        b = web->input.partial;
        while (!web->input.end_of_headers &&
-              (p=memchr(b.data, '\n', b.length))) {
+              (p=(uint8_t *)memchr(b.data, '\n', b.length))) {
                const char *line = (const char *)b.data;
                *p = 0;
                if (p != b.data && p[-1] == '\r') {
@@ -241,7 +241,7 @@ static const struct stream_server_ops web_stream_ops = {
 static void websrv_task_init(struct task_server *task)
 {
        NTSTATUS status;
-       uint16_t port = lp_web_port();
+       uint16_t port = lp_web_port(task->lp_ctx);
        const struct model_ops *model_ops;
 
        task_server_set_title(task, "task[websrv]");
@@ -250,22 +250,31 @@ static void websrv_task_init(struct task_server *task)
        model_ops = process_model_byname("single");
        if (!model_ops) goto failed;
 
-       if (lp_interfaces() && lp_bind_interfaces_only()) {
-               int num_interfaces = iface_count();
+       if (lp_interfaces(task->lp_ctx) && lp_bind_interfaces_only(task->lp_ctx)) {
+               int num_interfaces;
                int i;
+               struct interface *ifaces;
+
+               load_interfaces(NULL, lp_interfaces(task->lp_ctx), &ifaces);
+
+               num_interfaces = iface_count(ifaces);
                for(i = 0; i < num_interfaces; i++) {
-                       const char *address = iface_n_ip(i);
-                       status = stream_setup_socket(task->event_ctx, model_ops, 
+                       const char *address = iface_n_ip(ifaces, i);
+                       status = stream_setup_socket(task->event_ctx, 
+                                                    task->lp_ctx, model_ops, 
                                                     &web_stream_ops, 
                                                     "ipv4", address, 
-                                                    &port, task);
+                                                    &port, lp_socket_options(task->lp_ctx), 
+                                                    task);
                        if (!NT_STATUS_IS_OK(status)) goto failed;
                }
+
+               talloc_free(ifaces);
        } else {
-               status = stream_setup_socket(task->event_ctx, model_ops, 
-                                            &web_stream_ops, 
-                                            "ipv4", lp_socket_address(), 
-                                            &port, task);
+               status = stream_setup_socket(task->event_ctx, task->lp_ctx,
+                                            model_ops, &web_stream_ops, 
+                                            "ipv4", lp_socket_address(task->lp_ctx), 
+                                            &port, lp_socket_options(task->lp_ctx), task);
                if (!NT_STATUS_IS_OK(status)) goto failed;
        }
 
@@ -286,9 +295,11 @@ failed:
   listening on all configured sockets
 */
 static NTSTATUS websrv_init(struct event_context *event_context, 
+                           struct loadparm_context *lp_ctx,
                            const struct model_ops *model_ops)
 {      
-       return task_server_startup(event_context, model_ops, websrv_task_init);
+       return task_server_startup(event_context, lp_ctx, "web", 
+                                  model_ops, websrv_task_init);
 }
 
 /* called at smbd startup - register ourselves as a server service */