- while(read(f, (char *)&wtmp, sizeof (wtmp)) == sizeof (wtmp)) {
- if (SCMPN(wtmp.ut_line, line+5) || wtmp.ut_name[0]==0)
- continue;
- lseek(f, -(long)sizeof (wtmp), L_INCR);
- SCPYN(wtmp.ut_name, "");
- SCPYN(wtmp.ut_host, "");
- time(&wtmp.ut_time);
- write(f, (char *)&wtmp, sizeof (wtmp));
- found++;
+ fstat(f, &statbf);
+ utmp = (struct utmp *)malloc(statbf.st_size);
+ if (!utmp)
+ syslog(LOG_ERR, "utmp malloc failed");
+ if (statbf.st_size && utmp) {
+ nutmp = read(f, utmp, statbf.st_size);
+ nutmp /= sizeof(struct utmp);
+
+ for (u = utmp ; u < &utmp[nutmp] ; u++) {
+ if (SCMPN(u->ut_line, line+5) ||
+ u->ut_name[0]==0)
+ continue;
+ lseek(f, ((long)u)-((long)utmp), L_SET);
+ SCPYN(u->ut_name, "");
+ SCPYN(u->ut_host, "");
+ time(&u->ut_time);
+ write(f, (char *)u, sizeof(wtmp));
+ found++;
+ }