home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
mint
/
mntlib16.lzh
/
MNTLIB16
/
UTMP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-03
|
2KB
|
73 lines
/*
* BSD style utmp updating routine Version 1.0 (c) S.R.Usher 1991.
*/
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <utmp.h>
#define UTMP_FILE "/etc/utmp"
void write_utmp(line, name, host, time)
char *line;
char *name;
char *host;
unsigned long time;
{
register int returned_val;
int counter;
struct utmp entry;
int fd;
bzero(&entry, sizeof(struct utmp));
if ((fd = open(UTMP_FILE, O_RDWR)) == -1)
{
perror("write_utmp");
return;
}
for (counter = 0; ((returned_val = read(fd, &entry, sizeof(struct utmp))) != -1); counter++)
{
#ifdef DEBUG
printf("Current line is '%s' (returned_val = %d)\n", entry.ut_line, returned_val);
#endif
if (returned_val == 0)
break;
if (strncmp(line, entry.ut_line, 8) == 0)
break;
}
if (lseek(fd, (counter * sizeof(struct utmp)), 0) == -1)
{
perror("write_utmp: lseek");
close(fd);
return;
}
/*
* Note, doing this in this order means that it doesn't matter about the Null
* bytes strncpy adds the the strings if they are greater than 8/16 bytes!
*/
#ifdef DEBUG
printf("counter = %d\nline = %s\nname = %s\nhost = %s\ntime = %lu\n",
counter, line, name, host, time);
#endif
strncpy(entry.ut_line, line, 8);
strncpy(entry.ut_name, name, 8);
strncpy(entry.ut_host, host, 16);
entry.ut_time = time;
if ((returned_val = write(fd, &entry, sizeof(struct utmp))) == -1)
perror("write_utmp: write");
else
if (returned_val != sizeof(struct utmp))
fprintf(stderr, "write_utmp: write: wrote too few bytes!\n");
#ifdef DEBUG
printf("write_utmp: wrote %d bytes\n", returned_val);
#endif
close(fd);
}