- device_name_len = strlen(storage->dev_name) + 1;
- media_type_len = strlen(storage->media_type) + 1;
- pool_type_len = strlen(jcr->pool->pool_type) + 1;
- pool_name_len = strlen(jcr->pool->hdr.name) + 1;
- device_name = (char *) get_memory(device_name_len);
- pool_name = (char *) get_memory(pool_name_len);
- pool_type = (char *) get_memory(pool_type_len);
- media_type = (char *) get_memory(media_type_len);
- memcpy(device_name, storage->dev_name, device_name_len);
- memcpy(media_type, storage->media_type, media_type_len);
- memcpy(pool_type, jcr->pool->pool_type, pool_type_len);
- memcpy(pool_name, jcr->pool->hdr.name, pool_name_len);
- bash_spaces(device_name);
- bash_spaces(media_type);
- bash_spaces(pool_type);
- bash_spaces(pool_name);
- sd->msg = check_pool_memory_size(sd->msg, sizeof(device_name) +
- device_name_len + media_type_len + pool_type_len + pool_name_len);
- bnet_fsend(sd, use_device, device_name, media_type, pool_name, pool_type);
- Dmsg1(110, ">stored: %s", sd->msg);
- status = response(sd, OK_device, "Use Device");
-
- free_memory(device_name);
- free_memory(media_type);
- free_memory(pool_name);
- free_memory(pool_type);
-
- return status;
+ /* Do read side of storage daemon */
+ if (ok && rstore) {
+ /* For the moment, only migrate has rpool */
+ if (jcr->JobType == JT_MIGRATE) {
+ pm_strcpy(pool_type, jcr->rpool->pool_type);
+ pm_strcpy(pool_name, jcr->rpool->name());
+ } else {
+ pm_strcpy(pool_type, jcr->pool->pool_type);
+ pm_strcpy(pool_name, jcr->pool->name());
+ }
+ bash_spaces(pool_type);
+ bash_spaces(pool_name);
+ foreach_alist(storage, rstore) {
+ Dmsg1(100, "Rstore=%s\n", storage->name());
+ bash_spaces(store_name);
+ pm_strcpy(media_type, storage->media_type);
+ bash_spaces(media_type);
+ sd->fsend(use_storage, store_name.c_str(), media_type.c_str(),
+ pool_name.c_str(), pool_type.c_str(), 0, copy, stripe);
+ Dmsg1(100, "rstore >stored: %s", sd->msg);
+ DEVICE *dev;
+ /* Loop over alternative storage Devices until one is OK */
+ foreach_alist(dev, storage->device) {
+ pm_strcpy(device_name, dev->name());
+ bash_spaces(device_name);
+ sd->fsend(use_device, device_name.c_str());
+ Dmsg1(100, ">stored: %s", sd->msg);
+ }
+ sd->signal(BNET_EOD); /* end of Devices */
+ }
+ sd->signal(BNET_EOD); /* end of Storages */
+ if (bget_dirmsg(sd) > 0) {
+ Dmsg1(100, "<stored: %s", sd->msg);
+ /* ****FIXME**** save actual device name */
+ ok = sscanf(sd->msg, OK_device, device_name.c_str()) == 1;
+ } else {
+ ok = false;
+ }
+ }
+
+ /* Do write side of storage daemon */
+ if (ok && wstore) {
+ pm_strcpy(pool_type, jcr->pool->pool_type);
+ pm_strcpy(pool_name, jcr->pool->name());
+ bash_spaces(pool_type);
+ bash_spaces(pool_name);
+ foreach_alist(storage, wstore) {
+ pm_strcpy(store_name, storage->name());
+ bash_spaces(store_name);
+ pm_strcpy(media_type, storage->media_type);
+ bash_spaces(media_type);
+ sd->fsend(use_storage, store_name.c_str(), media_type.c_str(),
+ pool_name.c_str(), pool_type.c_str(), 1, copy, stripe);
+
+ Dmsg1(100, "wstore >stored: %s", sd->msg);
+ DEVICE *dev;
+ /* Loop over alternative storage Devices until one is OK */
+ foreach_alist(dev, storage->device) {
+ pm_strcpy(device_name, dev->name());
+ bash_spaces(device_name);
+ sd->fsend(use_device, device_name.c_str());
+ Dmsg1(100, ">stored: %s", sd->msg);
+ }
+ sd->signal(BNET_EOD); /* end of Devices */
+ }
+ sd->signal(BNET_EOD); /* end of Storages */
+ if (bget_dirmsg(sd) > 0) {
+ Dmsg1(100, "<stored: %s", sd->msg);
+ /* ****FIXME**** save actual device name */
+ ok = sscanf(sd->msg, OK_device, device_name.c_str()) == 1;
+ } else {
+ ok = false;
+ }
+ }
+ if (!ok) {
+ POOL_MEM err_msg;
+ if (sd->msg[0]) {
+ pm_strcpy(err_msg, sd->msg); /* save message */
+ Jmsg(jcr, M_FATAL, 0, _("\n"
+ " Storage daemon didn't accept Device \"%s\" because:\n %s"),
+ device_name.c_str(), err_msg.c_str()/* sd->msg */);
+ } else {
+ Jmsg(jcr, M_FATAL, 0, _("\n"
+ " Storage daemon didn't accept Device \"%s\" command.\n"),
+ device_name.c_str());
+ }
+ } else {
+ Jmsg(jcr, M_INFO, 0, _("Using Device \"%s\"\n"), device_name.c_str());
+ }
+ return ok;