freebsd-ports/japanese/kon2-16dot/files/patch-src_child.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

161 lines
3.5 KiB
C

--- src/child.c.orig 1997-01-24 09:36:14.000000000 +0900
+++ src/child.c 2012-05-10 00:17:11.718554719 +0900
@@ -31,6 +31,7 @@
#include <unistd.h>
#ifdef __FreeBSD__
#include <errno.h>
+#include <sys/ioctl.h>
#endif
#include <getcap.h>
@@ -39,16 +40,41 @@
#include <version.h>
#include <vc.h>
-static char *startupStr, *execProg;
+#if defined(__FreeBSD__)
+static char *startupStr = NULL, *execProg = NULL, **execArgv = NULL;
+
+int ConfigExecProg(const char **argv)
+{
+ execArgv = argv;
+ SafeFree(execProg);
+ execProg = strdup(*argv);
+ return SUCCESS;
+}
+#else
+
+static char *startupStr = NULL, *execProg = NULL;
int ConfigExecProg(const char *string)
{
+ SafeFree(execProg);
execProg = strdup(string);
return SUCCESS;
}
+#endif
+
+#if defined(__FreeBSD__)
+static int unset_mode = 0; /* TERM ¤òÊѹ¹¤·¤Ê¤¤ */
+static int vt100_mode = 0; /* vt100 ¤Þ¤¿¤Ï vt100-XXX */
+
+int ConfigUnsetTerm(const int flag)
+{
+ unset_mode = flag;
+}
+#endif
static int ConfigStartup(const char *string)
{
+ SafeFree(startupStr);
startupStr = strdup(string);
return SUCCESS;
}
@@ -66,7 +92,11 @@
static bool startupMessage;
+#if defined(__FreeBSD__)
+int ConfigMessage(const char *confstr)
+#else
static int ConfigMessage(const char *confstr)
+#endif
{
startupMessage = BoolConf(confstr);
return SUCCESS;
@@ -80,13 +110,17 @@
void ChildCleanup(void)
{
- free(startupStr);
+ SafeFree(startupStr);
+ SafeFree(execProg);
}
void ChildStart(FILE *errfp)
{
char *shell, *tail, *tcap;
char buff[80];
+#if defined(__FreeBSD__)
+ struct winsize win;
+#endif
setgid(getgid());
setuid(getuid());
@@ -96,43 +130,64 @@
#if defined(linux)
sprintf(buff, "TERMCAP=:co#%d:li#%d:tc=console:",
dInfo.txmax + 1, dInfo.tymax + 1);
-#elif defined(__FreeBSD__)
- sprintf(buff,"TERM=vt100");
-#endif
tcap = strdup(buff);
putenv(tcap);
+#elif defined(__FreeBSD__)
+ if (unset_mode) {
+ if (strncmp(getenv("TERM"), "vt100", 5) == 0) {
+ vt100_mode = 1;
+ unset_mode = 0;
+ }
+ }
+ else {
+ putenv("TERM=vt100");
+ vt100_mode = 1;
+ }
+ if (vt100_mode) {
+ win.ws_row = dInfo.tymax + 1;
+ win.ws_col = dInfo.txmax + 1;
+ win.ws_xpixel = win.ws_ypixel = 0;
+ ioctl(STDIN_FILENO, TIOCSWINSZ, &win);
+ }
+#endif
- if (startupMessage)
+ if (startupMessage) {
printf("\rKON2 Kanji On Console " VERSION
- " using VT number %c\r\n"
+ " using VT number %d\n"
"%*s\r\n"
- "%*s\r\n", *(ttyname(fileno(errfp))+8),
+ "%*s\r\n",
+ TermGetNumber(),
dInfo.txmax,
"Copyright (C) "
"1993-1996 Takashi MANABE",
dInfo.txmax,
"1993, 1994 MAEDA Atusi ");
#if defined(__FreeBSD__)
- printf("\rKON for FreeBSD-2.x ver0.01 Takashi OGURA\r\n");
+ printf("\rKON for FreeBSD-2.x ver0.01 Takashi OGURA\r\n");
#endif
-
+ }
/*
- printf("KON using VT number %c.\n\n",
- *(ttyname(fileno(errfp))+8));
+ printf("KON using VT number %d.\n\n", TermGetNumber());
*/
fflush(stdout);
if (execProg)
+#if defined(__FreeBSD__)
+ execvp(execProg, execArgv);
+#else
execlp(execProg, execProg, 0);
+#endif
else {
+ char *ptr;
if ((execProg = getenv("SHELL")) == NULL)
execProg = "/bin/sh";
if ((tail = rindex(execProg, '/')) == NULL)
tail = " sh";
- sprintf(buff, "-%s", tail + 1);
- execl(execProg, buff, 0);
+ ptr = strdup(tail);
+ *ptr = '-';
+ execl(execProg, ptr, 0);
}
fprintf(errfp, "KON> couldn't exec shell\r\n");
fprintf(errfp, "%s: %s\r\n", execProg, strerror(errno));