svn commit: r202177 - user/ed/utmpx/lib/libc/gen
Ed Schouten
ed at FreeBSD.org
Tue Jan 12 22:06:54 UTC 2010
Author: ed
Date: Tue Jan 12 22:06:53 2010
New Revision: 202177
URL: http://svn.freebsd.org/changeset/base/202177
Log:
Several improvements to the handling of the utmpx files.
- Just use O_EXLOCK instead of calling lockf() by hand. This will
already provide exclusive file access.
- Let the functions use stdio instead of operating on the file
descriptors directly. When utmp and lastlogin files get a bit bigger,
it will read chunks of 4K instead of 197 bytes at a time.
Modified:
user/ed/utmpx/lib/libc/gen/pututxline.c
Modified: user/ed/utmpx/lib/libc/gen/pututxline.c
==============================================================================
--- user/ed/utmpx/lib/libc/gen/pututxline.c Tue Jan 12 21:45:03 2010 (r202176)
+++ user/ed/utmpx/lib/libc/gen/pututxline.c Tue Jan 12 22:06:53 2010 (r202177)
@@ -31,35 +31,43 @@ __FBSDID("$FreeBSD$");
#include <sys/endian.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <utmpx.h>
#include "utxdb.h"
#include "un-namespace.h"
-static int
+static FILE *
futx_open(const char *file)
{
int fd;
+ FILE *fp;
struct stat sb;
- fd = _open(file, O_CREAT|O_RDWR, 0644);
+ fd = _open(file, O_CREAT|O_RDWR|O_EXLOCK, 0644);
if (fd < 0)
- return (-1);
+ return (NULL);
/* Safety check: never use broken files. */
if (_fstat(fd, &sb) != -1 && sb.st_size % sizeof(struct futx) != 0) {
_close(fd);
- return (-1);
+ return (NULL);
+ }
+
+ fp = fdopen(fd, "r+");
+ if (fp == NULL) {
+ _close(fd);
+ return (NULL);
}
- return (fd);
+ return (fp);
}
static void
utx_active_add(const struct futx *fu)
{
- int fd;
+ FILE *fp;
struct futx fe;
off_t partial = -1;
@@ -67,14 +75,10 @@ utx_active_add(const struct futx *fu)
* Register user login sessions. Overwrite entries of sessions
* that have already been terminated.
*/
- fd = futx_open(_PATH_UTX_ACTIVE);
- if (fd < 0)
- return;
- if (lockf(fd, F_LOCK, 0) == -1) {
- _close(fd);
+ fp = futx_open(_PATH_UTX_ACTIVE);
+ if (fp == NULL)
return;
- }
- while (_read(fd, &fe, sizeof fe) == sizeof fe) {
+ while (fread(&fe, sizeof fe, 1, fp) == 1) {
switch (fe.fu_type) {
case USER_PROCESS:
case INIT_PROCESS:
@@ -82,7 +86,7 @@ utx_active_add(const struct futx *fu)
case DEAD_PROCESS:
/* Overwrite when ut_id matches. */
if (memcmp(fu->fu_id, fe.fu_id, sizeof fe.fu_id) == 0) {
- lseek(fd, -sizeof fe, SEEK_CUR);
+ fseeko(fp, -sizeof fe, SEEK_CUR);
goto exact;
}
if (fe.fu_type != DEAD_PROCESS)
@@ -91,7 +95,7 @@ utx_active_add(const struct futx *fu)
default:
/* Allow us to overwrite unused records. */
if (partial == -1)
- partial = lseek(fd, 0, SEEK_CUR) - sizeof fe;
+ partial = fseeko(fp, 0, SEEK_CUR) - sizeof fe;
break;
}
}
@@ -101,29 +105,25 @@ utx_active_add(const struct futx *fu)
* match was found, just append a new record.
*/
if (partial != -1)
- lseek(fd, partial, SEEK_SET);
+ fseeko(fp, partial, SEEK_SET);
exact:
- _write(fd, fu, sizeof *fu);
- _close(fd);
+ fwrite(fu, sizeof *fu, 1, fp);
+ fclose(fp);
}
static int
utx_active_remove(struct futx *fu)
{
- int fd;
+ FILE *fp;
struct futx fe;
/*
* Remove user login sessions, having the same ut_id.
*/
- fd = futx_open(_PATH_UTX_ACTIVE);
- if (fd < 0)
- return (0);
- if (lockf(fd, F_LOCK, 0) == -1) {
- _close(fd);
+ fp = futx_open(_PATH_UTX_ACTIVE);
+ if (fp == NULL)
return (0);
- }
- while (_read(fd, &fe, sizeof fe) == sizeof fe) {
+ while (fread(&fe, sizeof fe, 1, fp) == 1) {
switch (fe.fu_type) {
case USER_PROCESS:
case INIT_PROCESS:
@@ -139,14 +139,14 @@ utx_active_remove(struct futx *fu)
fu->fu_tv = fe.fu_tv;
/* Terminate session. */
- lseek(fd, -sizeof fe, SEEK_CUR);
- _write(fd, fu, sizeof *fu);
- _close(fd);
+ fseeko(fp, -sizeof fe, SEEK_CUR);
+ fwrite(fu, sizeof *fu, 1, fp);
+ fclose(fp);
return (0);
}
}
- _close(fd);
+ fclose(fp);
return (1);
}
@@ -160,7 +160,7 @@ utx_active_purge(void)
static void
utx_lastlogin_add(const struct futx *fu)
{
- int fd;
+ FILE *fp;
struct futx fe;
/*
@@ -168,14 +168,10 @@ utx_lastlogin_add(const struct futx *fu)
* current user already has an entry. If not, append a new
* entry.
*/
- fd = futx_open(_PATH_UTX_LASTLOGIN);
- if (fd < 0)
- return;
- if (lockf(fd, F_LOCK, 0) == -1) {
- _close(fd);
+ fp = futx_open(_PATH_UTX_LASTLOGIN);
+ if (fp == NULL)
return;
- }
- while (_read(fd, &fe, sizeof fe) == sizeof fe) {
+ while (fread(&fe, sizeof fe, 1, fp) == 1) {
if (strncmp(fu->fu_user, fe.fu_user, sizeof fe.fu_user) != 0)
continue;
@@ -184,12 +180,12 @@ utx_lastlogin_add(const struct futx *fu)
goto done;
/* Found a previous lastlogin entry for this user. */
- lseek(fd, -sizeof fe, SEEK_CUR);
+ fseeko(fp, -sizeof fe, SEEK_CUR);
break;
}
- _write(fd, fu, sizeof *fu);
+ fwrite(fu, sizeof *fu, 1, fp);
done:
- _close(fd);
+ fclose(fp);
}
static void
More information about the svn-src-user
mailing list