+static int get_autochanger_loaded_slot(DCR *dcr)
+{
+ JCR *jcr = dcr->jcr;
+ POOLMEM *changer, *results;
+ int status, loaded;
+ uint32_t timeout = dcr->device->max_changer_wait;
+ int drive = dcr->device->drive_index;
+
+ results = get_pool_memory(PM_MESSAGE);
+ changer = get_pool_memory(PM_FNAME);
+
+ lock_changer(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");
+ 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);
+ } else {
+ Jmsg(jcr, M_INFO, 0, _("3302 Autochanger \"loaded drive %d\", result: nothing loaded.\n"),
+ 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 */
+ }
+ unlock_changer(dcr);
+ free_pool_memory(changer);
+ free_pool_memory(results);
+ return loaded;
+}
+
+static void lock_changer(DCR *dcr)
+{
+ AUTOCHANGER *changer_res = dcr->device->changer_res;
+ if (changer_res) {
+ Dmsg1(100, "Locking changer %s\n", changer_res->hdr.name);
+ P(changer_res->changer_mutex); /* Lock changer script */
+ }
+}
+
+static void unlock_changer(DCR *dcr)
+{
+ AUTOCHANGER *changer_res = dcr->device->changer_res;
+ if (changer_res) {
+ Dmsg1(100, "Unlocking changer %s\n", changer_res->hdr.name);
+ V(changer_res->changer_mutex); /* Unlock changer script */
+ }
+}
+
+