From a17b9712c8155307da4085c66225c1b88e759e07 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Thu, 21 Apr 2005 09:25:25 +0000 Subject: [PATCH] - Fix seg fault in SD when referencing Alert Command. - More documentation. - Fix one more thing in Win32 build. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1945 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/kernstodo | 1 + bacula/src/filed/python.c | 8 +- bacula/src/lib/pythonlib.c | 2 +- bacula/src/stored/acquire.c | 2 +- bacula/src/stored/autochanger.c | 209 +++++++++++---------- bacula/src/stored/btape.c | 9 +- bacula/src/stored/protos.h | 2 +- bacula/src/version.h | 4 +- bacula/src/win32/console/console.mak | 2 +- bacula/src/win32/wx-console/wx-console.mak | 25 +++ 10 files changed, 148 insertions(+), 116 deletions(-) diff --git a/bacula/kernstodo b/bacula/kernstodo index 31055d0381..fb19aef22f 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -28,6 +28,7 @@ Autochangers: all Volumes from other drives. "update slots all-drives"? For 1.37: +- SD crashes after a tape restore then doing a backup. - Look at dird_conf.c:1000: warning: `int size' might be used uninitialized in this function - Make a callback when Rerun failed levels is called. diff --git a/bacula/src/filed/python.c b/bacula/src/filed/python.c index 3af306a477..e8fdeefc4a 100644 --- a/bacula/src/filed/python.c +++ b/bacula/src/filed/python.c @@ -42,7 +42,7 @@ extern PyObject *find_method(PyObject *eventsObject, PyObject *method, static PyObject *jcr_get(PyObject *self, PyObject *args); static PyObject *jcr_write(PyObject *self, PyObject *args); static PyObject *jcr_set(PyObject *self, PyObject *args, PyObject *keyw); -static PyObject *set_jcr_events(PyObject *self, PyObject *args); +static PyObject *set_job_events(PyObject *self, PyObject *args); /* Define Job entry points */ @@ -50,7 +50,7 @@ PyMethodDef JobMethods[] = { {"get", jcr_get, METH_VARARGS, "Get Job variables."}, {"set", (PyCFunction)jcr_set, METH_VARARGS|METH_KEYWORDS, "Set Job variables."}, - {"set_events", set_jcr_events, METH_VARARGS, "Define Job events."}, + {"set_events", set_job_events, METH_VARARGS, "Define Job events."}, {"write", jcr_write, METH_VARARGS, "Write output."}, {NULL, NULL, 0, NULL} /* last item */ }; @@ -168,11 +168,11 @@ PyObject *jcr_set(PyObject *self, PyObject *args, PyObject *keyw) } -static PyObject *set_jcr_events(PyObject *self, PyObject *args) +static PyObject *set_job_events(PyObject *self, PyObject *args) { PyObject *eObject; JCR *jcr; - if (!PyArg_ParseTuple(args, "O:set_events_hook", &eObject)) { + if (!PyArg_ParseTuple(args, "O:set_events", &eObject)) { return NULL; } Py_XINCREF(eObject); diff --git a/bacula/src/lib/pythonlib.c b/bacula/src/lib/pythonlib.c index 7ad1030995..416df8ff0b 100644 --- a/bacula/src/lib/pythonlib.c +++ b/bacula/src/lib/pythonlib.c @@ -142,7 +142,7 @@ void init_python_interpreter(const char *progname, const char *scripts, Jmsg1(NULL, M_ERROR_TERM, 0, "Could not Run Python string %s\n", buf); } JobType.tp_methods = JobMethods; - if(PyType_Ready(&JobType) != 0) { + if (PyType_Ready(&JobType) != 0) { Jmsg0(NULL, M_ERROR_TERM, 0, "Could not initialize Python Job type.\n"); PyErr_Print(); } diff --git a/bacula/src/stored/acquire.c b/bacula/src/stored/acquire.c index 1f47fc372d..7a4a2cb63d 100644 --- a/bacula/src/stored/acquire.c +++ b/bacula/src/stored/acquire.c @@ -675,7 +675,7 @@ bool release_device(DCR *dcr) BPIPE *bpipe; char line[MAXSTRING]; alert = get_pool_memory(PM_FNAME); - alert = edit_device_codes(dcr, alert, ""); + alert = edit_device_codes(dcr, alert, dcr->device->alert_command, ""); bpipe = open_bpipe(alert, 0, "r"); if (bpipe) { while (fgets(line, sizeof(line), bpipe->rfd)) { diff --git a/bacula/src/stored/autochanger.c b/bacula/src/stored/autochanger.c index 43755e4e6d..37885f571e 100644 --- a/bacula/src/stored/autochanger.c +++ b/bacula/src/stored/autochanger.c @@ -3,7 +3,7 @@ * Routines for handling the autochanger. * * Kern Sibbald, August MMII - * + * * Version $Id$ */ /* @@ -30,7 +30,6 @@ #include "stored.h" /* pull in Storage Deamon headers */ /* Forward referenced functions */ -char *edit_device_codes(DCR *dcr, char *omsg, const char *cmd); static int get_autochanger_loaded_slot(DCR *dcr); static void lock_changer(DCR *dcr); static void unlock_changer(DCR *dcr); @@ -46,8 +45,8 @@ static void unlock_changer(DCR *dcr); * dir bsock. * * Returns: 1 on success - * 0 on failure (no changer available) - * -1 on error on autochanger + * 0 on failure (no changer available) + * -1 on error on autochanger */ int autoload_device(DCR *dcr, int writing, BSOCK *dir) { @@ -55,22 +54,22 @@ int autoload_device(DCR *dcr, int writing, BSOCK *dir) DEVICE *dev = dcr->dev; int slot; int drive = dev->device->drive_index; - int rtn_stat = -1; /* error status */ + int rtn_stat = -1; /* error status */ POOLMEM *changer; slot = dcr->VolCatInfo.InChanger ? dcr->VolCatInfo.Slot : 0; /* - * Handle autoloaders here. If we cannot autoload it, we + * Handle autoloaders here. If we cannot autoload it, we * will return FALSE to ask the sysop. */ if (writing && dev_cap(dev, CAP_AUTOCHANGER) && slot <= 0) { if (dir) { - return 0; /* For user, bail out right now */ + return 0; /* For user, bail out right now */ } if (dir_find_next_appendable_volume(dcr)) { - slot = dcr->VolCatInfo.InChanger ? dcr->VolCatInfo.Slot : 0; + slot = dcr->VolCatInfo.InChanger ? dcr->VolCatInfo.Slot : 0; } else { - slot = 0; + slot = 0; } } Dmsg1(400, "Want changer slot=%d\n", slot); @@ -84,59 +83,61 @@ int autoload_device(DCR *dcr, int writing, BSOCK *dir) /* If tape we want is not loaded, load it. */ if (loaded != slot) { - offline_or_rewind_dev(dev); - /* We are going to load a new tape, so close the device */ - force_close_dev(dev); - lock_changer(dcr); - if (loaded != 0 && loaded != -1) { /* must unload drive */ + offline_or_rewind_dev(dev); + /* We are going to load a new tape, so close the device */ + force_close_dev(dev); + lock_changer(dcr); + if (loaded != 0 && loaded != -1) { /* must unload drive */ Dmsg0(400, "Doing changer unload.\n"); - Jmsg(jcr, M_INFO, 0, + Jmsg(jcr, M_INFO, 0, _("3303 Issuing autochanger \"unload slot %d, drive %d\" command.\n"), - loaded, drive); - dcr->VolCatInfo.Slot = loaded; /* slot to be unloaded */ - changer = edit_device_codes(dcr, changer, "unload"); - status = run_program(changer, timeout, NULL); - if (status != 0) { - berrno be; - be.set_errno(status); + loaded, drive); + dcr->VolCatInfo.Slot = loaded; /* slot to be unloaded */ + changer = edit_device_codes(dcr, changer, + dcr->device->changer_command, "unload"); + status = run_program(changer, timeout, NULL); + if (status != 0) { + berrno be; + be.set_errno(status); Jmsg(jcr, M_FATAL, 0, _("3992 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n"), - slot, drive, be.strerror()); - goto bail_out; - } + slot, drive, be.strerror()); + goto bail_out; + } Dmsg1(400, "unload status=%d\n", status); - } - /* - * Load the desired cassette - */ + } + /* + * Load the desired cassette + */ Dmsg1(400, "Doing changer load slot %d\n", slot); - Jmsg(jcr, M_INFO, 0, + Jmsg(jcr, M_INFO, 0, _("3304 Issuing autochanger \"load slot %d, drive %d\" command.\n"), - slot, drive); - dcr->VolCatInfo.Slot = slot; /* slot to be loaded */ - changer = edit_device_codes(dcr, changer, "load"); - status = run_program(changer, timeout, NULL); - if (status == 0) { + slot, drive); + dcr->VolCatInfo.Slot = slot; /* slot to be loaded */ + changer = edit_device_codes(dcr, changer, + dcr->device->changer_command, "load"); + status = run_program(changer, timeout, NULL); + if (status == 0) { Jmsg(jcr, M_INFO, 0, _("3305 Autochanger \"load slot %d, drive %d\", status is OK.\n"), - slot, drive); - } else { - berrno be; - be.set_errno(status); + slot, drive); + } else { + berrno be; + be.set_errno(status); Jmsg(jcr, M_FATAL, 0, _("3992 Bad autochanger \"load slot %d, drive %d\": ERR=%s.\n"), - slot, drive, be.strerror()); - goto bail_out; - } - unlock_changer(dcr); + slot, drive, be.strerror()); + goto bail_out; + } + unlock_changer(dcr); Dmsg2(400, "load slot %d status=%d\n", slot, status); } else { - status = 0; /* we got what we want */ + status = 0; /* we got what we want */ } Dmsg1(400, "After changer, status=%d\n", status); - if (status == 0) { /* did we succeed? */ - rtn_stat = 1; /* tape loaded by changer */ + if (status == 0) { /* did we succeed? */ + rtn_stat = 1; /* tape loaded by changer */ } } else { - rtn_stat = 0; /* no changer found */ + rtn_stat = 0; /* no changer found */ } free_pool_memory(changer); return rtn_stat; @@ -163,25 +164,26 @@ static int get_autochanger_loaded_slot(DCR *dcr) /* Find out what is loaded, zero means device is unloaded */ Jmsg(jcr, M_INFO, 0, _("3301 Issuing autochanger \"loaded drive %d\" command.\n"), - drive); - changer = edit_device_codes(dcr, changer, "loaded"); + drive); + changer = edit_device_codes(dcr, changer, + dcr->device->changer_command, "loaded"); status = run_program(changer, timeout, results); Dmsg3(50, "run_prog: %s stat=%d result=%s", changer, status, results); if (status == 0) { loaded = atoi(results); if (loaded > 0) { Jmsg(jcr, M_INFO, 0, _("3302 Autochanger \"loaded drive %d\", result is Slot %d.\n"), - drive, loaded); + drive, loaded); } else { Jmsg(jcr, M_INFO, 0, _("3302 Autochanger \"loaded drive %d\", result: nothing loaded.\n"), - drive); + drive); } } else { berrno be; be.set_errno(status); Jmsg(jcr, M_INFO, 0, _("3991 Bad autochanger \"loaded drive %d\" command: ERR=%s.\n"), - drive, be.strerror()); - loaded = -1; /* force unload */ + drive, be.strerror()); + loaded = -1; /* force unload */ } unlock_changer(dcr); free_pool_memory(changer); @@ -218,7 +220,7 @@ void mark_volume_not_inchanger(DCR *dcr) DEVICE *dev = dcr->dev; Jmsg(jcr, M_ERROR, 0, _("Autochanger Volume \"%s\" not found in slot %d.\n" " Setting InChanger to zero in catalog.\n"), - dcr->VolCatInfo.VolCatName, dcr->VolCatInfo.Slot); + dcr->VolCatInfo.VolCatName, dcr->VolCatInfo.Slot); dcr->VolCatInfo.InChanger = false; dev->VolCatInfo.InChanger = false; Dmsg0(400, "update vol info in mount\n"); @@ -260,27 +262,29 @@ bool autochanger_cmd(DCR *dcr, BSOCK *dir, const char *cmd) /* First unload any tape */ loaded = get_autochanger_loaded_slot(dcr); if (loaded > 0) { - bnet_fsend(dir, + bnet_fsend(dir, _("3307 Issuing autochanger \"unload slot %d, drive %d\" command.\n"), - loaded, drive); - slot = dcr->VolCatInfo.Slot; - dcr->VolCatInfo.Slot = loaded; - changer = edit_device_codes(dcr, changer, "unload"); - lock_changer(dcr); - int stat = run_program(changer, timeout, NULL); - unlock_changer(dcr); - if (stat != 0) { - berrno be; - be.set_errno(stat); + loaded, drive); + slot = dcr->VolCatInfo.Slot; + dcr->VolCatInfo.Slot = loaded; + changer = edit_device_codes(dcr, changer, + dcr->device->changer_command, "unload"); + lock_changer(dcr); + int stat = run_program(changer, timeout, NULL); + unlock_changer(dcr); + if (stat != 0) { + berrno be; + be.set_errno(stat); Jmsg(jcr, M_INFO, 0, _("3995 Bad autochanger \"unload slot %d, drive %d\": ERR=%s.\n"), - slot, drive, be.strerror()); - } - dcr->VolCatInfo.Slot = slot; + slot, drive, be.strerror()); + } + dcr->VolCatInfo.Slot = slot; } } /* Now issue the command */ - changer = edit_device_codes(dcr, changer, cmd); + changer = edit_device_codes(dcr, changer, + dcr->device->changer_command, cmd); bnet_fsend(dir, _("3306 Issuing autochanger \"%s\" command.\n"), cmd); lock_changer(dcr); bpipe = open_bpipe(changer, timeout, "r"); @@ -292,9 +296,9 @@ bool autochanger_cmd(DCR *dcr, BSOCK *dir, const char *cmd) if (strcmp(cmd, "list") == 0) { /* Get output from changer */ while (fgets(dir->msg, len, bpipe->rfd)) { - dir->msglen = strlen(dir->msg); + dir->msglen = strlen(dir->msg); Dmsg1(100, "msg); - bnet_send(dir); + bnet_send(dir); } } else { /* For slots command, read a single line */ @@ -304,7 +308,7 @@ bool autochanger_cmd(DCR *dcr, BSOCK *dir, const char *cmd) Dmsg1(100, "msg); bnet_send(dir); } - + stat = close_bpipe(bpipe); unlock_changer(dcr); if (stat != 0) { @@ -340,63 +344,62 @@ bail_out: * cmd = command string (load, unload, ...) * */ -char *edit_device_codes(DCR *dcr, char *omsg, const char *cmd) +char *edit_device_codes(DCR *dcr, char *omsg, const char *imsg, const char *cmd) { const char *p; const char *str; char add[20]; - const char *imsg = dcr->device->changer_command; *omsg = 0; Dmsg1(1800, "edit_device_codes: %s\n", imsg); for (p=imsg; *p; p++) { if (*p == '%') { - switch (*++p) { + switch (*++p) { case '%': str = "%"; - break; + break; case 'a': - str = dcr->dev->archive_name(); - break; + str = dcr->dev->archive_name(); + break; case 'c': - str = NPRT(dcr->device->changer_name); - break; + str = NPRT(dcr->device->changer_name); + break; case 'd': sprintf(add, "%d", dcr->dev->drive_index); - str = add; - break; + str = add; + break; case 'o': - str = NPRT(cmd); - break; + str = NPRT(cmd); + break; case 's': sprintf(add, "%d", dcr->VolCatInfo.Slot - 1); - str = add; - break; + str = add; + break; case 'S': sprintf(add, "%d", dcr->VolCatInfo.Slot); - str = add; - break; + str = add; + break; case 'j': /* Job name */ - str = dcr->jcr->Job; - break; + str = dcr->jcr->Job; + break; case 'v': - str = NPRT(dcr->VolumeName); - break; + str = NPRT(dcr->VolumeName); + break; case 'f': - str = NPRT(dcr->jcr->client_name); - break; + str = NPRT(dcr->jcr->client_name); + break; - default: + default: add[0] = '%'; - add[1] = *p; - add[2] = 0; - str = add; - break; - } + add[1] = *p; + add[2] = 0; + str = add; + break; + } } else { - add[0] = *p; - add[1] = 0; - str = add; + add[0] = *p; + add[1] = 0; + str = add; } Dmsg1(1900, "add_str %s\n", str); pm_strcat(&omsg, (char *)str); diff --git a/bacula/src/stored/btape.c b/bacula/src/stored/btape.c index 60ea8d3c5e..86f58b75b6 100644 --- a/bacula/src/stored/btape.c +++ b/bacula/src/stored/btape.c @@ -1124,7 +1124,8 @@ try_again: dcr->VolCatInfo.Slot = slot; /* Find out what is loaded, zero means device is unloaded */ Pmsg0(-1, _("3301 Issuing autochanger \"loaded\" command.\n")); - changer = edit_device_codes(dcr, changer, "loaded"); + changer = edit_device_codes(dcr, changer, + dcr->device->changer_command, "loaded"); status = run_program(changer, timeout, results); Dmsg3(100, "run_prog: %s stat=%d result=\"%s\"\n", changer, status, results); if (status == 0) { @@ -1148,7 +1149,8 @@ try_again: force_close_dev(dev); Pmsg2(-1, _("3302 Issuing autochanger \"unload %d %d\" command.\n"), loaded, dev->drive_index); - changer = edit_device_codes(dcr, changer, "unload"); + changer = edit_device_codes(dcr, changer, + dcr->device->changer_command, "unload"); status = run_program(changer, timeout, results); Pmsg2(-1, "unload status=%s %d\n", status==0?"OK":"Bad", status); if (status != 0) { @@ -1166,7 +1168,8 @@ try_again: dcr->VolCatInfo.Slot = slot; Pmsg2(-1, _("3303 Issuing autochanger \"load slot %d %d\" command.\n"), slot, dev->drive_index); - changer = edit_device_codes(dcr, changer, "load"); + changer = edit_device_codes(dcr, changer, + dcr->device->changer_command, "load"); Dmsg1(100, "Changer=%s\n", changer); force_close_dev(dev); status = run_program(changer, timeout, results); diff --git a/bacula/src/stored/protos.h b/bacula/src/stored/protos.h index 6fee3a0e8a..e99e42f195 100644 --- a/bacula/src/stored/protos.h +++ b/bacula/src/stored/protos.h @@ -60,7 +60,7 @@ int authenticate_filed(JCR *jcr); int autoload_device(DCR *dcr, int writing, BSOCK *dir); bool autochanger_cmd(DCR *dcr, BSOCK *dir, const char *cmd); void mark_volume_not_inchanger(DCR *dcr); -char *edit_device_codes(DCR *dcr, char *omsg, const char *cmd); +char *edit_device_codes(DCR *dcr, char *omsg, const char *imsg, const char *cmd); /* From block.c */ void dump_block(DEV_BLOCK *b, const char *msg); diff --git a/bacula/src/version.h b/bacula/src/version.h index 5eba91a939..34e07fa659 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,8 +1,8 @@ /* */ #undef VERSION #define VERSION "1.37.14" -#define BDATE "20 April 2005" -#define LSMDATE "20Apr05" +#define BDATE "21 April 2005" +#define LSMDATE "21Apr05" /* Debug flags */ #undef DEBUG diff --git a/bacula/src/win32/console/console.mak b/bacula/src/win32/console/console.mak index d258ba19d7..c3c2435855 100644 --- a/bacula/src/win32/console/console.mak +++ b/bacula/src/win32/console/console.mak @@ -441,13 +441,13 @@ SOURCE=..\lib\rwlock.cpp "$(INTDIR)\rwlock.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) + SOURCE=..\lib\res.cpp "$(INTDIR)\res.obj" : $(SOURCE) "$(INTDIR)" $(CPP) $(CPP_PROJ) $(SOURCE) - SOURCE=..\lib\scan.cpp "$(INTDIR)\scan.obj" : $(SOURCE) "$(INTDIR)" diff --git a/bacula/src/win32/wx-console/wx-console.mak b/bacula/src/win32/wx-console/wx-console.mak index 10d867ad13..309dfb1618 100644 --- a/bacula/src/win32/wx-console/wx-console.mak +++ b/bacula/src/win32/wx-console/wx-console.mak @@ -69,6 +69,7 @@ CLEAN : -@erase "$(INTDIR)\message.obj" -@erase "$(INTDIR)\parse_conf.obj" -@erase "$(INTDIR)\queue.obj" + -@erase "$(INTDIR)\res.obj" -@erase "$(INTDIR)\rwlock.obj" -@erase "$(INTDIR)\scan.obj" -@erase "$(INTDIR)\semlock.obj" @@ -143,6 +144,7 @@ LINK32_OBJS= \ "$(INTDIR)\message.obj" \ "$(INTDIR)\parse_conf.obj" \ "$(INTDIR)\queue.obj" \ + "$(INTDIR)\res.obj" \ "$(INTDIR)\rwlock.obj" \ "$(INTDIR)\scan.obj" \ "$(INTDIR)\semlock.obj" \ @@ -247,6 +249,8 @@ CLEAN : -@erase "$(INTDIR)\parse_conf.sbr" -@erase "$(INTDIR)\queue.obj -@erase "$(INTDIR)\queue.sbr" + -@erase "$(INTDIR)\res.obj + -@erase "$(INTDIR)\res.sbr" -@erase "$(INTDIR)\rwlock.obj -@erase "$(INTDIR)\rwlock.sbr" -@erase "$(INTDIR)\scan.obj @@ -344,6 +348,7 @@ BSC32_SBRS= \ "$(INTDIR)\message.sbr" \ "$(INTDIR)\parse_conf.sbr" \ "$(INTDIR)\queue.sbr" \ + "$(INTDIR)\res.sbr" \ "$(INTDIR)\rwlock.sbr" \ "$(INTDIR)\scan.sbr" \ "$(INTDIR)\semlock.sbr" \ @@ -413,6 +418,7 @@ LINK32_OBJS= \ "$(INTDIR)\message.obj" \ "$(INTDIR)\parse_conf.obj" \ "$(INTDIR)\queue.obj" \ + "$(INTDIR)\res.obj" \ "$(INTDIR)\rwlock.obj" \ "$(INTDIR)\scan.obj" \ "$(INTDIR)\semlock.obj" \ @@ -1045,6 +1051,25 @@ SOURCE=..\lib\queue.cpp !ENDIF +FILENAME=res +SOURCE=..\lib\res.cpp +!IF "$(CFG)" == "wx-console - Win32 Release" + + +"$(INTDIR)\$(FILENAME).obj" : $(SOURCE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ELSEIF "$(CFG)" == "wx-console - Win32 Debug" + + +"$(INTDIR)\$(FILENAME).obj" "$(INTDIR)\$(FILENAME).sbr" : $(SOURCE) "$(INTDIR)" + $(CPP) $(CPP_PROJ) $(SOURCE) + + +!ENDIF + + FILENAME=rwlock SOURCE=..\lib\rwlock.cpp !IF "$(CFG)" == "wx-console - Win32 Release" -- 2.39.5