char *job_name, *level_name, *jid, *store_name, *pool_name;
char *where, *fileset_name, *client_name, *bootstrap;
const char *replace;
- char *when, *verify_job_name;
+ char *when, *verify_job_name, *catalog_name;
int Priority = 0;
int i, j, opt, files = 0;
bool kw_ok;
N_("yes"), /* 14 -- if you change this change YES_POS too */
N_("verifyjob"), /* 15 */
N_("files"), /* 16 number of files to restore */
+ N_("catalog"), /* 17 override catalog */
NULL};
#define YES_POS 14
bootstrap = NULL;
replace = NULL;
verify_job_name = NULL;
+ catalog_name = NULL;
for (i=1; i<ua->argc; i++) {
Dmsg2(200, "Doing arg %d = %s\n", i, ua->argk[i]);
kw_ok = true;
break;
+ case 17: /* catalog */
+ catalog_name = ua->argv[i];
+ kw_ok = true;
+ break;
+
default:
break;
}
Dmsg0(200, "Done scan.\n");
+ CAT *catalog = NULL;
+ if (catalog_name != NULL) {
+ catalog = (CAT *)GetResWithName(R_CATALOG, catalog_name);
+ if (catalog == NULL) {
+ bsendmsg(ua, _("Catalog \"%s\" not found\n"), catalog_name);
+ return 1;
+ }
+ }
+
if (job_name) {
/* Find Job */
job = (JOB *)GetResWithName(R_JOB, job_name);
jcr->fileset = fileset;
jcr->pool = pool;
jcr->ExpectedFiles = files;
+ if (catalog != NULL) {
+ jcr->catalog = catalog;
+ }
if (where) {
if (jcr->where) {
free(jcr->where);
jcr->JobLevel = L_FULL; /* default level */
Dmsg1(20, "JobId to restore=%d\n", jcr->RestoreJobId);
if (jcr->RestoreJobId == 0) {
- bsendmsg(ua, _("Run Restore job\n\
-JobName: %s\n\
-Bootstrap: %s\n\
-Where: %s\n\
-Replace: %s\n\
-FileSet: %s\n\
-Client: %s\n\
-Storage: %s\n\
-When: %s\n\
-Priority: %d\n"),
+ bsendmsg(ua, _("Run Restore job\n"
+ "JobName: %s\n"
+ "Bootstrap: %s\n"
+ "Where: %s\n"
+ "Replace: %s\n"
+ "FileSet: %s\n"
+ "Client: %s\n"
+ "Storage: %s\n"
+ "When: %s\n"
+ "Catalog: %s\n"
+ "Priority: %d\n"),
job->hdr.name,
NPRT(jcr->RestoreBootstrap),
jcr->where?jcr->where:NPRT(job->RestoreWhere),
jcr->client->hdr.name,
jcr->store->hdr.name,
bstrutime(dt, sizeof(dt), jcr->sched_time),
+ jcr->catalog->hdr.name,
jcr->JobPriority);
} else {
- bsendmsg(ua, _("Run Restore job\n\
-JobName: %s\n\
-Bootstrap: %s\n\
-Where: %s\n\
-Replace: %s\n\
-Client: %s\n\
-Storage: %s\n\
-JobId: %s\n\
-When: %s\n\
-Priority: %d\n"),
+ bsendmsg(ua, _("Run Restore job\n"
+ "JobName: %s\n"
+ "Bootstrap: %s\n"
+ "Where: %s\n"
+ "Replace: %s\n"
+ "FileSet: %s\n"
+ "Client: %s\n"
+ "Storage: %s\n"
+ "JobId: %s\n"
+ "When: %s\n"
+ "Catalog: %s\n"
+ "Priority: %d\n"),
job->hdr.name,
NPRT(jcr->RestoreBootstrap),
jcr->where?jcr->where:NPRT(job->RestoreWhere),
jcr->store->hdr.name,
jcr->RestoreJobId==0?"*None*":edit_uint64(jcr->RestoreJobId, ec1),
bstrutime(dt, sizeof(dt), jcr->sched_time),
+ jcr->catalog->hdr.name,
jcr->JobPriority);
}
break;
Dmsg3(29, "open_dev: tape=%d dev_name=%s vol=%s\n", dev_is_tape(dev),
dev->dev_name, dev->VolCatInfo.VolCatName);
dev->state &= ~(ST_LABEL|ST_APPEND|ST_READ|ST_EOT|ST_WEOT|ST_EOF);
+ dev->file_size = 0;
if (dev->state & (ST_TAPE|ST_FIFO)) {
int timeout;
Dmsg0(29, "open_dev: device is tape\n");
}
/* If busy retry each second for max_open_wait seconds */
while ((dev->fd = open(dev->dev_name, dev->mode, MODE_RW)) < 0) {
+ berrno be;
if (errno == EINTR || errno == EAGAIN) {
continue;
}
if (errno == EBUSY && timeout-- > 0) {
- Dmsg2(100, "Device %s busy. ERR=%s\n", dev->dev_name, strerror(errno));
+ Dmsg2(100, "Device %s busy. ERR=%s\n", dev->dev_name, be.strerror());
bmicrosleep(1, 0);
continue;
}
dev->dev_errno = errno;
Mmsg2(&dev->errmsg, _("stored: unable to open device %s: ERR=%s\n"),
- dev->dev_name, strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
/* Stop any open timer we set */
if (dev->tid) {
stop_thread_timer(dev->tid);
}
/* If creating file, give 0640 permissions */
if ((dev->fd = open(archive_name, dev->mode, 0640)) < 0) {
+ berrno be;
dev->dev_errno = errno;
- Mmsg2(&dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name, strerror(dev->dev_errno));
+ Mmsg2(&dev->errmsg, _("Could not open: %s, ERR=%s\n"), archive_name, be.strerror());
Emsg0(M_FATAL, 0, dev->errmsg);
} else {
dev->dev_errno = 0;
}
dev->state &= ~(ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
dev->block_num = dev->file = 0;
+ dev->file_size = 0;
dev->file_addr = 0;
if (dev->state & ST_TAPE) {
mt_com.mt_op = MTREW;
for (i=dev->max_rewind_wait; ; i -= 5) {
if (ioctl(dev->fd, MTIOCTOP, (char *)&mt_com) < 0) {
berrno be;
+ clrerror_dev(dev, MTREW);
if (i == dev->max_rewind_wait) {
- Dmsg1(200, "Rewind error, %s. retrying ...\n", strerror(errno));
+ Dmsg1(200, "Rewind error, %s. retrying ...\n", be.strerror());
}
- clrerror_dev(dev, MTREW);
if (dev->dev_errno == EIO && i > 0) {
Dmsg0(200, "Sleeping 5 seconds.\n");
bmicrosleep(5, 0);
continue;
}
Mmsg2(&dev->errmsg, _("Rewind error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
return false;
}
break;
berrno be;
dev->dev_errno = errno;
Mmsg2(&dev->errmsg, _("lseek error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
return false;
}
}
}
dev->state &= ~(ST_EOF); /* remove EOF flags */
dev->block_num = dev->file = 0;
+ dev->file_size = 0;
dev->file_addr = 0;
if (dev->state & (ST_FIFO | ST_PROG)) {
return 1;
dev->dev_errno = errno;
berrno be;
Mmsg2(&dev->errmsg, _("lseek error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
return 0;
}
#ifdef MTEOM
if ((stat=ioctl(dev->fd, MTIOCTOP, (char *)&mt_com)) < 0) {
berrno be;
clrerror_dev(dev, mt_com.mt_op);
- Dmsg1(50, "ioctl error: %s\n", be.strerror(dev->dev_errno));
+ Dmsg1(50, "ioctl error: %s\n", be.strerror());
update_pos_dev(dev);
Mmsg2(&dev->errmsg, _("ioctl MTEOM error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
return 0;
}
berrno be;
clrerror_dev(dev, -1);
Mmsg2(&dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
return 0;
}
Dmsg2(100, "EOD file=%d block=%d\n", mt_stat.mt_fileno, mt_stat.mt_blkno);
dev->file_addr = 0;
pos = lseek(dev->fd, (off_t)0, SEEK_CUR);
if (pos < 0) {
- Pmsg1(000, "Seek error: ERR=%s\n", strerror(dev->dev_errno));
+ berrno be;
dev->dev_errno = errno;
+ Pmsg1(000, "Seek error: ERR=%s\n", be.strerror());
Mmsg2(&dev->errmsg, _("lseek error on %s. ERR=%s.\n"),
- dev->dev_name, strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
ok = false;
} else {
dev->file_addr = pos;
berrno be;
dev->dev_errno = errno;
Mmsg2(&dev->errmsg, _("ioctl MTIOCGET error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
return 0;
}
Dmsg0(-20, " Device status:");
berrno be;
dev->dev_errno = ENOTTY; /* function not available */
Mmsg2(&dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno)); return 0;
+ dev->dev_name, be.strerror());
return false;
#else
dev->block_num = dev->file = 0;
+ dev->file_size = 0;
dev->file_addr = 0;
mt_com.mt_op = MTLOAD;
mt_com.mt_count = 1;
berrno be;
dev->dev_errno = errno;
Mmsg2(&dev->errmsg, _("ioctl MTLOAD error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno)); return 0;
+ dev->dev_name, be.strerror());
return false;
}
return true;
dev->state &= ~(ST_APPEND|ST_READ|ST_EOT|ST_EOF|ST_WEOT); /* remove EOF/EOT flags */
dev->block_num = dev->file = 0;
+ dev->file_size = 0;
dev->file_addr = 0;
#ifdef MTUNLOCK
mt_com.mt_op = MTUNLOCK;
berrno be;
dev->dev_errno = errno;
Mmsg2(&dev->errmsg, _("ioctl MTOFFL error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
return false;
}
Dmsg1(100, "Offlined device %s\n", dev->dev_name);
dev->file = mt_stat.mt_fileno;
dev->state |= ST_EOF; /* just read EOF */
dev->file_addr = 0;
+ dev->file_size = 0;
return true;
/*
Dmsg2(200, "Set ST_EOT read errno=%d. ERR=%s\n", dev->dev_errno,
be.strerror());
Mmsg2(dev->errmsg, _("read error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
Dmsg1(200, "%s", dev->errmsg);
break;
}
dev->state |= ST_EOF;
dev->file++;
dev->file_addr = 0;
+ dev->file_size = 0;
continue;
}
} else { /* Got data */
Dmsg0(200, "Set ST_EOT\n");
clrerror_dev(dev, MTFSF);
Mmsg2(&dev->errmsg, _("ioctl MTFSF error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
Dmsg0(200, "Got < 0 for MTFSF\n");
Dmsg1(200, "%s", dev->errmsg);
} else {
dev->state |= ST_EOF; /* just read EOF */
dev->file++;
dev->file_addr = 0;
+ dev->file_size = 0;
}
}
free_memory(rbuf);
dev->state &= ~(ST_EOT|ST_EOF);
dev->file -= num;
dev->file_addr = 0;
+ dev->file_size = 0;
mt_com.mt_op = MTBSF;
mt_com.mt_count = num;
stat = ioctl(dev->fd, MTIOCTOP, (char *)&mt_com);
berrno be;
clrerror_dev(dev, MTBSF);
Mmsg2(dev->errmsg, _("ioctl MTBSF error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
}
update_pos_dev(dev);
return stat == 0;
dev->file++;
dev->block_num = 0;
dev->file_addr = 0;
+ dev->file_size = 0;
}
}
Mmsg2(dev->errmsg, _("ioctl MTFSR error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
}
update_pos_dev(dev);
return stat == 0;
berrno be;
clrerror_dev(dev, MTBSR);
Mmsg2(dev->errmsg, _("ioctl MTBSR error on %s. ERR=%s.\n"),
- dev->dev_name, be.strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
}
update_pos_dev(dev);
return stat == 0;
off_t pos = (((off_t)file)<<32) + block;
Dmsg1(100, "===== lseek to %d\n", (int)pos);
if (lseek(dev->fd, pos, SEEK_SET) == (off_t)-1) {
+ berrno be;
dev->dev_errno = errno;
Mmsg2(dev->errmsg, _("lseek error on %s. ERR=%s.\n"),
- dev->dev_name, strerror(dev->dev_errno));
+ dev->dev_name, be.strerror());
return false;
}
dev->file = file;
Emsg0(M_FATAL, 0, dev->errmsg);
return -1;
}
+ dev->file_size = 0;
if (!(dev_state(dev, ST_TAPE))) {
return 0;
dev->fd = -1;
dev->state &= ~(ST_OPENED|ST_LABEL|ST_READ|ST_APPEND|ST_EOT|ST_WEOT|ST_EOF);
dev->file = dev->block_num = 0;
+ dev->file_size = 0;
dev->file_addr = 0;
dev->EndFile = dev->EndBlock = 0;
memset(&dev->VolCatInfo, 0, sizeof(dev->VolCatInfo));
/* maybe we should rewind and write and eof ???? */
}
if (ftruncate(dev->fd, 0) != 0) {
- Mmsg1(&dev->errmsg, _("Unable to truncate device. ERR=%s\n"), strerror(errno));
+ berrno be;
+ Mmsg1(&dev->errmsg, _("Unable to truncate device. ERR=%s\n"), be.strerror());
return false;
}
return true;
}
return;
#endif
-
}