* 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
*/
/*-
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
#ifndef lint
static const char rcsid[] =
- "$Id: itime.c,v 1.9 2000/01/21 10:17:41 stelian Exp $";
+ "$Id: itime.c,v 1.25 2003/03/30 15:40:36 stelian Exp $";
#endif /* not lint */
+#include <config.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#ifdef __STDC__
+#include <stdlib.h>
+#include <string.h>
+#endif
+
#include <sys/param.h>
#include <sys/time.h>
+#include <time.h>
+#include <fcntl.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 <sys/file.h>
#include <unistd.h>
-#else
-#ifdef sunos
+#elif defined sunos
#include <sys/vnode.h>
#include <ufs/fsdir.h>
#else
#include <ufs/ufs/dinode.h>
#endif
-#endif
#include <protocols/dumprestore.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#ifdef __STDC__
-#include <stdlib.h>
-#include <string.h>
-#endif
-
-#ifdef __linux__
-#include <ext2fs/ext2fs.h>
-#endif
-
#include "dump.h"
-struct dumpdates **ddatev = 0;
-int nddates = 0;
-int ddates_in = 0;
-struct dumptime *dthead = 0;
+struct dumpdates **ddatev;
+int nddates;
+int ddates_in;
+struct dumptime *dthead;
static void dumprecout __P((FILE *, struct dumpdates *));
static int getrecord __P((FILE *, struct dumpdates *));
initdumptimes(int createdumpdates)
{
FILE *df;
+ struct flock lock;
if ((df = fopen(dumpdates, "r")) == NULL) {
if (errno != ENOENT) {
msg("WARNING: no file `%s'\n", dumpdates);
}
if (df != NULL) {
- (void) flock(fileno(df), LOCK_SH);
+ memset(&lock, 0, sizeof(lock));
+ lock.l_type = F_RDLCK;
+ if (fcntl(fileno(df), F_SETLKW, &lock) < 0)
+ quit("cannot set read lock on %s: %s\n",
+ dumpdates, strerror(errno));
readdumptimes(df);
(void) fclose(df);
}
static void
readdumptimes(FILE *df)
{
- register int i;
- register struct dumptime *dtwalk;
+ int i;
+ struct dumptime *dtwalk;
for (;;) {
dtwalk = (struct dumptime *)calloc(1, sizeof (struct dumptime));
void
getdumptime(int createdumpdates)
{
- register struct dumpdates *ddp;
- register int i;
- char *fname;
+ struct dumpdates *ddp;
+ int i;
- fname = disk;
#ifdef FDEBUG
msg("Looking for name %s in dumpdates = %s for level = %c\n",
- fname, dumpdates, level);
+ disk, dumpdates, level);
#endif
spcl.c_ddate = 0;
lastlevel = '0';
* and older date
*/
ITITERATE(i, ddp) {
- if (strncmp(fname, ddp->dd_name, sizeof (ddp->dd_name)) != 0)
+ if (strncmp(disk, ddp->dd_name, sizeof (ddp->dd_name)) != 0)
continue;
if (ddp->dd_level >= level)
continue;
-#ifdef __linux__
if (ddp->dd_ddate <= (time_t)spcl.c_ddate)
-#else
- if (ddp->dd_ddate <= spcl.c_ddate)
-#endif
continue;
spcl.c_ddate = ddp->dd_ddate;
lastlevel = ddp->dd_level;
putdumptime(void)
{
FILE *df;
- register struct dumpdates *dtwalk;
- register int i;
+ struct dumpdates *dtwalk;
+ int i;
int fd;
- char *fname;
+ struct flock lock;
if(uflag == 0)
return;
if ((df = fopen(dumpdates, "r+")) == NULL)
quit("cannot rewrite %s: %s\n", dumpdates, strerror(errno));
fd = fileno(df);
- (void) flock(fd, LOCK_EX);
- fname = disk;
+ memset(&lock, 0, sizeof(lock));
+ lock.l_type = F_WRLCK;
+ if (fcntl(fd, F_SETLKW, &lock) < 0)
+ quit("cannot set write lock on %s: %s\n", dumpdates, strerror(errno));
free((char *)ddatev);
ddatev = 0;
nddates = 0;
quit("fseek: %s\n", strerror(errno));
spcl.c_ddate = 0;
ITITERATE(i, dtwalk) {
- if (strncmp(fname, dtwalk->dd_name,
+ if (strncmp(disk, dtwalk->dd_name,
sizeof (dtwalk->dd_name)) != 0)
continue;
if (dtwalk->dd_level != level)
(struct dumpdates *)calloc(1, sizeof (struct dumpdates));
nddates += 1;
found:
- (void) strncpy(dtwalk->dd_name, fname, sizeof (dtwalk->dd_name));
+ (void) strncpy(dtwalk->dd_name, disk, sizeof (dtwalk->dd_name));
dtwalk->dd_level = level;
dtwalk->dd_ddate = spcl.c_date;
if (ftruncate(fd, ftell(df)))
quit("ftruncate (%s): %s\n", dumpdates, strerror(errno));
(void) fclose(df);
- msg("level %c dump on %s", level,
-#ifdef __linux__
- spcl.c_date == 0 ? "the epoch\n" : ctime4(&spcl.c_date));
-#else
- spcl.c_date == 0 ? "the epoch\n" : ctime(&spcl.c_date));
-#endif
}
static void
dumprecout(FILE *file, struct dumpdates *what)
{
-
- if (fprintf(file, "%s %c %s",
+ char buf[26];
+ struct tm *tms;
+
+ tms = localtime(&what->dd_ddate);
+ strncpy(buf, asctime(tms), sizeof(buf));
+ if (buf[24] != '\n' || buf[25] != '\0')
+ quit("asctime returned an unexpected string\n");
+ buf[24] = 0;
+ if (fprintf(file, "%s %c %s %c%2.2d%2.2d\n",
what->dd_name,
what->dd_level,
- ctime(&what->dd_ddate)) < 0)
+ buf,
+ (tms->tm_gmtoff < 0 ? '-' : '+'),
+ abs(tms->tm_gmtoff) / 3600,
+ abs(tms->tm_gmtoff) % 3600 / 60) < 0)
quit("%s: %s\n", dumpdates, strerror(errno));
}
/* device name */
if ( NULL == (tok = strsep( &tbuf, " ")) )
return(-1);
- if ( strlen(tok) > NAME_MAX )
+ if ( strlen(tok) > MAXPATHLEN )
return(-1);
strcpy(ddp->dd_name, tok);
ddp->dd_ddate = unctime(tbuf);
if (ddp->dd_ddate < 0)
return(-1);
+ /* fstab entry */
+ ddp->dd_fstab = fstabsearch(ddp->dd_name);
return(0);
}