X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=dump%2Fitime.c;h=6f59a8502979bdd48993cc8188419265068bf03d;hp=da968db3423641521bef681acdbe4daa232ceac8;hb=e1abc9ce25132eef1239047a071c2c1d4822dd9f;hpb=11856e771fadee7ddb9b5a613c91f562bf363da7 diff --git a/dump/itime.c b/dump/itime.c index da968db..6f59a85 100644 --- a/dump/itime.c +++ b/dump/itime.c @@ -18,11 +18,7 @@ * 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. * @@ -41,7 +37,7 @@ #ifndef lint static const char rcsid[] = - "$Id: itime.c,v 1.21 2002/01/16 09:32:14 stelian Exp $"; + "$Id: itime.c,v 1.25 2003/03/30 15:40:36 stelian Exp $"; #endif /* not lint */ #include @@ -56,6 +52,7 @@ static const char rcsid[] = #include #include #include +#include #ifdef __linux__ #ifdef HAVE_EXT2FS_EXT2_FS_H #include @@ -94,6 +91,7 @@ void initdumptimes(int createdumpdates) { FILE *df; + struct flock lock; if ((df = fopen(dumpdates, "r")) == NULL) { if (errno != ENOENT) { @@ -122,7 +120,11 @@ initdumptimes(int createdumpdates) 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); } @@ -131,8 +133,8 @@ initdumptimes(int createdumpdates) 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)); @@ -158,8 +160,8 @@ readdumptimes(FILE *df) void getdumptime(int createdumpdates) { - register struct dumpdates *ddp; - register int i; + struct dumpdates *ddp; + int i; #ifdef FDEBUG msg("Looking for name %s in dumpdates = %s for level = %c\n", @@ -197,16 +199,20 @@ void putdumptime(void) { FILE *df; - register struct dumpdates *dtwalk; - register int i; + struct dumpdates *dtwalk; + int i; int fd; + 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); + 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; @@ -249,11 +255,21 @@ putdumptime(void) static void dumprecout(FILE *file, struct dumpdates *what) { + char buf[26]; + struct tm *tms; - if (fprintf(file, "%s %c %s", + 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)); }