]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/dircmd.c
Make cd accept wildcards
[bacula/bacula] / bacula / src / stored / dircmd.c
index 5664144fb8e018e3e94061c57b6c80229347c0d1..65fcefed25e41dc64007e737401222bb00a15986 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2001-2010 Free Software Foundation Europe e.V.
+   Copyright (C) 2001-2012 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.
@@ -153,6 +153,7 @@ void *handle_connection_request(void *arg)
 
    if (bs->recv() <= 0) {
       Emsg1(M_ERROR, 0, _("Connection request from %s failed.\n"), bs->who());
+      bmicrosleep(5, 0);   /* make user wait 5 seconds */
       bs->close();
       return NULL;
    }
@@ -163,6 +164,7 @@ void *handle_connection_request(void *arg)
    if (bs->msglen < 25 || bs->msglen > (int)sizeof(name)) {
       Dmsg1(000, "<filed: %s", bs->msg);
       Emsg2(M_ERROR, 0, _("Invalid connection from %s. Len=%d\n"), bs->who(), bs->msglen);
+      bmicrosleep(5, 0);   /* make user wait 5 seconds */
       bs->close();
       return NULL;
    }
@@ -287,7 +289,7 @@ static bool die_cmd(JCR *jcr)
 static bool setdebug_cmd(JCR *jcr)
 {
    BSOCK *dir = jcr->dir_bsock;
-   int level, trace_flag;
+   int32_t level, trace_flag;
 
    Dmsg1(10, "setdebug_cmd: %s", dir->msg);
    if (sscanf(dir->msg, "setdebug=%d trace=%d", &level, &trace_flag) != 2 || level < 0) {
@@ -302,6 +304,8 @@ static bool setdebug_cmd(JCR *jcr)
 
 /*
  * Cancel a Job
+ *   Be careful, we switch to using the job's JCR! So, using
+ *   BSOCKs on that jcr can have two threads in the same code.
  */
 static bool cancel_cmd(JCR *cjcr)
 {
@@ -315,14 +319,14 @@ static bool cancel_cmd(JCR *cjcr)
          dir->fsend(_("3904 Job %s not found.\n"), Job);
       } else {
          oldStatus = jcr->JobStatus;
-         set_jcr_job_status(jcr, JS_Canceled);
+         jcr->setJobStatus(JS_Canceled);
          Dmsg2(800, "Cancel JobId=%d %p\n", jcr->JobId, jcr);
          if (!jcr->authenticated && oldStatus == JS_WaitFD) {
             pthread_cond_signal(&jcr->job_start_wait); /* wake waiting thread */
          }
          if (jcr->file_bsock) {
-            jcr->file_bsock->signal(BNET_TERMINATE);
             jcr->file_bsock->set_terminated();
+            jcr->file_bsock->set_timed_out();
             Dmsg2(800, "Term bsock jid=%d %p\n", jcr->JobId, jcr);
          } else {
             /* Still waiting for FD to connect, release it */
@@ -340,9 +344,7 @@ static bool cancel_cmd(JCR *cjcr)
             Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId);
             pthread_cond_broadcast(&wait_device_release);
          }
-         Jmsg(jcr, M_INFO, 0, _("JobId=%d Job=\"%s\" marked to be canceled.\n"), 
-            (int)jcr->JobId, jcr->Job);
-         dir->fsend(_("3000 Job %s marked to be canceled.\n"), jcr->Job);
+         dir->fsend(_("3000 JobId=%ld Job=\"%s\" marked to be canceled.\n"), jcr->JobId, jcr->Job);
          free_jcr(jcr);
       }
    } else {
@@ -374,8 +376,7 @@ static bool do_label(JCR *jcr, int relabel)
    DCR *dcr;
    DEVICE *dev;
    bool ok = false;
-   int slot;
-   int drive;
+   int32_t slot, drive;
 
    newname = get_memory(dir->msglen+1);
    oldname = get_memory(dir->msglen+1);
@@ -477,7 +478,7 @@ static void label_volume_if_ok(DCR *dcr, char *oldname,
    /* Set old volume name for open if relabeling */
    dcr->setVolCatName(volname);
    if (dev->open(dcr, mode) < 0) {
-      dir->fsend(_("3910 Unable to open device %s: ERR=%s\n"),
+      dir->fsend(_("3910 Unable to open device \"%s\": ERR=%s\n"),
          dev->print_name(), dev->bstrerror());
       goto bail_out;      
    }
@@ -564,7 +565,7 @@ static bool read_label(DCR *dcr)
       ok = true;
       break;
    default:
-      dir->fsend(_("3902 Cannot mount Volume on Storage Device %s because:\n%s"),
+      dir->fsend(_("3902 Cannot mount Volume on Storage Device \"%s\" because:\n%s"),
          dev->print_name(), jcr->errmsg);
       ok = false;
       break;
@@ -655,8 +656,8 @@ static bool mount_cmd(JCR *jcr)
    BSOCK *dir = jcr->dir_bsock;
    DEVICE *dev;
    DCR *dcr;
-   int drive;
-   int slot = 0;
+   int32_t drive;
+   int32_t slot = 0;
    bool ok;
 
    ok = sscanf(dir->msg, "mount %127s drive=%d slot=%d", devname.c_str(), 
@@ -664,6 +665,7 @@ static bool mount_cmd(JCR *jcr)
    if (!ok) {
       ok = sscanf(dir->msg, "mount %127s drive=%d", devname.c_str(), &drive) == 2;
    }
+   Dmsg3(100, "ok=%d drive=%d slot=%d\n", ok, drive, slot);
    if (ok) {
       dcr = find_device(jcr, devname, drive);
       if (dcr) {
@@ -687,12 +689,13 @@ static bool mount_cmd(JCR *jcr)
          /* In both of these two cases, we (the user) unmounted the Volume */
          case BST_UNMOUNTED_WAITING_FOR_SYSOP:
          case BST_UNMOUNTED:
+            Dmsg2(100, "Unmounted changer=%d slot=%d\n", dev->is_autochanger(), slot);
             if (dev->is_autochanger() && slot > 0) {
                try_autoload_device(jcr, dcr, slot, "");
             }
             /* We freed the device, so reopen it and wake any waiting threads */
             if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
-               dir->fsend(_("3901 Unable to open device %s: ERR=%s\n"),
+               dir->fsend(_("3901 Unable to open device \"%s\": ERR=%s\n"),
                   dev->print_name(), dev->bstrerror());
                if (dev->blocked() == BST_UNMOUNTED) {
                   /* We blocked the device, so unblock it */
@@ -712,10 +715,10 @@ static bool mount_cmd(JCR *jcr)
                dev->set_blocked(BST_MOUNT);
             }
             if (dev->is_labeled()) {
-               dir->fsend(_("3001 Device %s is mounted with Volume \"%s\"\n"),
+               dir->fsend(_("3001 Device \"%s\" is mounted with Volume \"%s\"\n"),
                   dev->print_name(), dev->VolHdr.VolumeName);
             } else {
-               dir->fsend(_("3905 Device %s open but no Bacula volume is mounted.\n"
+               dir->fsend(_("3905 Device \"%s\" open but no Bacula volume is mounted.\n"
                                  "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
                           dev->print_name());
             }
@@ -725,52 +728,52 @@ static bool mount_cmd(JCR *jcr)
             break;
 
          case BST_DOING_ACQUIRE:
-            dir->fsend(_("3001 Device %s is doing acquire.\n"),
+            dir->fsend(_("3001 Device \"%s\" is doing acquire.\n"),
                        dev->print_name());
             break;
 
          case BST_WRITING_LABEL:
-            dir->fsend(_("3903 Device %s is being labeled.\n"), 
+            dir->fsend(_("3903 Device \"%s\" is being labeled.\n"), 
                dev->print_name());
             break;
 
          case BST_NOT_BLOCKED:
+            Dmsg2(100, "Not blocked changer=%d slot=%d\n", dev->is_autochanger(), slot);
             if (dev->is_autochanger() && slot > 0) {
                try_autoload_device(jcr, dcr, slot, "");
             }
             if (dev->is_open()) {
                if (dev->is_labeled()) {
-                  dir->fsend(_("3001 Device %s is mounted with Volume \"%s\"\n"),
+                  dir->fsend(_("3001 Device \"%s\" is mounted with Volume \"%s\"\n"),
                      dev->print_name(), dev->VolHdr.VolumeName);
                } else {
-                  dir->fsend(_("3905 Device %s open but no Bacula volume is mounted.\n"
+                  dir->fsend(_("3905 Device \"%s\" open but no Bacula volume is mounted.\n"
                                  "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
                              dev->print_name());
                }
             } else if (dev->is_tape()) {
                if (dev->open(dcr, OPEN_READ_ONLY) < 0) {
-                  dir->fsend(_("3901 Unable to open device %s: ERR=%s\n"),
+                  dir->fsend(_("3901 Unable to open device \"%s\": ERR=%s\n"),
                      dev->print_name(), dev->bstrerror());
                   break;
                }
                read_label(dcr);
                if (dev->is_labeled()) {
-                  dir->fsend(_("3001 Device %s is already mounted with Volume \"%s\"\n"),
+                  dir->fsend(_("3001 Device \"%s\" is already mounted with Volume \"%s\"\n"),
                      dev->print_name(), dev->VolHdr.VolumeName);
                } else {
-                  dir->fsend(_("3905 Device %s open but no Bacula volume is mounted.\n"
+                  dir->fsend(_("3905 Device \"%s\" open but no Bacula volume is mounted.\n"
                                     "If this is not a blank tape, try unmounting and remounting the Volume.\n"),
                              dev->print_name());
                }
             } else if (dev->is_unmountable()) {
                if (dev->mount(1)) {
-                  dir->fsend(_("3002 Device %s is mounted.\n"), 
-                     dev->print_name());
+                  dir->fsend(_("3002 Device \"%s\" is mounted.\n"), dev->print_name());
                } else {
                   dir->fsend(_("3907 %s"), dev->bstrerror());
                } 
             } else { /* must be file */
-               dir->fsend(_("3906 File device %s is always mounted.\n"),
+               dir->fsend(_("3906 File device \"%s\" is always mounted.\n"),
                   dev->print_name());
                pthread_cond_broadcast(&dev->wait_next_vol);
                Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)dcr->jcr->JobId);
@@ -778,8 +781,12 @@ static bool mount_cmd(JCR *jcr)
             }
             break;
 
+         case BST_RELEASING:
+            dir->fsend(_("3930 Device \"%s\" is being released.\n"), dev->print_name());
+            break;
+
          default:
-            dir->fsend(_("3905 Bizarre wait state %d\n"), dev->blocked());
+            dir->fsend(_("3905 Unknown wait state %d\n"), dev->blocked());
             break;
          }
          dev->dunlock();
@@ -804,7 +811,7 @@ static bool unmount_cmd(JCR *jcr)
    BSOCK *dir = jcr->dir_bsock;
    DEVICE *dev;
    DCR *dcr;
-   int drive;
+   int32_t drive;
 
    if (sscanf(dir->msg, "unmount %127s drive=%d", devname.c_str(), &drive) == 2) {
       dcr = find_device(jcr, devname, drive);
@@ -817,14 +824,14 @@ static bool unmount_cmd(JCR *jcr)
             }
             if (dev->is_unmountable()) {
                if (dev->unmount(0)) {
-                  dir->fsend(_("3002 Device %s unmounted.\n"), 
+                  dir->fsend(_("3002 Device \"%s\" unmounted.\n"), 
                      dev->print_name());
                } else {
                   dir->fsend(_("3907 %s"), dev->bstrerror());
                } 
             } else {
                Dmsg0(90, "Device already unmounted\n");
-               dir->fsend(_("3901 Device %s is already unmounted.\n"), 
+               dir->fsend(_("3901 Device \"%s\" is already unmounted.\n"), 
                   dev->print_name());
             }
          } else if (dev->blocked() == BST_WAITING_FOR_SYSOP) {
@@ -839,16 +846,16 @@ static bool unmount_cmd(JCR *jcr)
                dir->fsend(_("3907 %s"), dev->bstrerror());
             } else {
                dev->set_blocked(BST_UNMOUNTED_WAITING_FOR_SYSOP);
-               dir->fsend(_("3001 Device %s unmounted.\n"), 
+               dir->fsend(_("3001 Device \"%s\" unmounted.\n"), 
                   dev->print_name());
             }
 
          } else if (dev->blocked() == BST_DOING_ACQUIRE) {
-            dir->fsend(_("3902 Device %s is busy in acquire.\n"), 
+            dir->fsend(_("3902 Device \"%s\" is busy in acquire.\n"), 
                dev->print_name());
 
          } else if (dev->blocked() == BST_WRITING_LABEL) {
-            dir->fsend(_("3903 Device %s is being labeled.\n"), 
+            dir->fsend(_("3903 Device \"%s\" is being labeled.\n"), 
                dev->print_name());
 
          } else if (dev->is_busy()) {
@@ -870,7 +877,7 @@ static bool unmount_cmd(JCR *jcr)
             if (dev->is_unmountable() && !dev->unmount(0)) {
                dir->fsend(_("3907 %s"), dev->bstrerror());
             } else {
-               dir->fsend(_("3002 Device %s unmounted.\n"), 
+               dir->fsend(_("3002 Device \"%s\" unmounted.\n"), 
                   dev->print_name());
             }
          }
@@ -903,7 +910,7 @@ static bool action_on_purge_cmd(JCR *jcr)
 
    char devname[MAX_NAME_LENGTH];
    char volumename[MAX_NAME_LENGTH];
-   int action;
+   int32_t action;
 
    /* TODO: Need to find a free device and ask for slot to the director */
    if (sscanf(dir->msg, 
@@ -941,7 +948,7 @@ static bool release_cmd(JCR *jcr)
    BSOCK *dir = jcr->dir_bsock;
    DEVICE *dev;
    DCR *dcr;
-   int drive;
+   int32_t drive;
 
    if (sscanf(dir->msg, "release %127s drive=%d", devname.c_str(), &drive) == 2) {
       dcr = find_device(jcr, devname, drive);
@@ -953,28 +960,28 @@ static bool release_cmd(JCR *jcr)
                unload_autochanger(dcr, -1);
             }
             Dmsg0(90, "Device already released\n");
-            dir->fsend(_("3921 Device %s already released.\n"), 
+            dir->fsend(_("3921 Device \"%s\" already released.\n"), 
                dev->print_name());
 
          } else if (dev->blocked() == BST_WAITING_FOR_SYSOP) {
             Dmsg2(90, "%d waiter dev_block=%d.\n", dev->num_waiting,
                dev->blocked());
             unload_autochanger(dcr, -1);
-            dir->fsend(_("3922 Device %s waiting for sysop.\n"), 
+            dir->fsend(_("3922 Device \"%s\" waiting for sysop.\n"), 
                dev->print_name());
 
          } else if (dev->blocked() == BST_UNMOUNTED_WAITING_FOR_SYSOP) {
             Dmsg2(90, "%d waiter dev_block=%d. doing unmount\n", dev->num_waiting,
                dev->blocked());
-            dir->fsend(_("3922 Device %s waiting for mount.\n"), 
+            dir->fsend(_("3922 Device \"%s\" waiting for mount.\n"), 
                dev->print_name());
 
          } else if (dev->blocked() == BST_DOING_ACQUIRE) {
-            dir->fsend(_("3923 Device %s is busy in acquire.\n"), 
+            dir->fsend(_("3923 Device \"%s\" is busy in acquire.\n"), 
                dev->print_name());
 
          } else if (dev->blocked() == BST_WRITING_LABEL) {
-            dir->fsend(_("3914 Device %s is being labeled.\n"), 
+            dir->fsend(_("3914 Device \"%s\" is being labeled.\n"), 
                dev->print_name());
 
          } else if (dev->is_busy()) {
@@ -982,7 +989,7 @@ static bool release_cmd(JCR *jcr)
          } else {                     /* device not being used */
             Dmsg0(90, "Device not in use, releasing\n");
             dcr->release_volume();
-            dir->fsend(_("3022 Device %s released.\n"), 
+            dir->fsend(_("3022 Device \"%s\" released.\n"), 
                dev->print_name());
          }
          dev->dunlock();
@@ -1097,7 +1104,7 @@ static bool changer_cmd(JCR *jcr)
          dev = dcr->dev;
          dev->dlock();                 /* Use P to avoid indefinite block */
          if (!dev->device->changer_res) {
-            dir->fsend(_("3995 Device %s is not an autochanger.\n"), 
+            dir->fsend(_("3995 Device \"%s\" is not an autochanger.\n"), 
                dev->print_name());
          /* Under certain "safe" conditions, we can steal the lock */
          } else if (safe_cmd || !dev->is_open() || dev->can_steal_lock()) {
@@ -1114,7 +1121,7 @@ static bool changer_cmd(JCR *jcr)
       }
    } else {  /* error on scanf */
       pm_strcpy(jcr->errmsg, dir->msg);
-      dir->fsend(_("3908 Error scanning autocharger drives/list/slots command: %s\n"),
+      dir->fsend(_("3908 Error scanning autochanger drives/list/slots command: %s\n"),
          jcr->errmsg);
    }
    dir->signal(BNET_EOD);
@@ -1130,8 +1137,7 @@ static bool readlabel_cmd(JCR *jcr)
    BSOCK *dir = jcr->dir_bsock;
    DEVICE *dev;
    DCR *dcr;
-   int Slot;
-   int drive;
+   int32_t Slot, drive;
 
    if (sscanf(dir->msg, "readlabel %127s Slot=%d drive=%d", devname.c_str(), 
        &Slot, &drive) == 3) {
@@ -1189,7 +1195,7 @@ static void read_volume_label(JCR *jcr, DCR *dcr, DEVICE *dev, int Slot)
       Dmsg1(100, "Volume: %s\n", dev->VolHdr.VolumeName);
       break;
    default:
-      dir->fsend(_("3902 Cannot mount Volume on Storage Device %s because:\n%s"),
+      dir->fsend(_("3902 Cannot mount Volume on Storage Device \"%s\" because:\n%s"),
                  dev->print_name(), jcr->errmsg);
       break;
    }
@@ -1217,35 +1223,35 @@ static void send_dir_busy_message(BSOCK *dir, DEVICE *dev)
    if (dev->is_blocked()) {
       switch (dev->blocked()) {
       case BST_UNMOUNTED:
-         dir->fsend(_("3931 Device %s is BLOCKED. user unmounted.\n"),
+         dir->fsend(_("3931 Device \"%s\" is BLOCKED. user unmounted.\n"),
             dev->print_name());
          break;
       case BST_UNMOUNTED_WAITING_FOR_SYSOP:
-         dir->fsend(_("3932 Device %s is BLOCKED. user unmounted during wait for media/mount.\n"),
+         dir->fsend(_("3932 Device \"%s\" is BLOCKED. user unmounted during wait for media/mount.\n"),
              dev->print_name());
          break;
       case BST_WAITING_FOR_SYSOP:
-         dir->fsend(_("3933 Device %s is BLOCKED waiting for media.\n"),
+         dir->fsend(_("3933 Device \"%s\" is BLOCKED waiting for media.\n"),
             dev->print_name());
          break;
       case BST_DOING_ACQUIRE:
-         dir->fsend(_("3934 Device %s is being initialized.\n"),
+         dir->fsend(_("3934 Device \"%s\" is being initialized.\n"),
             dev->print_name());
          break;
       case BST_WRITING_LABEL:
-         dir->fsend(_("3935 Device %s is blocked labeling a Volume.\n"),
+         dir->fsend(_("3935 Device \"%s\" is blocked labeling a Volume.\n"),
             dev->print_name());
          break;
       default:
-         dir->fsend(_("3935 Device %s is blocked for unknown reason.\n"),
+         dir->fsend(_("3935 Device \"%s\" is blocked for unknown reason.\n"),
             dev->print_name());
          break;
       }
    } else if (dev->can_read()) {
-       dir->fsend(_("3936 Device %s is busy reading.\n"),
+       dir->fsend(_("3936 Device \"%s\" is busy reading.\n"),
                    dev->print_name());;
    } else {
-       dir->fsend(_("3937 Device %s is busy with %d writer(s).\n"),
-          dev->print_name(), dev->num_writers);
+       dir->fsend(_("3937 Device \"%s\" is busy with writers=%d reserved=%d.\n"),
+          dev->print_name(), dev->num_writers, dev->num_reserved());
    }
 }