* Ported to Linux's Second Extended File System as part of the
* dump and restore backup suit
* Remy Card <card@Linux.EU.Org>, 1994-1997
- * Stelian Pop <pop@cybercable.fr>, 1999-2000
+ * Stelian Pop <stelian@popies.net>, 1999-2000
+ * Stelian Pop <stelian@popies.net> - AlcĂ´ve <www.alcove.com>, 2000-2002
*/
/*-
#ifndef lint
static const char rcsid[] =
- "$Id: optr.c,v 1.12 2000/11/10 11:48:31 stelian Exp $";
+ "$Id: optr.c,v 1.32 2002/07/19 14:57:39 stelian Exp $";
#endif /* not lint */
+#include <config.h>
#include <sys/param.h>
#include <sys/wait.h>
#include <sys/time.h>
+#include <time.h>
#include <errno.h>
#include <fstab.h>
#include <sys/stat.h>
#ifdef __linux__
+#ifdef HAVE_EXT2FS_EXT2_FS_H
+#include <ext2fs/ext2_fs.h>
+#else
#include <linux/ext2_fs.h>
+#endif
#include <ext2fs/ext2fs.h>
#include <bsdcompat.h>
#include <signal.h>
FILE *mytty;
time_t firstprompt, when_answered;
-#ifdef __linux__
- (void)time4(&(firstprompt));
-#else
- (void)time((time_t *)&(firstprompt));
-#endif
+ if (qflag) {
+ msg("%s - forced abort\n", question);
+ dumpabort(0);
+ /* NOTREACHED */
+ }
+
+ firstprompt = time(NULL);
if ((mytty = fopen(_PATH_TTY, "r")) == NULL)
quit("fopen on %s fails: %s\n", _PATH_TTY, strerror(errno));
if (signal(SIGALRM, sig) == SIG_IGN)
signal(SIGALRM, SIG_IGN);
(void) fclose(mytty);
-#ifdef __linux__
- (void)time4(&(when_answered));
-#else
- (void)time((time_t *)&(when_answered));
-#endif
+ when_answered = time(NULL);
/*
* Adjust the base for time estimates to ignore time we spent waiting
* for operator input.
*/
- if ((tstart_writing != 0) && (when_answered != (time_t)-1) && (firstprompt != (time_t)-1))
+ if (tstart_writing != 0)
tstart_writing += (when_answered - firstprompt);
return(back);
}
* sleep for 2 minutes in case nobody comes to satisfy dump
*/
static void
-alarmcatch(int signo)
+alarmcatch(UNUSED(int signo))
{
int save_errno = errno;
if (notify == 0) {
* Here if an inquisitive operator interrupts the dump program
*/
void
-interrupt(int signo)
+interrupt(UNUSED(int signo))
{
msg("Interrupt received.\n");
if (query("Do you want to abort dump?"))
return;
}
- clock = time((time_t *)0);
+ clock = time(NULL);
localclock = localtime(&clock);
if ((f_utmp = fopen(_PATH_UTMP, "r")) == NULL) {
sendmes(const char *tty, const char *message)
{
char t[MAXPATHLEN], buf[BUFSIZ];
- register const char *cp;
+ const char *cp;
int lmsg = 1;
FILE *f_tty;
void
timeest(void)
{
- time_t tnow, deltat;
+ time_t tnow = time(NULL);
-#ifdef __linux__
- (void) time4(&tnow);
-#else
- (void) time((time_t *) &tnow);
-#endif
if (tnow >= tschedule) {
+ char *buf = mktimeest(tnow);
tschedule = tnow + 300;
- if (blockswritten < 500)
- return;
- if (blockswritten > tapesize)
- tapesize = blockswritten;
- deltat = tstart_writing - tnow +
- (1.0 * (tnow - tstart_writing))
- / blockswritten * tapesize;
- msg("%3.2f%% done, finished in %d:%02d\n",
- (blockswritten * 100.0) / tapesize,
- deltat / 3600, (deltat % 3600) / 60);
+ if (buf) {
+ fprintf(stderr, " DUMP: ");
+ fwrite(buf, strlen(buf), 1, stderr);
+ fflush(stderr);
+ }
}
}
static struct fstab *
allocfsent(struct fstab *fs)
{
- register struct fstab *new;
+ struct fstab *new;
new = (struct fstab *)malloc(sizeof (*fs));
if (new == NULL)
struct fstab *
fstabsearch(const char *key)
{
- register struct pfstab *pf;
- register struct fstab *fs;
- char *rn;
+ struct pfstab *pf;
+ struct fstab *fs;
+ const char *rn;
for (pf = table; pf != NULL; pf = pf->pf_next) {
fs = pf->pf_fstab;
struct fstab *
fstabsearchdir(const char *key, char *directory)
{
- register struct pfstab *pf;
- register struct fstab *fs;
- register struct fstab *found_fs = NULL;
+ struct pfstab *pf;
+ struct fstab *fs;
+ struct fstab *found_fs = NULL;
unsigned int size = 0;
struct stat buf;
for (pf = table; pf != NULL; pf = pf->pf_next) {
fs = pf->pf_fstab;
if (strlen(fs->fs_file) > size &&
- strlen(key) > strlen(fs->fs_file) + 1 &&
+ strlen(key) > strlen(fs->fs_file) &&
strncmp(fs->fs_file, key, strlen(fs->fs_file)) == 0 &&
(key[strlen(fs->fs_file)] == '/' ||
fs->fs_file[strlen(fs->fs_file) - 1] == '/')) {
print_wmsg(char arg, int dumpme, const char *dev, int level,
const char *mtpt, time_t ddate)
{
- char *date;
-
- if (ddate)
- date = (char *)ctime(&ddate);
- //date[16] = '\0'; /* blast away seconds and year */
-
+#ifdef FDEBUG
+ printf("checking dev %s: lvl %d, mtpt %s\n", dev, level, mtpt);
+#endif
if (!dumpme && arg == 'w')
return;
dev,
mtpt ? mtpt : "");
- if (ddate)
- printf(" Level %c, Date %s\n",
- level, date);
- else
- printf(" never\n");
+ /*
+ * Check ddate > 365 to avoid issues with fs in stab but not dumpdates.
+ * Not a problem, because ddate is in seconds since the epoch anyways.
+ */
+ if (ddate > 365) {
+ char *date, *d;
+
+ date = (char *)ctime(&ddate);
+ d = strchr(date, '\n');
+ if (d) *d = '\0';
+ printf("Level %c, Date %s\n", level, date);
+ } else
+ printf("never\n");
}
/*
struct pfstab *pf;
time_t tnow;
- (void) time(&tnow);
+ tnow = time(NULL);
getfstab(); /* /etc/fstab input */
initdumptimes(0); /* dumpdates input */
if (ddatev == NULL && table == NULL) {
else
(void) printf("Last dump(s) done (Dump '>' file systems):\n");
+ /* For files in dumpdates, get the last dump level and date */
if (ddatev != NULL) {
struct dumpdates *dtwalk = NULL;
int i;
sizeof(dtwalk->dd_name)) == 0)
continue;
lastname = dtwalk->dd_name;
- if ((dt = dtwalk->dd_fstab) != NULL &&
- dt->fs_freq != 0) {
+ if ((dt = dtwalk->dd_fstab) != NULL) {
/* Overload fs_freq as dump level and
* fs_passno as date, because we can't
* change struct fstab format.
- * A negative fs_freq means this
+ * A positive fs_freq means this
* filesystem needs to be dumped.
*/
dt->fs_passno = dtwalk->dd_ddate;
- if (dtwalk->dd_ddate <
- tnow - (dt->fs_freq * 86400))
- dt->fs_freq = -dtwalk->dd_level;
- else
+ if (dt->fs_freq > 0 && (dtwalk->dd_ddate <
+ tnow - (dt->fs_freq * 86400)))
dt->fs_freq = dtwalk->dd_level;
-
+ else
+ dt->fs_freq = -dtwalk->dd_level;
+#ifdef FDEBUG
+ printf("%s fs_freq set to %d\n", lastname,
+ dt->fs_freq);
+#endif
}
}
}
if (strncmp(dt->fs_vfstype, *type,
sizeof(dt->fs_vfstype)) == 0) {
const char *disk = get_device_name(dt->fs_spec);
- print_wmsg(arg, dt->fs_freq < 0 || !dt->fs_passno,
+ print_wmsg(arg, dt->fs_freq > 0,
disk ? disk : dt->fs_spec,
- dt->fs_freq < 0 ? -dt->fs_freq : dt->fs_freq,
+ dt->fs_freq < 0 ? -dt->fs_freq :
+ dt->fs_freq,
dt->fs_file,
dt->fs_passno);
}