X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_server.c;h=bc9c54e9efba4c9c318a39176e5406e7b6e5d577;hb=db05f326a4e98069ab685b3447a3e87037d1b7d8;hp=3e4adef377dd602172df8a585853cbbb22cc71d7;hpb=66696d1cadedbb362c392dadce9a8ce275dd5d80;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_server.c b/bacula/src/dird/ua_server.c index 3e4adef377..bc9c54e9ef 100644 --- a/bacula/src/dird/ua_server.c +++ b/bacula/src/dird/ua_server.c @@ -1,55 +1,50 @@ /* - * - * Bacula Director -- User Agent Server - * - * Kern Sibbald, September MM - * - * Version $Id$ - */ + Bacula® - The Network Backup Solution -/* - Copyright (C) 2000-2004 Kern Sibbald and John Walker + Copyright (C) 2000-2007 Free Software Foundation Europe e.V. - 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 (at your option) any later version. + 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. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + 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., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + Bacula® is a registered trademark of John Walker. + 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 subroutines */ - /* Imported variables */ extern int r_first; extern int r_last; extern struct s_res resources[]; -extern int console_msg_pending; -extern char my_name[]; - -/* Static variables */ - -/* Exported variables */ -int quit_cmd_thread = 0; -/* Imported functions */ /* Forward referenced functions */ - extern "C" void *connect_thread(void *arg); - static void *handle_UA_client_request(void *arg); @@ -74,8 +69,7 @@ void start_UA_server(dlist *addrs) if ((status=pthread_create(&thid, NULL, connect_thread, (void *)myaddrs)) != 0) { berrno be; - be.set_errno(status); - Emsg1(M_ABORT, 0, _("Cannot create UA thread: %s\n"), be.strerror()); + Emsg1(M_ABORT, 0, _("Cannot create UA thread: %s\n"), be.bstrerror(status)); } started = TRUE; return; @@ -86,8 +80,8 @@ void *connect_thread(void *arg) { pthread_detach(pthread_self()); - /* ****FIXME**** put # 10 (timeout) on config parameter */ - bnet_thread_server((dlist*)arg, 10, &ua_workq, handle_UA_client_request); + /* Permit 20 console connections */ + bnet_thread_server((dlist*)arg, 20, &ua_workq, handle_UA_client_request); return NULL; } @@ -113,7 +107,7 @@ JCR *new_control_jcr(const char *base_name, int job_type) jcr->sched_time = jcr->start_time; jcr->JobType = job_type; jcr->JobLevel = L_NONE; - jcr->JobStatus = JS_Running; + set_jcr_job_status(jcr, JS_Running); jcr->JobId = 0; return jcr; } @@ -127,45 +121,52 @@ static void *handle_UA_client_request(void *arg) int stat; UAContext *ua; JCR *jcr; - BSOCK *UA_sock = (BSOCK *)arg; + 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 = UA_sock; + ua->UA_sock = user; - 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_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); - } else { - do_a_command(ua, ua->cmd); - } - if (!ua->quit) { - if (ua->auto_display_messages) { - strcpy(ua->cmd, "messages"); - qmessagescmd(ua, ua->cmd); - ua->user_notified_msg_pending = FALSE; - } else if (!ua->user_notified_msg_pending && console_msg_pending) { - bsendmsg(ua, _("You have messages.\n")); - ua->user_notified_msg_pending = TRUE; - } - bnet_sig(ua->UA_sock, BNET_EOD); /* send end of command */ - } - } else if (is_bnet_stop(ua->UA_sock)) { - ua->quit = true; + 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); + } else { + do_a_command(ua, ua->cmd); + } + if (!ua->quit) { + 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; + } else if (!ua->gui && !ua->user_notified_msg_pending && console_msg_pending) { + if (ua->api) { + user->signal(BNET_MSGS_PENDING); + } else { + bsendmsg(ua, _("You have messages.\n")); + } + ua->user_notified_msg_pending = true; + } + } + if (!ua->api) user->signal(BNET_EOD); /* send end of command */ + } + } else if (is_bnet_stop(user)) { + ua->quit = true; } else { /* signal */ - bnet_sig(ua->UA_sock, BNET_POLL); + user->signal(BNET_POLL); } } @@ -194,8 +195,8 @@ UAContext *new_ua_context(JCR *jcr) ua->db = jcr->db; ua->cmd = get_pool_memory(PM_FNAME); ua->args = get_pool_memory(PM_FNAME); - ua->verbose = 1; - ua->automount = TRUE; + ua->verbose = true; + ua->automount = true; return ua; } @@ -213,6 +214,7 @@ void free_ua_context(UAContext *ua) if (ua->UA_sock) { bnet_close(ua->UA_sock); + ua->UA_sock = NULL; } free(ua); } @@ -226,5 +228,4 @@ void term_ua_server() if (!started) { return; } - quit_cmd_thread = TRUE; }