X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_server.c;h=257a23de512b06936d49f77f4e36863b101b4831;hb=80ce34c3c69aa823538220a8df186d4447c2460c;hp=5423a07d16afe68834ce65b3ffe5ff10c0dc6830;hpb=86d794263a9bddd4ff65974bbf75363e611f8b44;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_server.c b/bacula/src/dird/ua_server.c index 5423a07d16..257a23de51 100644 --- a/bacula/src/dird/ua_server.c +++ b/bacula/src/dird/ua_server.c @@ -1,22 +1,14 @@ -/* - * - * Bacula Director -- User Agent Server - * - * Kern Sibbald, September MM - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2006 Free Software Foundation Europe e.V. + Copyright (C) 2000-2007 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. This program is Free Software; you can redistribute it and/or modify it under the terms of version two of the GNU General Public - License as published by the Free Software Foundation plus additions - that are listed in the file LICENSE. + License as published by the Free Software Foundation and included + in the file LICENSE. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -28,19 +20,24 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark ofJohn Walker. + Bacula® is a registered trademark of Kern Sibbald. The licensor of Bacula is the Free Software Foundation Europe (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * + * Bacula Director -- User Agent Server + * + * Kern Sibbald, September MM + * + * Version $Id$ + */ #include "bacula.h" #include "dird.h" /* Imported variables */ -extern int r_first; -extern int r_last; -extern struct s_res resources[]; /* Forward referenced functions */ @@ -69,7 +66,7 @@ void start_UA_server(dlist *addrs) if ((status=pthread_create(&thid, NULL, connect_thread, (void *)myaddrs)) != 0) { berrno be; - Emsg1(M_ABORT, 0, _("Cannot create UA thread: %s\n"), be.strerror(status)); + Emsg1(M_ABORT, 0, _("Cannot create UA thread: %s\n"), be.bstrerror(status)); } started = TRUE; return; @@ -79,9 +76,10 @@ extern "C" void *connect_thread(void *arg) { pthread_detach(pthread_self()); + set_jcr_in_tsd(INVALID_JCR); - /* Permit 10 console connections */ - bnet_thread_server((dlist*)arg, 10, &ua_workq, handle_UA_client_request); + /* Permit MaxConsoleConnect console connections */ + bnet_thread_server((dlist*)arg, director->MaxConsoleConnect, &ua_workq, handle_UA_client_request); return NULL; } @@ -105,8 +103,8 @@ JCR *new_control_jcr(const char *base_name, int job_type) jcr->sd_auth_key = bstrdup("dummy"); /* dummy Storage daemon key */ create_unique_job_name(jcr, base_name); jcr->sched_time = jcr->start_time; - jcr->JobType = job_type; - jcr->JobLevel = L_NONE; + jcr->set_JobType(job_type); + jcr->set_JobLevel(L_NONE); set_jcr_job_status(jcr, JS_Running); jcr->JobId = 0; return jcr; @@ -121,46 +119,54 @@ static void *handle_UA_client_request(void *arg) int stat; UAContext *ua; JCR *jcr; + BSOCK *user = (BSOCK *)arg; pthread_detach(pthread_self()); - jcr = new_control_jcr("*Console*", JT_CONSOLE); + jcr = new_control_jcr("-Console-", JT_CONSOLE); ua = new_ua_context(jcr); - ua->UA_sock = (BSOCK *)arg; + ua->UA_sock = user; + set_jcr_in_tsd(INVALID_JCR); - bnet_recv(ua->UA_sock); /* Get first message */ + user->recv(); /* Get first message */ if (!authenticate_user_agent(ua)) { goto getout; } while (!ua->quit) { - stat = bnet_recv(ua->UA_sock); + if (ua->api) user->signal(BNET_MAIN_PROMPT); + stat = user->recv(); if (stat >= 0) { pm_strcpy(ua->cmd, ua->UA_sock->msg); parse_ua_args(ua); if (ua->argc > 0 && ua->argk[0][0] == '.') { - do_a_dot_command(ua, ua->cmd); + do_a_dot_command(ua); } else { - do_a_command(ua, ua->cmd); + do_a_command(ua); } + dequeue_messages(ua->jcr); if (!ua->quit) { - if (acl_access_ok(ua, Command_ACL, "messages", 8)) { + if (console_msg_pending && acl_access_ok(ua, Command_ACL, "messages", 8)) { if (ua->auto_display_messages) { pm_strcpy(ua->cmd, "messages"); qmessagescmd(ua, ua->cmd); - ua->user_notified_msg_pending = FALSE; + ua->user_notified_msg_pending = false; } else if (!ua->gui && !ua->user_notified_msg_pending && console_msg_pending) { - bsendmsg(ua, _("You have messages.\n")); - ua->user_notified_msg_pending = TRUE; + if (ua->api) { + user->signal(BNET_MSGS_PENDING); + } else { + bsendmsg(ua, _("You have messages.\n")); + } + ua->user_notified_msg_pending = true; } } - bnet_sig(ua->UA_sock, BNET_EOD); /* send end of command */ + if (!ua->api) user->signal(BNET_EOD); /* send end of command */ } - } else if (is_bnet_stop(ua->UA_sock)) { + } else if (is_bnet_stop(user)) { ua->quit = true; } else { /* signal */ - bnet_sig(ua->UA_sock, BNET_POLL); + user->signal(BNET_POLL); } }