diff options
author | Daichi GOTO <daichi@FreeBSD.org> | 2012-05-09 19:28:24 +0000 |
---|---|---|
committer | Daichi GOTO <daichi@FreeBSD.org> | 2012-05-09 19:28:24 +0000 |
commit | d5110194a59360ce3b0cc2dbe57360beba1c4a19 (patch) | |
tree | 4f92857a5f840d9d8638b6aaec61db2614e62b06 /japanese/kon2-16dot/files/patch-src_term.c | |
parent | Update to 2.03pre8 (diff) |
- fixed the building on amd64
- fixed the building on 9+
- clean-up patches
PR: 167724
Submitted by: Masamichi Takatsu <taka2@doga.co.jp>
Notes
Notes:
svn path=/head/; revision=296316
Diffstat (limited to 'japanese/kon2-16dot/files/patch-src_term.c')
-rw-r--r-- | japanese/kon2-16dot/files/patch-src_term.c | 486 |
1 files changed, 301 insertions, 185 deletions
diff --git a/japanese/kon2-16dot/files/patch-src_term.c b/japanese/kon2-16dot/files/patch-src_term.c index a5306cd0227c..4c5716433c2a 100644 --- a/japanese/kon2-16dot/files/patch-src_term.c +++ b/japanese/kon2-16dot/files/patch-src_term.c @@ -1,185 +1,301 @@ - --- src/term.c 30 Sep 2008 08:09:56 -0000 1.1.1.2 - +++ src/term.c 23 Oct 2008 09:24:33 -0000 - @@ -76,7 +76,7 @@ - - int masterPty; /* master pseudo-tty file descriptor */ - - -#define MAX_TTYNAME 10 - +#define MAX_TTYNAME 20 - - static int childPid, sockFd, slavePty; - static struct termio oldTio; - @@ -235,13 +235,16 @@ - } - ConsoleInit(video); - while (i < argc) { - - const char *arg; - + const char *arg = argv[i]; - - - if (argv[i][0] != '-') { - - warn("bad arg `%s'; assumed `-%s'\r\n", argv[i]); - - arg = (char *) argv[i]; - - } else - - arg = (char *) argv[i] + 1; - + if (*arg != '-') - + warn("bad arg `%s'; assumed `-%s'\n", arg, arg); - + else - + ++arg; - + if (!strcasecmp(arg, "help")) { - + message("Usage: kon2 [video] [-option value] ...\n"); - + exit(EXIT_FAILURE); - + } - i++; - if (i >= argc) { - error("no value for `%s'\r\n", arg); - @@ -258,6 +261,25 @@ - static int savedArgc; /* argc of startup time */ - static const char **savedArgv; /* argv of startup time */ - - +static int ttyNumber = 0; - + - +int - +set_vt_number(void) - +{ - +#if defined(__FreeBSD__) - + ttyNumber = strtol(ttyname(0) + 9, NULL, 16); - +#elif defined(linux) - + ttyNumber = atoi(ttyname(0) + 8); - +#endif /* linux */ - + return ttyNumber; - +} - + - +int - +TermGetNumber(void) - +{ - + return ttyNumber; - +} - + - /* Do initialization before reading config file */ - void TermInit(int argc, const char *argv[]) - { - @@ -266,6 +288,7 @@ - init.display = init.utmp = init.socket = init.termio = FALSE; - /* Initialize subsystems. */ - - + set_vt_number(); - CapInit(); - ChildInit(); - MouseInit(); - @@ -355,8 +378,8 @@ - mouseFd = MouseStart(); - } - - - chown("/dev/tty0", getuid(), getgid()); - #if defined(linux) - + chown("/dev/tty0", getuid(), getgid()); - sockFd = SocketInit(ttyname(0) + 8); - #elif defined(__FreeBSD__) - sockFd = SocketInit(ttyname(0) + 9); - @@ -381,6 +404,7 @@ - - /* Signal Setting */ - signal(SIGCHLD, ExitPty); - + signal(SIGPIPE, SIG_IGN); - signal(SIGHUP, ExitTerm); - signal(SIGTERM, ExitTerm); - signal(SIGSEGV, ExitTerm); - @@ -458,18 +482,13 @@ - PerrorExit("/dev/console"); - } - #elif defined(__FreeBSD__) - -#if __FreeBSD_version >= 501100 - - cfd = open("/dev/ttyv0", O_WRONLY); - - if (cfd < 0 && (cfd = open("/dev/ttyv0", O_RDONLY)) < 0) { - - PerrorExit("/dev/ttyv0"); - - } - -#else - - cfd = open("/dev/vga", O_WRONLY); - - if (cfd < 0 && (cfd = open("/dev/vga", O_RDONLY)) < 0) { - - PerrorExit("/dev/vga"); - + cfd = open("/dev/vga", O_RDONLY); - + if (cfd == -1) { - + cfd = open("/dev/console", O_RDONLY); - + if (cfd == -1) - + PerrorExit("/dev/console"); - } - -#endif - -#endif - +#endif /* __FreeBSD__ */ - ioctl(cfd, VT_ACTIVATE, orgVtNum); - close(cfd); - } - @@ -486,28 +505,36 @@ - cfd = open("/dev/console", O_WRONLY); - if (cfd < 0 && (cfd = open("/dev/console", O_RDONLY)) < 0) - fatal("can't open /dev/console"); - -#elif defined(__FreeBSD__) - -#if __FreeBSD_version >= 501100 - - cfd = open("/dev/ttyv0", O_WRONLY); - - if (cfd < 0 && (cfd = open("/dev/ttyv0", O_RDONLY)) < 0) - - fatal("can't open /dev/ttyv0"); - -#else - - cfd = open("/dev/vga", O_WRONLY); - - if (cfd < 0 && (cfd = open("/dev/vga", O_RDONLY)) < 0) - - fatal("can't open /dev/vga"); - -#endif - -#endif - + - ioctl(cfd, KDGETMODE, &mode); - if (mode == KD_TEXT) { - close(cfd); - return; - } - -#if defined(linux) - ioctl(cfd, VT_GETSTATE, &vts); - orgVtNum = vts.v_active; - -#endif - - ioctl(cfd, VT_OPENQRY, &vtNum); - - if (vtNum < 0) - + - +#elif defined(__FreeBSD__) - + /* check for syscons mode */ - + if (ioctl(0, KDGETMODE, &mode) == -1) - + fatal("KON is require the syscons(4)"); - + else if (mode != KD_TEXT) - + fatal("unknown terminal mode."); - + else if (strcmp(ttyname(0), "/dev/console") != 0) - + return; - + - + cfd = open("/dev/vga", O_RDONLY); - + if (cfd == -1) { - + cfd = open("/dev/console", O_RDONLY); - + if (cfd == -1) - + fatal("can't open /dev/console"); - + } - + if (ioctl(cfd, VT_GETINDEX, &orgVtNum) == -1) - + fatal("ioctl(VT_GETINDEX)"); - +#endif /* __FreeBSD__ */ - + - + errno = 0; - + if (ioctl(cfd, VT_OPENQRY, &vtNum) == -1 || vtNum < 0) - fatal("can't get free VC"); - parent = getpid(); - if ((child = fork()) == -1) - @@ -515,12 +542,13 @@ - if (child) { - signal(SIGHUP, ExitPty); - pause(); - + fatal("internal error."); - } - setsid(); - #if defined(linux) - sprintf(vtty, "/dev/tty%d", vtNum); - #elif defined(__FreeBSD__) - - sprintf(vtty, "/dev/ttyv%d", vtNum); - + sprintf(vtty, "/dev/ttyv%d", vtNum - 1); - #endif - if ((vfd = open(vtty, O_RDWR)) < 0) - fatal("can't open %s", vtty); - @@ -531,5 +559,6 @@ - dup2(vfd, 0); - dup2(vfd, 1); - dup2(vfd, 2); - + close(vfd); - kill(parent, SIGHUP); - } +--- src/term.c.orig 1997-01-25 00:03:58.000000000 +0900 ++++ src/term.c 2012-05-10 00:17:11.736555617 +0900 +@@ -33,7 +33,13 @@ + #include <termio.h> + #elif defined(__FreeBSD__) + #include <termios.h> +-#include <machine/console.h> ++#include <osreldate.h> ++#if __FreeBSD_version >= 410000 ++# include <sys/consio.h> ++# include <sys/kbio.h> ++#else ++# include <machine/console.h> ++#endif + #define termio termios + #endif + #include <signal.h> +@@ -70,12 +76,15 @@ + + int masterPty; /* master pseudo-tty file descriptor */ + +-#define MAX_TTYNAME 10 ++#define MAX_TTYNAME 20 + + static int childPid, sockFd, slavePty; + static struct termio oldTio; + static char ptyName[MAX_TTYNAME + 1]; + static int orgVtNum = -1; ++#if defined(__FreeBSD__) ++static int exec_mode = 0; ++#endif + + struct initInfo { + bool display; /* display initialized */ +@@ -129,8 +138,13 @@ + if (WEXITSTATUS(stat) & 0x7f) + if (WIFSIGNALED(stat)) + fatal("child died with signal -- %s\r\n", sys_siglist[WTERMSIG(stat)]); +- else ++ else { ++#if defined(__FreeBSD__) ++ if (exec_mode) /* reflect exit code */ ++ exit(WEXITSTATUS(stat) & 0x7f); ++#endif + fatal("child exited with status %d\r\n", WEXITSTATUS(stat) & 0x7f); ++ } + else if (signum == SIGHUP) { + fprintf(stderr, "\r\nKON> switched to new VC\r\n"); + exit(EXIT_SUCCESS); +@@ -201,11 +215,15 @@ + } + if (FD_ISSET(0, &readFds)) { + i = read(0, buff, BUFSIZ); ++#if defined(__FreeBSD__) ++ if (strncmp(getenv("TERM"), "vt100", 5) == 0) ++ i = cons25tovt100(buff, i, BUFSIZ); ++#endif + if (i > 0) write(masterPty, buff, i); + PollCursor(TRUE); + } + if (FD_ISSET(sockFd, &readFds)) SocketInterface(sockFd); +- if (mInfo.has_mouse) { ++ if (mInfo.has_mouse && mouseFd > 0) { + if (FD_ISSET(mouseFd, &readFds) && con.active) { + i = read(mouseFd, buff, BUFSIZ); + if (i > 0) MouseGetPacket(buff, i); +@@ -215,6 +233,27 @@ + } + } + ++#if defined(__FreeBSD__) ++/* ++ * 'e', 's', 'u' 以外の文字がないかチェックする ++ */ ++static int Check_esu(char *p) ++{ ++ for (; *p; ++p) { ++ switch (*p) { ++ case 'e': ++ return(1); ++ case 's': ++ case 'u': ++ continue; ++ default: ++ return(0); ++ } ++ } ++ return(1); ++} ++#endif ++ + static void ProcessArgs(int argc, const char *argv[]) + { + int i = 0; +@@ -226,13 +265,55 @@ + } + ConsoleInit(video); + while (i < argc) { +- const char *arg; ++ const char *arg = argv[i]; ++ ++#if defined(__FreeBSD__) ++ if (argv[i][0] == '-' && Check_esu(&argv[i][1])) { ++ char *p; + +- if (argv[i][0] != '-') { +- warn("bad arg `%s'; assumed `-%s'\r\n", argv[i]); +- arg = (char *) argv[i]; +- } else +- arg = (char *) argv[i] + 1; ++ for (p = &argv[i][1]; *p; ++p) { ++ if (*p == 'e') { ++ ConfigExecProg(&argv[i+1]); ++ ConfigMessage("Off"); ++ exec_mode = 1; ++ return; ++ } ++ else if (*p == 's') /* single user mode */ ++ UnUseUtmp(1); ++ else if (*p == 'u') { /* unset TERM mode */ ++ ConfigUnsetTerm(1); ++ } ++ } ++ } ++ else { ++ if (*arg != '-') ++ warn("bad arg `%s'; assumed `-%s'\n", arg, arg); ++ else ++ ++arg; ++ if (!strcasecmp(arg, "help")) { ++ message("Usage: kon2 [video] [-option value] ...\n"); ++ exit(EXIT_FAILURE); ++ } ++ i++; ++ if (i >= argc) { ++ error("no value for `%s'\r\n", arg); ++ break; ++ } ++ if (!strcasecmp(arg, "e")) ++ ConfigExecProg(argv[i]); ++ else if (SetCapArg(arg, argv[i]) < 0) ++ warn("invalid capability `%s' ignored\r\n", arg); ++ } ++ i++; ++#else ++ if (*arg != '-') ++ warn("bad arg `%s'; assumed `-%s'\n", arg, arg); ++ else ++ ++arg; ++ if (!strcasecmp(arg, "help")) { ++ message("Usage: kon2 [video] [-option value] ...\n"); ++ exit(EXIT_FAILURE); ++ } + i++; + if (i >= argc) { + error("no value for `%s'\r\n", arg); +@@ -243,12 +324,32 @@ + else if (SetCapArg(arg, argv[i]) < 0) + warn("invalid capability `%s' ignored\r\n", arg); + i++; ++#endif + } + } + + static int savedArgc; /* argc of startup time */ + static const char **savedArgv; /* argv of startup time */ + ++static int ttyNumber = 0; ++ ++int ++set_vt_number(void) ++{ ++#if defined(__FreeBSD__) ++ ttyNumber = strtol(ttyname(0) + 9, NULL, 16); ++#elif defined(linux) ++ ttyNumber = atoi(ttyname(0) + 8); ++#endif /* linux */ ++ return ttyNumber; ++} ++ ++int ++TermGetNumber(void) ++{ ++ return ttyNumber; ++} ++ + /* Do initialization before reading config file */ + void TermInit(int argc, const char *argv[]) + { +@@ -257,6 +358,7 @@ + init.display = init.utmp = init.socket = init.termio = FALSE; + /* Initialize subsystems. */ + ++ set_vt_number(); + CapInit(); + ChildInit(); + MouseInit(); +@@ -346,8 +448,8 @@ + mouseFd = MouseStart(); + } + +- chown("/dev/tty0", getuid(), getgid()); + #if defined(linux) ++ chown("/dev/tty0", getuid(), getgid()); + sockFd = SocketInit(ttyname(0) + 8); + #elif defined(__FreeBSD__) + sockFd = SocketInit(ttyname(0) + 9); +@@ -372,6 +474,7 @@ + + /* Signal Setting */ + signal(SIGCHLD, ExitPty); ++ signal(SIGPIPE, SIG_IGN); + signal(SIGHUP, ExitTerm); + signal(SIGTERM, ExitTerm); + signal(SIGSEGV, ExitTerm); +@@ -449,11 +552,13 @@ + PerrorExit("/dev/console"); + } + #elif defined(__FreeBSD__) +- cfd = open("/dev/vga", O_WRONLY); +- if (cfd < 0 && (cfd = open("/dev/vga", O_RDONLY)) < 0) { +- PerrorExit("/dev/vga"); ++ cfd = open("/dev/vga", O_RDONLY); ++ if (cfd == -1) { ++ cfd = open("/dev/console", O_RDONLY); ++ if (cfd == -1) ++ PerrorExit("/dev/console"); + } +-#endif ++#endif /* __FreeBSD__ */ + ioctl(cfd, VT_ACTIVATE, orgVtNum); + close(cfd); + } +@@ -470,22 +575,36 @@ + cfd = open("/dev/console", O_WRONLY); + if (cfd < 0 && (cfd = open("/dev/console", O_RDONLY)) < 0) + fatal("can't open /dev/console"); +-#elif defined(__FreeBSD__) +- cfd = open("/dev/vga", O_WRONLY); +- if (cfd < 0 && (cfd = open("/dev/vga", O_RDONLY)) < 0) +- fatal("can't open /dev/vga"); +-#endif ++ + ioctl(cfd, KDGETMODE, &mode); + if (mode == KD_TEXT) { + close(cfd); + return; + } +-#if defined(linux) + ioctl(cfd, VT_GETSTATE, &vts); + orgVtNum = vts.v_active; +-#endif +- ioctl(cfd, VT_OPENQRY, &vtNum); +- if (vtNum < 0) ++ ++#elif defined(__FreeBSD__) ++ /* check for syscons mode */ ++ if (ioctl(0, KDGETMODE, &mode) == -1) ++ fatal("KON is require the syscons(4)"); ++ else if (mode != KD_TEXT) ++ fatal("unknown terminal mode."); ++ else if (strcmp(ttyname(0), "/dev/console") != 0) ++ return; ++ ++ cfd = open("/dev/vga", O_RDONLY); ++ if (cfd == -1) { ++ cfd = open("/dev/console", O_RDONLY); ++ if (cfd == -1) ++ fatal("can't open /dev/console"); ++ } ++ if (ioctl(cfd, VT_GETINDEX, &orgVtNum) == -1) ++ fatal("ioctl(VT_GETINDEX)"); ++#endif /* __FreeBSD__ */ ++ ++ errno = 0; ++ if (ioctl(cfd, VT_OPENQRY, &vtNum) == -1 || vtNum < 0) + fatal("can't get free VC"); + parent = getpid(); + if ((child = fork()) == -1) +@@ -493,12 +612,13 @@ + if (child) { + signal(SIGHUP, ExitPty); + pause(); ++ fatal("internal error."); + } + setsid(); + #if defined(linux) + sprintf(vtty, "/dev/tty%d", vtNum); + #elif defined(__FreeBSD__) +- sprintf(vtty, "/dev/ttyv%d", vtNum); ++ sprintf(vtty, "/dev/ttyv%d", vtNum - 1); + #endif + if ((vfd = open(vtty, O_RDWR)) < 0) + fatal("can't open %s", vtty); +@@ -509,5 +629,6 @@ + dup2(vfd, 0); + dup2(vfd, 1); + dup2(vfd, 2); ++ close(vfd); + kill(parent, SIGHUP); + } |