Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Right-click on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(28) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(200) |
Feb
(258) |
Mar
(236) |
Apr
(345) |
May
(329) |
Jun
(162) |
Jul
(260) |
Aug
(265) |
Sep
(112) |
Oct
(280) |
Nov
(362) |
Dec
(297) |
2006 |
Jan
(201) |
Feb
(147) |
Mar
(136) |
Apr
(268) |
May
(103) |
Jun
(340) |
Jul
(399) |
Aug
(381) |
Sep
(367) |
Oct
(166) |
Nov
(287) |
Dec
(405) |
2007 |
Jan
(366) |
Feb
(245) |
Mar
(192) |
Apr
(194) |
May
(291) |
Jun
(172) |
Jul
(158) |
Aug
(153) |
Sep
(273) |
Oct
(121) |
Nov
(183) |
Dec
(164) |
2008 |
Jan
(183) |
Feb
(170) |
Mar
(186) |
Apr
(152) |
May
(216) |
Jun
(190) |
Jul
(190) |
Aug
(79) |
Sep
(133) |
Oct
(282) |
Nov
(142) |
Dec
(170) |
2009 |
Jan
(147) |
Feb
(79) |
Mar
(172) |
Apr
(102) |
May
(101) |
Jun
(49) |
Jul
(200) |
Aug
(127) |
Sep
(150) |
Oct
(181) |
Nov
(73) |
Dec
(143) |
2010 |
Jan
(118) |
Feb
(287) |
Mar
(138) |
Apr
(201) |
May
(32) |
Jun
(15) |
Jul
(18) |
Aug
(43) |
Sep
(9) |
Oct
(2) |
Nov
(16) |
Dec
(7) |
2011 |
Jan
(7) |
Feb
(23) |
Mar
(13) |
Apr
(9) |
May
(3) |
Jun
(4) |
Jul
(7) |
Aug
(16) |
Sep
(9) |
Oct
(61) |
Nov
(52) |
Dec
(29) |
2012 |
Jan
(38) |
Feb
(12) |
Mar
(7) |
Apr
(10) |
May
(14) |
Jun
(46) |
Jul
(1) |
Aug
(10) |
Sep
(23) |
Oct
(4) |
Nov
(4) |
Dec
(5) |
2013 |
Jan
(4) |
Feb
(19) |
Mar
|
Apr
(1) |
May
(3) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
(24) |
Apr
(18) |
May
(7) |
Jun
(7) |
Jul
(7) |
Aug
(6) |
Sep
|
Oct
|
Nov
(1) |
Dec
|
2015 |
Jan
|
Feb
|
Mar
(2) |
Apr
|
May
(4) |
Jun
(1) |
Jul
|
Aug
(9) |
Sep
(5) |
Oct
(5) |
Nov
(2) |
Dec
(9) |
2016 |
Jan
(23) |
Feb
(5) |
Mar
|
Apr
|
May
(9) |
Jun
(6) |
Jul
(15) |
Aug
|
Sep
|
Oct
(9) |
Nov
(3) |
Dec
(2) |
2017 |
Jan
|
Feb
(9) |
Mar
(14) |
Apr
|
May
(17) |
Jun
(31) |
Jul
(30) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
1
(2) |
2
(4) |
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
(2) |
12
(2) |
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
(6) |
29
|
30
|
|
|
|
|
From: Kern Sibbald <kerns@us...> - 2010-11-11 07:58:42
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Bacula". The branch, Branch-5.0 has been updated via 9bb55770097e7c438f8bcf92ee5c6bb4259cf812 (commit) via 59c108948b2c1a21dd4ee6119558204b9db03797 (commit) via 6947e2beb42c45116698a32d868f9632948bad4f (commit) via 4af190e1dcd6bbacdf1c04ee2324cd1cc8406a82 (commit) from 0c7b32c5e8542c8da83793f75ba3b0271a5cdd58 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9bb55770097e7c438f8bcf92ee5c6bb4259cf812 Author: Eric Bollengier <eric@...> Date: Fri Nov 5 10:25:14 2010 +0100 Try to fix #1660 about segfault during pruning commit 59c108948b2c1a21dd4ee6119558204b9db03797 Author: Eric Bollengier <eric@...> Date: Wed Nov 3 19:23:12 2010 +0100 Stop restore if job is canceled commit 6947e2beb42c45116698a32d868f9632948bad4f Author: Kern Sibbald <kern@...> Date: Wed Nov 3 19:21:02 2010 +0100 Make sure JobErrors is always nonzero on fatal error commit 4af190e1dcd6bbacdf1c04ee2324cd1cc8406a82 Author: Kern Sibbald <kern@...> Date: Tue Nov 2 16:42:46 2010 +0100 Fix bug #1655 Quitting bconsole with ctrl+d doesn't save history ----------------------------------------------------------------------- Summary of changes: diff --git a/bacula/src/console/console.c b/bacula/src/console/console.c index 203cee3..fb975ac 100644 --- a/bacula/src/console/console.c +++ b/bacula/src/console/console.c @@ -674,6 +674,11 @@ static int eolcmd(FILE *input, BSOCK *UA_sock) return 1; } +/* + * Return 1 if OK + * 0 if no input + * -1 error (must stop) + */ int get_cmd(FILE *input, const char *prompt, BSOCK *sock, int sec) { @@ -690,7 +695,7 @@ get_cmd(FILE *input, const char *prompt, BSOCK *sock, int sec) */ line = readline((char *)prompt); /* cast needed for old readlines */ if (!line) { - exit(1); + return -1; /* error return and exit */ } strip_trailing_junk(line); command = line; @@ -700,7 +705,7 @@ get_cmd(FILE *input, const char *prompt, BSOCK *sock, int sec) sendit(_("Command logic problem\n")); sock->msglen = 0; sock->msg[0] = 0; - return 0; + return 0; /* No input */ } /* @@ -731,7 +736,7 @@ get_cmd(FILE *input, const char *prompt, BSOCK *sock, int sec) actuallyfree(line); /* allocated by readline() malloc */ line = NULL; } - return 1; + return 1; /* OK */ } #else /* no readline, do it ourselves */ @@ -844,8 +849,9 @@ static int console_update_history(const char *histfile) int ret=0; #ifdef HAVE_READLINE -/* first, try to truncate the history file, and if it - * fail, the file is probably not present, and we +/* + * first, try to truncate the history file, and if it + * fails, the file is probably not present, and we * can use write_history to create it */ @@ -854,7 +860,6 @@ static int console_update_history(const char *histfile) } else { ret = write_history(histfile); } - #endif return ret; @@ -865,7 +870,6 @@ static int console_init_history(const char *histfile) int ret=0; #ifdef HAVE_READLINE - using_history(); ret = read_history(histfile); /* Tell the completer that we want a complete . */ diff --git a/bacula/src/dird/ua_prune.c b/bacula/src/dird/ua_prune.c index edef66d..fb2efb0 100644 --- a/bacula/src/dird/ua_prune.c +++ b/bacula/src/dird/ua_prune.c @@ -409,6 +409,7 @@ int prune_jobs(UAContext *ua, CLIENT *client, POOL *pool, int JobType) JOB_DBR jr; db_lock(ua->db); + memset(&del, 0, sizeof(del)); memset(&cr, 0, sizeof(cr)); bstrncpy(cr.Name, client->name(), sizeof(cr.Name)); @@ -438,7 +439,6 @@ int prune_jobs(UAContext *ua, CLIENT *client, POOL *pool, int JobType) edit_int64(now - period, ed1); /* Jobs older than ed1 are good candidates */ edit_int64(cr.ClientId, ed2); - memset(&del, 0, sizeof(del)); del.max_ids = 100; del.JobId = (JobId_t *)malloc(sizeof(JobId_t) * del.max_ids); del.PurgedFiles = (char *)malloc(del.max_ids); diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index 04ed306..41b9c11 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -1917,6 +1917,10 @@ bail_out: ret = 0; /* we stop here */ } + if (job_canceled(jcr)) { + ret = 0; /* we stop here */ + } + return ret; } diff --git a/bacula/src/lib/message.c b/bacula/src/lib/message.c index 60fbfdc..b13b380 100644 --- a/bacula/src/lib/message.c +++ b/bacula/src/lib/message.c @@ -1263,6 +1263,9 @@ Jmsg(JCR *jcr, int type, utime_t mtime, const char *fmt,...) if (jcr) { set_jcr_job_status(jcr, JS_FatalError); } + if (jcr && jcr->JobErrors == 0) { + jcr->JobErrors = 1; + } break; case M_ERROR: len = bsnprintf(rbuf, sizeof(rbuf), _("%s JobId %u: Error: "), my_name, JobId); hooks/post-receive -- Bacula |
From: Kern Sibbald <kerns@us...> - 2010-11-11 07:58:23
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Bacula". The branch, Branch-5.1 has been updated via 80c4ba962287d4a9aeb851e3161dc04886963562 (commit) via b80e7452e1a1d460c6d08d77561d9be0b24ca263 (commit) via 7fc5fe1b10047210db9c20ccb415d9ac87f6eee1 (commit) via 738175c804f2f68394fd661a833883f738187941 (commit) via 4cf69a09c9d422e24d0cd77226b7ace241307dc7 (commit) via c123a8ad3b380a4a17071112ad42382437221d80 (commit) via 60c65dd2db927a9f9cc8c5355a9389b674aba88e (commit) via 976d40263747a32cf308a551b4c56c91fa0a24ee (commit) via f8b8054be989c6064bb1dfddd3ee11eeb8792d89 (commit) from abafcb92921fa9e7ab415b25972d9d5491a7c73a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 80c4ba962287d4a9aeb851e3161dc04886963562 Author: Kern Sibbald <kern@...> Date: Sun Nov 7 17:55:03 2010 +0100 Implement close button in bat tabs commit b80e7452e1a1d460c6d08d77561d9be0b24ca263 Author: Kern Sibbald <kern@...> Date: Sun Oct 24 20:43:15 2010 +0200 Set daemon name and host name to zero commit 7fc5fe1b10047210db9c20ccb415d9ac87f6eee1 Author: Eric Bollengier <eric@...> Date: Fri Nov 5 18:52:36 2010 +0100 Permit to get Where/RegexWhere from Plugin and give access to Accurate data commit 738175c804f2f68394fd661a833883f738187941 Author: Eric Bollengier <eric@...> Date: Fri Nov 5 14:43:37 2010 +0100 Allow Plugin command without argument commit 4cf69a09c9d422e24d0cd77226b7ace241307dc7 Author: Eric Bollengier <eric@...> Date: Fri Nov 5 10:41:27 2010 +0100 Fix compilation problem on win64 commit c123a8ad3b380a4a17071112ad42382437221d80 Author: Eric Bollengier <eric@...> Date: Wed Nov 3 19:23:12 2010 +0100 Stop restore if job is canceled commit 60c65dd2db927a9f9cc8c5355a9389b674aba88e Author: Eric Bollengier <eric@...> Date: Wed Nov 3 09:46:30 2010 +0100 tweak help message commit 976d40263747a32cf308a551b4c56c91fa0a24ee Author: Kern Sibbald <kern@...> Date: Wed Nov 3 19:21:02 2010 +0100 Make sure JobErrors is always nonzero on fatal error commit f8b8054be989c6064bb1dfddd3ee11eeb8792d89 Author: Kern Sibbald <kern@...> Date: Tue Nov 2 16:42:46 2010 +0100 Fix bug #1655 Quitting bconsole with ctrl+d doesn't save history ----------------------------------------------------------------------- Summary of changes: diff --git a/bacula/src/console/console.c b/bacula/src/console/console.c index 9f6360c..ca1ee1b 100644 --- a/bacula/src/console/console.c +++ b/bacula/src/console/console.c @@ -675,6 +675,11 @@ static int eolcmd(FILE *input, BSOCK *UA_sock) return 1; } +/* + * Return 1 if OK + * 0 if no input + * -1 error (must stop) + */ int get_cmd(FILE *input, const char *prompt, BSOCK *sock, int sec) { @@ -691,7 +696,7 @@ get_cmd(FILE *input, const char *prompt, BSOCK *sock, int sec) */ line = readline((char *)prompt); /* cast needed for old readlines */ if (!line) { - exit(1); + return -1; /* error return and exit */ } strip_trailing_junk(line); command = line; @@ -701,7 +706,7 @@ get_cmd(FILE *input, const char *prompt, BSOCK *sock, int sec) sendit(_("Command logic problem\n")); sock->msglen = 0; sock->msg[0] = 0; - return 0; + return 0; /* No input */ } /* @@ -732,7 +737,7 @@ get_cmd(FILE *input, const char *prompt, BSOCK *sock, int sec) actuallyfree(line); /* allocated by readline() malloc */ line = NULL; } - return 1; + return 1; /* OK */ } #else /* no readline, do it ourselves */ @@ -845,8 +850,9 @@ static int console_update_history(const char *histfile) int ret=0; #ifdef HAVE_READLINE -/* first, try to truncate the history file, and if it - * fail, the file is probably not present, and we +/* + * first, try to truncate the history file, and if it + * fails, the file is probably not present, and we * can use write_history to create it */ @@ -855,7 +861,6 @@ static int console_update_history(const char *histfile) } else { ret = write_history(histfile); } - #endif return ret; @@ -866,7 +871,6 @@ static int console_init_history(const char *histfile) int ret=0; #ifdef HAVE_READLINE - using_history(); ret = read_history(histfile); /* Tell the completer that we want a complete . */ diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index 1496ccc..16c9e82 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -162,7 +162,7 @@ static struct cmdstruct commands[] = { /* C { NT_("relabel"), relabel_cmd, _("Relabel a tape"), NT_("storage=<storage-name> oldvolume=<old-volume-name>\n\tvolume=<newvolume-name> pool=<pool>"), false}, - { NT_("release"), release_cmd, _("Release storage"), NT_("storage-name"), false}, + { NT_("release"), release_cmd, _("Release storage"), NT_("storage=<storage-name>"), false}, { NT_("reload"), reload_cmd, _("Reload conf file"), NT_(""), true}, { NT_("run"), run_cmd, _("Run a job"), NT_("job=<job-name> client=<client-name>\n\tfileset=<FileSet-name> level=<level-keyword>\n\tstorage=<storage-name>" diff --git a/bacula/src/filed/fd_plugins.c b/bacula/src/filed/fd_plugins.c index d235d0c..44f9be5 100644 --- a/bacula/src/filed/fd_plugins.c +++ b/bacula/src/filed/fd_plugins.c @@ -44,6 +44,7 @@ const char *plugin_type = "-fd.so"; #endif extern int save_file(JCR *jcr, FF_PKT *ff_pkt, bool top_level); +extern bool check_changes(JCR *jcr, FF_PKT *ff_pkt); /* Function pointers to be set here */ extern DLL_IMP_EXP int (*plugin_bopen)(BFILE *bfd, const char *fname, int flags, mode_t mode); @@ -73,6 +74,7 @@ static bRC baculaNewOptions(bpContext *ctx); static bRC baculaNewInclude(bpContext *ctx); static bool is_plugin_compatible(Plugin *plugin); static bool get_plugin_name(JCR *jcr, char *cmd, int *ret); +static bRC baculaCheckChanges(bpContext *ctx, struct save_pkt *sp); /* * These will be plugged into the global pointer structure for @@ -108,7 +110,8 @@ static bFuncs bfuncs = { baculaAddRegex, baculaAddWild, baculaNewOptions, - baculaNewInclude + baculaNewInclude, + baculaCheckChanges }; /* @@ -232,23 +235,32 @@ bool plugin_check_file(JCR *jcr, char *fname) * systemstate:/@SYSTEMSTATE/ * => ret = 11 * => can use strncmp(plugin_name, cmd, ret); + * + * The plugin command can contain only the plugin name + * Plugin = alldrives + * => ret = 9 */ static bool get_plugin_name(JCR *jcr, char *cmd, int *ret) { char *p; int len; - if (!cmd) { + if (!cmd || (*cmd == '\0')) { return false; } /* Handle plugin command here backup */ Dmsg1(dbglvl, "plugin cmd=%s\n", cmd); - if (!(p = strchr(cmd, ':'))) { - Jmsg1(jcr, M_ERROR, 0, "Malformed plugin command: %s\n", cmd); - return false; - } - len = p - cmd; - if (len <= 0) { - return false; + if ((p = strchr(cmd, ':')) == NULL) { + if (strchr(cmd, ' ') == NULL) { /* we have just the plugin name */ + len = strlen(cmd); + } else { + Jmsg1(jcr, M_ERROR, 0, "Malformed plugin command: %s\n", cmd); + return false; + } + } else { /* plugin:argument */ + len = p - cmd; + if (len <= 0) { + return false; + } } *ret = len; return true; @@ -1005,6 +1017,12 @@ static bRC baculaGetValue(bpContext *ctx, bVariable var, void *value) case bVarWorkingDir: *(void **)value = me->working_directory; break; + case bVarWhere: + *(char **)value = jcr->where; + break; + case bVarRegexWhere: + *(char **)value = jcr->RegexWhere; + break; } return bRC_OK; } @@ -1234,6 +1252,50 @@ static bRC baculaNewInclude(bpContext *ctx) } +/* + * Check if a file have to be backuped using Accurate code + */ +static bRC baculaCheckChanges(bpContext *ctx, struct save_pkt *sp) +{ + JCR *jcr; + bacula_ctx *bctx; + FF_PKT *ff_pkt; + bRC ret = bRC_Error; + + if (!is_ctx_good(ctx, jcr, bctx)) { + goto bail_out; + } + if (!sp) { + goto bail_out; + } + + ff_pkt = jcr->ff; + /* + * Copy fname and link because save_file() zaps them. This + * avoids zaping the plugin's strings. + */ + ff_pkt->type = sp->type; + if (!sp->fname) { + Jmsg0(jcr, M_FATAL, 0, _("Command plugin: no fname in baculaCheckChanges packet.\n")); + goto bail_out; + } + + ff_pkt->fname = sp->fname; + ff_pkt->link = sp->link; + memcpy(&ff_pkt->statp, &sp->statp, sizeof(ff_pkt->statp)); + + if (check_changes(jcr, ff_pkt)) { + ret = bRC_OK; + } else { + ret = bRC_Seen; + } + +bail_out: + Dmsg1(100, "checkChanges=%i\n", ret); + return ret; +} + + #ifdef TEST_PROGRAM int (*plugin_bopen)(JCR *jcr, const char *fname, int flags, mode_t mode) = NULL; diff --git a/bacula/src/filed/fd_plugins.h b/bacula/src/filed/fd_plugins.h index 8ff6b44..8fd4c62 100644 --- a/bacula/src/filed/fd_plugins.h +++ b/bacula/src/filed/fd_plugins.h @@ -175,7 +175,9 @@ typedef enum { bVarFileSeen = 10, bVarVssObject = 11, bVarVssDllHandle = 12, - bVarWorkingDir = 13 + bVarWorkingDir = 13, + bVarWhere = 14, + bVarRegexWhere = 15 } bVariable; /* Events that are passed to plugin */ @@ -254,6 +256,7 @@ typedef struct s_baculaFuncs { bRC (*AddWild)(bpContext *ctx, const char *item, int type); bRC (*NewOptions)(bpContext *ctx); bRC (*NewInclude)(bpContext *ctx); + bRC (*checkChanges)(bpContext *ctx, struct save_pkt *sp); } bFuncs; @@ -272,7 +275,7 @@ typedef enum { #define FD_PLUGIN_MAGIC "*FDPluginData*" -#define FD_PLUGIN_INTERFACE_VERSION 4 +#define FD_PLUGIN_INTERFACE_VERSION 5 typedef struct s_pluginInfo { uint32_t size; diff --git a/bacula/src/filed/job.c b/bacula/src/filed/job.c index 368976d..13e0947 100644 --- a/bacula/src/filed/job.c +++ b/bacula/src/filed/job.c @@ -2194,6 +2194,10 @@ bail_out: ret = 0; /* we stop here */ } + if (job_canceled(jcr)) { + ret = 0; /* we stop here */ + } + return ret; } diff --git a/bacula/src/findlib/find_one.c b/bacula/src/findlib/find_one.c index 1d8313f..6cad341 100644 --- a/bacula/src/findlib/find_one.c +++ b/bacula/src/findlib/find_one.c @@ -274,7 +274,7 @@ bool has_file_changed(JCR *jcr, FF_PKT *ff_pkt) * For incremental/diffential or accurate backups, we * determine if the current file has changed. */ -static bool check_changes(JCR *jcr, FF_PKT *ff_pkt) +bool check_changes(JCR *jcr, FF_PKT *ff_pkt) { /* in special mode (like accurate backup), the programmer can * choose his comparison function. diff --git a/bacula/src/findlib/protos.h b/bacula/src/findlib/protos.h index a272a15..71076c6 100644 --- a/bacula/src/findlib/protos.h +++ b/bacula/src/findlib/protos.h @@ -69,6 +69,7 @@ int find_one_file(JCR *jcr, FF_PKT *ff, char *p, dev_t parent_device, bool top_level); int term_find_one(FF_PKT *ff); bool has_file_changed(JCR *jcr, FF_PKT *ff_pkt); +bool check_changes(JCR *jcr, FF_PKT *ff_pkt); /* From get_priv.c */ int enable_backup_privileges(JCR *jcr, int ignore_errors); diff --git a/bacula/src/lib/crc32.c b/bacula/src/lib/crc32.c index 7c1c890..a7cb2af 100644 --- a/bacula/src/lib/crc32.c +++ b/bacula/src/lib/crc32.c @@ -378,10 +378,10 @@ uint32_t bcrc32(unsigned char*buf, int len) uint32_t crc = tole(~0); /* Align it */ - if ((long)buf & 3 && len) { + if ((intptr_t)buf & 3 && len) { do { DO_CRC(*buf++); - } while ((--len) && ((long)buf)&3); + } while ((--len) && ((intptr_t)buf)&3); } rem_len = len & 3; /* load data 32 bits wide, xor data 32 bits wide. */ diff --git a/bacula/src/lib/message.c b/bacula/src/lib/message.c index ca6ed8d..e1d1dce 100644 --- a/bacula/src/lib/message.c +++ b/bacula/src/lib/message.c @@ -58,8 +58,8 @@ utime_t daemon_start_time = 0; /* Daemon start time */ const char *version = VERSION " (" BDATE ")"; const char *dist_name = DISTNAME " " DISTVER; const int beef = BEEF; -char my_name[30]; /* daemon name is stored here */ -char host_name[50]; /* host machine name */ +char my_name[30] = {0}; /* daemon name is stored here */ +char host_name[50] = {0}; /* host machine name */ char *exepath = (char *)NULL; char *exename = (char *)NULL; int console_msg_pending = false; @@ -1264,6 +1264,9 @@ Jmsg(JCR *jcr, int type, utime_t mtime, const char *fmt,...) if (jcr) { set_jcr_job_status(jcr, JS_FatalError); } + if (jcr && jcr->JobErrors == 0) { + jcr->JobErrors = 1; + } break; case M_ERROR: len = bsnprintf(rbuf, sizeof(rbuf), _("%s JobId %u: Error: "), my_name, JobId); diff --git a/bacula/src/qt-console/mainwin.cpp b/bacula/src/qt-console/mainwin.cpp index 8b74f6e..5b1593a 100644 --- a/bacula/src/qt-console/mainwin.cpp +++ b/bacula/src/qt-console/mainwin.cpp @@ -80,7 +80,7 @@ MainWin::MainWin(QWidget *parent) : QMainWindow(parent) treeWidget->setColumnCount(1); treeWidget->setHeaderLabel( tr("Select Page") ); treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu); - // tabWidget->setTabsClosable(true); /* wait for QT 4.5 */ + tabWidget->setTabsClosable(true); /* wait for QT 4.5 */ createPages(); resetFocus(); /* lineEdit->setFocus() */ @@ -265,6 +265,7 @@ void MainWin::connectSignals() connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int))); connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *))); connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int))); + connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closePage())); connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows())); connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked())); connect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked())); @@ -292,6 +293,7 @@ void MainWin::disconnectSignals() disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int))); disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *))); disconnect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int))); + disconnect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closePage())); disconnect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows())); disconnect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked())); disconnect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked())); hooks/post-receive -- Bacula |