1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-01-03 06:04:53 +00:00
freebsd-ports/japanese/kon2-16dot/files/patch-src_utmp.c
Daichi GOTO d5110194a5 - fixed the building on amd64
- fixed the building on 9+
 - clean-up patches

PR:		167724
Submitted by:	Masamichi Takatsu <taka2@doga.co.jp>
2012-05-09 19:28:24 +00:00

114 lines
2.4 KiB
C

--- src/utmp.c.orig 1997-01-24 09:37:28.000000000 +0900
+++ src/utmp.c 2012-05-10 04:09:42.294562501 +0900
@@ -41,20 +41,39 @@
#include <utmp.h>
#include <grp.h>
#include <sys/stat.h>
+#if defined(__FreeBSD__)
+#include <ttyent.h>
+#endif
+#if !defined(__FreeBSD__)
static int ttyGid;
+#else
+static gid_t ttyGid;
+static int ts;
+#endif
+static int unuse_utmp = 0;
+
+void UnUseUtmp(int flg)
+{
+ unuse_utmp = flg;
+}
void SetUtmp(char *tty)
{
-#ifdef linux
struct utmp utmp;
struct passwd *pw;
struct group *ttygrp;
char *tn;
-
+#if defined(__FreeBSD__)
+ struct ttyent *ttyp;
+ int fd, i;
+#endif
+ if (unuse_utmp)
+ return;
pw = getpwuid(getuid());
tn = rindex(tty, '/') + 1;
memset((char *)&utmp, 0, sizeof(utmp));
+#if !defined(__FreeBSD__)
strncpy(utmp.ut_id, tn + 3, sizeof(utmp.ut_id));
utmp.ut_type = DEAD_PROCESS;
setutent();
@@ -66,21 +85,45 @@
time(&(utmp.ut_time));
pututline(&utmp);
endutent();
+#else
+ time(&(utmp.ut_time));
+ strncpy(utmp.ut_name, pw->pw_name, sizeof(utmp.ut_name));
+ strncpy(utmp.ut_line, tn, sizeof(utmp.ut_line));
+ setttyent();
+ ts = 0;
+ for (i = 1; (ttyp = getttyent()); ++i)
+ if (!strcmp(ttyp->ty_name,tn)) {
+ ts = i;
+ break;
+ }
+ endttyent();
+ if (ts > 0 && (fd = open(_PATH_UTMP, O_WRONLY|O_CREAT, 0644)) >= 0) {
+ lseek(fd, (ts*sizeof(struct utmp)), L_SET);
+ write(fd, &utmp, sizeof(struct utmp));
+ close(fd);
+ }
+#endif
if ((ttygrp = getgrnam("tty")) != NULL)
ttyGid = ttygrp->gr_gid;
else
ttyGid = -1;
chmod(tty, 0622);
chown(tty, getuid(), ttyGid);
-#endif
}
void ResetUtmp(char *tty)
{
-#ifdef linux
+#if !defined(__FreeBSD__)
struct utmp utmp, *utp;
char *tn;
+#else
+ struct utmp utmp;
+ int fd;
+#endif
+ if (unuse_utmp)
+ return;
+#if !defined(__FreeBSD__)
tn = rindex(tty, '/') + 4;
memset((char *)&utmp, 0, sizeof(utmp));
strncpy(utmp.ut_id, tn, sizeof(utmp.ut_id));
@@ -93,7 +136,19 @@
time(&(utp->ut_time));
pututline(utp);
endutent();
+#else
+ if (ts > 0 && (fd = open(_PATH_UTMP, O_RDWR, 0)) >= 0) {
+ lseek(fd, (ts*sizeof(struct utmp)), L_SET);
+ if (read(fd, &utmp, sizeof(struct utmp)) == sizeof(struct utmp)) {
+ bzero(utmp.ut_name, sizeof(utmp.ut_name));
+ bzero(utmp.ut_host, sizeof(utmp.ut_host));
+ time(&utmp.ut_time);
+ lseek(fd, (ts*sizeof(struct utmp)), L_SET);
+ write(fd, &utmp, sizeof(struct utmp));
+ }
+ close(fd);
+ }
+#endif
chmod(tty, 0600);
chown(tty, 0, ttyGid);
-#endif
}