initfdpos
,
initFILEpos
, adjfdpos
,
adjFILEpos
— file positions
indicator handling
#include <stdio.h>
#include <strfunc.h>
int
initfdpos
(const
char *fname, int
stream, const char
*ext);
int
initFILEpos
(const
char *fname, FILE
*stream, const char
*ext);
int
adjfdpos
(int
stream, int posfd,
int doSync);
int
adjFILEpos
(FILE
*stream, int posfd,
int doSync);
Those functions are used to maintain a file positions indicator
between the program sessions. This is often needed when a process is being
parsed a log file and tries to save current position within this log to
start from this point later.
int
initfdpos
(const
char *fname, int stream, const
char *ext) creates a position indicator file
"<fname>.<ext>", and returns its file descriptor. If
the position file is already exists, then it advances
stream's
position according to the information derived from that file.
initfdpos
also checks the file size and inode
changes in order to be robust in situations when file shrinked or
replaced.
int
initFILEpos
()
is almost the same except that it takes a
FILE *
argument instead of plain file descriptor.
Both functions returns position file descriptor, or -1 in case of
failure.
int
adjfdpos
(int
stream, int posfd, int
doSync) and
adFILEdpos
()
writes the current position within the file referenced by
stream
into the
posfd.
If
doSync
is not zero, it also does
fsync(2).
Return values: 0 (Success) or -1 in case of any errors.
void main() {
int posfd;
FILE *logfile;
char buf[1042];
logfile = fopen("file.log", "r");
if(!logfile)
exit(EX_NOINPUT);
while(fgets(buf, sizeof(buf), logfile)) {
/* Do something ... */
adjFILEpos(logfile, posfd, 0);
};
/* Force data to be flushed on disk. */
adjFILEpos(logfile, posfd, 1);
fclose(logfile);
close(posfd);
};
Lev Walkin <vlm@lionet.info>