1 | /*--------------------------------*-C-*---------------------------------* |
1 | /*--------------------------------*-C-*---------------------------------* |
2 | * File: init.c |
2 | * File: init.c |
3 | *----------------------------------------------------------------------* |
3 | *----------------------------------------------------------------------* |
4 | * $Id: init.C,v 1.21 2004/01/31 02:14:58 pcg Exp $ |
|
|
5 | * |
4 | * |
6 | * All portions of code are copyright by their respective author/s. |
5 | * All portions of code are copyright by their respective author/s. |
7 | * Copyright (c) 1992 John Bovey, University of Kent at Canterbury <jdb@ukc.ac.uk> |
6 | * Copyright (c) 1992 John Bovey, University of Kent at Canterbury <jdb@ukc.ac.uk> |
8 | * - original version |
7 | * - original version |
9 | * Copyright (c) 1994 Robert Nation <nation@rocket.sanders.lockheed.com> |
8 | * Copyright (c) 1994 Robert Nation <nation@rocket.sanders.lockheed.com> |
… | |
… | |
327 | #endif |
326 | #endif |
328 | #ifdef KEEP_SCROLLCOLOR |
327 | #ifdef KEEP_SCROLLCOLOR |
329 | COLOR_SCROLLBAR, |
328 | COLOR_SCROLLBAR, |
330 | COLOR_SCROLLTROUGH, |
329 | COLOR_SCROLLTROUGH, |
331 | #endif /* KEEP_SCROLLCOLOR */ |
330 | #endif /* KEEP_SCROLLCOLOR */ |
|
|
331 | |
332 | }; |
332 | }; |
333 | |
333 | |
334 | const char *const xa_names[NUM_XA] = |
334 | const char *const xa_names[NUM_XA] = |
335 | { |
335 | { |
336 | "TEXT", |
336 | "TEXT", |
… | |
… | |
445 | ttymode = S_IRUSR | S_IWUSR | S_IWGRP; |
445 | ttymode = S_IRUSR | S_IWUSR | S_IWGRP; |
446 | ttygid = gr->gr_gid; |
446 | ttygid = gr->gr_gid; |
447 | } |
447 | } |
448 | else |
448 | else |
449 | #endif /* TTY_GID_SUPPORT */ |
449 | #endif /* TTY_GID_SUPPORT */ |
|
|
450 | |
450 | { |
451 | { |
451 | ttymode = S_IRUSR | S_IWUSR | S_IWGRP | S_IWOTH; |
452 | ttymode = S_IRUSR | S_IWUSR | S_IWGRP | S_IWOTH; |
452 | ttygid = getgid (); |
453 | ttygid = getgid (); |
453 | } |
454 | } |
454 | |
455 | |
… | |
… | |
658 | #ifndef NO_OLD_SELECTION |
659 | #ifndef NO_OLD_SELECTION |
659 | |
660 | |
660 | else if (STRNCASECMP(rs[Rs_selectstyle], "old", 3) == 0) |
661 | else if (STRNCASECMP(rs[Rs_selectstyle], "old", 3) == 0) |
661 | selection_style = OLD_SELECT; |
662 | selection_style = OLD_SELECT; |
662 | #endif |
663 | #endif |
|
|
664 | |
663 | } |
665 | } |
664 | |
666 | |
665 | #ifdef HAVE_SCROLLBARS |
667 | #ifdef HAVE_SCROLLBARS |
666 | setup_scrollbar (rs[Rs_scrollBar_align], rs[Rs_scrollstyle], |
668 | setup_scrollbar (rs[Rs_scrollBar_align], rs[Rs_scrollstyle], |
667 | rs[Rs_scrollBar_thickness]); |
669 | rs[Rs_scrollBar_thickness]); |
668 | #endif |
670 | #endif |
669 | |
671 | |
670 | TermWin.fontset = new rxvt_fontset (this); |
672 | TermWin.fontset = new rxvt_fontset (this); |
671 | TermWin.fontset->populate (rs[Rs_font]); |
673 | TermWin.fontset->populate (rs[Rs_font]); |
672 | TermWin.fwidth = TermWin.fontset->base_font ()->width; |
674 | TermWin.fwidth = TermWin.fontset->base_font ()->width; |
… | |
… | |
806 | #endif |
808 | #endif |
807 | #if HAVE_NL_LANGINFO |
809 | #if HAVE_NL_LANGINFO |
808 | free (codeset); |
810 | free (codeset); |
809 | codeset = strdup (nl_langinfo (CODESET)); |
811 | codeset = strdup (nl_langinfo (CODESET)); |
810 | enc_utf8 = !STRCASECMP (codeset, "UTF-8") |
812 | enc_utf8 = !STRCASECMP (codeset, "UTF-8") |
811 | || !STRCASECMP (codeset, "UTF8"); |
813 | || !STRCASECMP (codeset, "UTF8"); |
812 | #else |
814 | #else |
813 | enc_utf8 = 1; |
815 | enc_utf8 = 1; |
814 | #endif |
816 | #endif |
815 | } |
817 | } |
816 | |
818 | |
… | |
… | |
946 | |
948 | |
947 | if (!rXParseAllocColor (&xcol, rs[Rs_color + i])) |
949 | if (!rXParseAllocColor (&xcol, rs[Rs_color + i])) |
948 | { |
950 | { |
949 | switch (i) |
951 | switch (i) |
950 | { |
952 | { |
951 | case Color_fg: |
953 | case Color_fg: |
952 | case Color_bg: |
954 | case Color_bg: |
953 | /* fatal: need bg/fg color */ |
955 | /* fatal: need bg/fg color */ |
954 | rxvt_print_error ("aborting"); |
956 | rxvt_print_error ("aborting"); |
955 | exit (EXIT_FAILURE); |
957 | exit (EXIT_FAILURE); |
956 | /* NOTREACHED */ |
958 | /* NOTREACHED */ |
957 | break; |
959 | break; |
958 | #ifndef NO_CURSORCOLOR |
960 | #ifndef NO_CURSORCOLOR |
959 | case Color_cursor2: |
961 | case Color_cursor2: |
960 | xcol = PixColors[Color_fg]; |
962 | xcol = PixColors[Color_fg]; |
961 | break; |
963 | break; |
962 | #endif /* ! NO_CURSORCOLOR */ |
964 | #endif /* ! NO_CURSORCOLOR */ |
963 | case Color_pointer: |
965 | case Color_pointer: |
964 | xcol = PixColors[Color_fg]; |
966 | xcol = PixColors[Color_fg]; |
965 | break; |
967 | break; |
966 | default: |
968 | default: |
967 | xcol = PixColors[Color_bg]; /* None */ |
969 | xcol = PixColors[Color_bg]; /* None */ |
968 | break; |
970 | break; |
969 | } |
971 | } |
970 | } |
972 | } |
971 | } |
973 | } |
972 | |
974 | |
973 | PixColors[i] = xcol; |
975 | PixColors[i] = xcol; |
… | |
… | |
1045 | i -= 8; |
1047 | i -= 8; |
1046 | #ifndef NO_BRIGHTCOLOR |
1048 | #ifndef NO_BRIGHTCOLOR |
1047 | rs[Rs_color + idx] = rs[Rs_color + minBrightCOLOR + i]; |
1049 | rs[Rs_color + idx] = rs[Rs_color + minBrightCOLOR + i]; |
1048 | return; |
1050 | return; |
1049 | #endif |
1051 | #endif |
|
|
1052 | |
1050 | } |
1053 | } |
1051 | |
1054 | |
1052 | if (i >= 0 && i <= 7) /* normal colors */ |
1055 | if (i >= 0 && i <= 7) /* normal colors */ |
1053 | rs[Rs_color + idx] = rs[Rs_color + minCOLOR + i]; |
1056 | rs[Rs_color + idx] = rs[Rs_color + minCOLOR + i]; |
1054 | } |
1057 | } |
… | |
… | |
1087 | { |
1090 | { |
1088 | if (kc[k] == 0) |
1091 | if (kc[k] == 0) |
1089 | break; |
1092 | break; |
1090 | switch (XKeycodeToKeysym(Xdisplay, kc[k], 0)) |
1093 | switch (XKeycodeToKeysym(Xdisplay, kc[k], 0)) |
1091 | { |
1094 | { |
1092 | case XK_Num_Lock: |
1095 | case XK_Num_Lock: |
1093 | ModNumLockMask = modmasks[i - 1]; |
1096 | ModNumLockMask = modmasks[i - 1]; |
1094 | /* FALLTHROUGH */ |
1097 | /* FALLTHROUGH */ |
1095 | default: |
1098 | default: |
1096 | continue; /* for(;;) */ |
1099 | continue; /* for(;;) */ |
1097 | case XK_Meta_L: |
1100 | case XK_Meta_L: |
1098 | case XK_Meta_R: |
1101 | case XK_Meta_R: |
1099 | cm = "meta"; |
1102 | cm = "meta"; |
1100 | realmeta = i; |
1103 | realmeta = i; |
1101 | break; |
1104 | break; |
1102 | case XK_Alt_L: |
1105 | case XK_Alt_L: |
1103 | case XK_Alt_R: |
1106 | case XK_Alt_R: |
1104 | cm = "alt"; |
1107 | cm = "alt"; |
1105 | realalt = i; |
1108 | realalt = i; |
1106 | break; |
1109 | break; |
1107 | case XK_Super_L: |
1110 | case XK_Super_L: |
1108 | case XK_Super_R: |
1111 | case XK_Super_R: |
1109 | cm = "super"; |
1112 | cm = "super"; |
1110 | break; |
1113 | break; |
1111 | case XK_Hyper_L: |
1114 | case XK_Hyper_L: |
1112 | case XK_Hyper_R: |
1115 | case XK_Hyper_R: |
1113 | cm = "hyper"; |
1116 | cm = "hyper"; |
1114 | break; |
1117 | break; |
1115 | } |
1118 | } |
1116 | if (rsmod && STRNCASECMP(rsmod, cm, STRLEN(cm)) == 0) |
1119 | if (rsmod && STRNCASECMP(rsmod, cm, STRLEN(cm)) == 0) |
1117 | requestedmeta = i; |
1120 | requestedmeta = i; |
1118 | } |
1121 | } |
1119 | } |
1122 | } |
… | |
… | |
1165 | RootWindow(Xdisplay, Xscreen), |
1168 | RootWindow(Xdisplay, Xscreen), |
1166 | Xvisual, AllocNone); |
1169 | Xvisual, AllocNone); |
1167 | } |
1170 | } |
1168 | } |
1171 | } |
1169 | #endif |
1172 | #endif |
|
|
1173 | |
1170 | } |
1174 | } |
1171 | |
1175 | |
1172 | /* grab colors before netscape does */ |
1176 | /* grab colors before netscape does */ |
1173 | Get_Colours (); |
1177 | Get_Colours (); |
1174 | |
1178 | |
… | |
… | |
1186 | |
1190 | |
1187 | attributes.background_pixel = PixColors[Color_fg]; |
1191 | attributes.background_pixel = PixColors[Color_fg]; |
1188 | attributes.border_pixel = PixColors[Color_border]; |
1192 | attributes.border_pixel = PixColors[Color_border]; |
1189 | attributes.colormap = Xcmap; |
1193 | attributes.colormap = Xcmap; |
1190 | TermWin.parent[0] = XCreateWindow (Xdisplay, DefaultRootWindow (Xdisplay), |
1194 | TermWin.parent[0] = XCreateWindow (Xdisplay, DefaultRootWindow (Xdisplay), |
1191 | szHint.x, szHint.y, |
1195 | szHint.x, szHint.y, |
1192 | szHint.width, szHint.height, |
1196 | szHint.width, szHint.height, |
1193 | TermWin.ext_bwidth, |
1197 | TermWin.ext_bwidth, |
1194 | Xdepth, InputOutput, |
1198 | Xdepth, InputOutput, |
1195 | Xvisual, |
1199 | Xvisual, |
1196 | CWBackPixel | CWBorderPixel |
1200 | CWBackPixel | CWBorderPixel |
1197 | | CWColormap, &attributes); |
1201 | | CWColormap, &attributes); |
1198 | #else |
1202 | #else |
1199 | TermWin.parent[0] = XCreateSimpleWindow (Xdisplay, DefaultRootWindow (Xdisplay), |
1203 | TermWin.parent[0] = XCreateSimpleWindow (Xdisplay, DefaultRootWindow (Xdisplay), |
1200 | szHint.x, szHint.y, |
1204 | szHint.x, szHint.y, |
1201 | szHint.width, |
1205 | szHint.width, |
1202 | szHint.height, |
1206 | szHint.height, |
1203 | TermWin.ext_bwidth, |
1207 | TermWin.ext_bwidth, |
1204 | PixColors[Color_border], |
1208 | PixColors[Color_border], |
1205 | PixColors[Color_fg]); |
1209 | PixColors[Color_fg]); |
1206 | #endif |
1210 | #endif |
1207 | |
1211 | |
1208 | xterm_seq (XTerm_title, rs[Rs_title], CHAR_ST); |
1212 | xterm_seq (XTerm_title, rs[Rs_title], CHAR_ST); |
1209 | xterm_seq (XTerm_iconName, rs[Rs_iconName], CHAR_ST); |
1213 | xterm_seq (XTerm_iconName, rs[Rs_iconName], CHAR_ST); |
1210 | |
1214 | |
… | |
… | |
1242 | blackcolour.red = 0; |
1246 | blackcolour.red = 0; |
1243 | blackcolour.green = 0; |
1247 | blackcolour.green = 0; |
1244 | blackcolour.blue = 0; |
1248 | blackcolour.blue = 0; |
1245 | Font f = XLoadFont (Xdisplay, "fixed"); |
1249 | Font f = XLoadFont (Xdisplay, "fixed"); |
1246 | blank_cursor = XCreateGlyphCursor (Xdisplay, f, f, ' ', ' ', |
1250 | blank_cursor = XCreateGlyphCursor (Xdisplay, f, f, ' ', ' ', |
1247 | &blackcolour, &blackcolour); |
1251 | &blackcolour, &blackcolour); |
1248 | XUnloadFont (Xdisplay, f); |
1252 | XUnloadFont (Xdisplay, f); |
1249 | } |
1253 | } |
1250 | #endif |
1254 | #endif |
1251 | |
1255 | |
1252 | /* the vt window */ |
1256 | /* the vt window */ |
1253 | TermWin.vt = XCreateSimpleWindow(Xdisplay, TermWin.parent[0], |
1257 | TermWin.vt = XCreateSimpleWindow(Xdisplay, TermWin.parent[0], |
1254 | window_vt_x, window_vt_y, |
1258 | window_vt_x, window_vt_y, |
1255 | TermWin_TotalWidth(), |
1259 | TermWin_TotalWidth(), |
1256 | TermWin_TotalHeight(), |
1260 | TermWin_TotalHeight(), |
1257 | 0, |
1261 | 0, |
1258 | PixColors[Color_fg], |
1262 | PixColors[Color_fg], |
1259 | PixColors[Color_bg]); |
1263 | PixColors[Color_bg]); |
1260 | #ifdef DEBUG_X |
1264 | #ifdef DEBUG_X |
1261 | XStoreName(Xdisplay, TermWin.vt, "vt window"); |
1265 | XStoreName(Xdisplay, TermWin.vt, "vt window"); |
1262 | #endif |
1266 | #endif |
1263 | |
1267 | |
1264 | vt_emask = (ExposureMask | ButtonPressMask | ButtonReleaseMask |
1268 | vt_emask = (ExposureMask | ButtonPressMask | ButtonReleaseMask |
… | |
… | |
1278 | #if defined(MENUBAR) && (MENUBAR_MAX > 1) |
1282 | #if defined(MENUBAR) && (MENUBAR_MAX > 1) |
1279 | |
1283 | |
1280 | if (menuBar_height()) |
1284 | if (menuBar_height()) |
1281 | { |
1285 | { |
1282 | menuBar.win = XCreateSimpleWindow(Xdisplay, TermWin.parent[0], |
1286 | menuBar.win = XCreateSimpleWindow(Xdisplay, TermWin.parent[0], |
1283 | window_vt_x, 0, |
1287 | window_vt_x, 0, |
1284 | TermWin_TotalWidth(), |
1288 | TermWin_TotalWidth(), |
1285 | menuBar_TotalHeight(), |
1289 | menuBar_TotalHeight(), |
1286 | 0, |
1290 | 0, |
1287 | PixColors[Color_fg], |
1291 | PixColors[Color_fg], |
1288 | PixColors[Color_scroll]); |
1292 | PixColors[Color_scroll]); |
1289 | #ifdef DEBUG_X |
1293 | #ifdef DEBUG_X |
1290 | |
1294 | |
1291 | XStoreName(Xdisplay, menuBar.win, "menubar"); |
1295 | XStoreName(Xdisplay, menuBar.win, "menubar"); |
1292 | #endif |
1296 | #endif |
1293 | |
1297 | |
… | |
… | |
1316 | /* graphics context for the vt window */ |
1320 | /* graphics context for the vt window */ |
1317 | gcvalue.foreground = PixColors[Color_fg]; |
1321 | gcvalue.foreground = PixColors[Color_fg]; |
1318 | gcvalue.background = PixColors[Color_bg]; |
1322 | gcvalue.background = PixColors[Color_bg]; |
1319 | gcvalue.graphics_exposures = 1; |
1323 | gcvalue.graphics_exposures = 1; |
1320 | TermWin.gc = XCreateGC(Xdisplay, TermWin.vt, |
1324 | TermWin.gc = XCreateGC(Xdisplay, TermWin.vt, |
1321 | GCForeground | GCBackground |
1325 | GCForeground | GCBackground |
1322 | | GCGraphicsExposures, &gcvalue); |
1326 | | GCGraphicsExposures, &gcvalue); |
1323 | |
1327 | |
1324 | #if defined(MENUBAR) || defined(RXVT_SCROLLBAR) |
1328 | #if defined(MENUBAR) || defined(RXVT_SCROLLBAR) |
1325 | |
1329 | |
1326 | gcvalue.foreground = PixColors[Color_topShadow]; |
1330 | gcvalue.foreground = PixColors[Color_topShadow]; |
1327 | topShadowGC = XCreateGC(Xdisplay, TermWin.vt, |
1331 | topShadowGC = XCreateGC(Xdisplay, TermWin.vt, |
1328 | GCForeground, &gcvalue); |
1332 | GCForeground, &gcvalue); |
1329 | gcvalue.foreground = PixColors[Color_bottomShadow]; |
1333 | gcvalue.foreground = PixColors[Color_bottomShadow]; |
1330 | botShadowGC = XCreateGC(Xdisplay, TermWin.vt, |
1334 | botShadowGC = XCreateGC(Xdisplay, TermWin.vt, |
1331 | GCForeground, &gcvalue); |
1335 | GCForeground, &gcvalue); |
1332 | gcvalue.foreground = PixColors[(XDEPTH <= 2 ? Color_fg |
1336 | gcvalue.foreground = PixColors[(XDEPTH <= 2 ? Color_fg |
1333 | : Color_scroll)]; |
1337 | : Color_scroll)]; |
1334 | scrollbarGC = XCreateGC(Xdisplay, TermWin.vt, |
1338 | scrollbarGC = XCreateGC(Xdisplay, TermWin.vt, |
1335 | GCForeground, &gcvalue); |
1339 | GCForeground, &gcvalue); |
1336 | #endif |
1340 | #endif |
1337 | } |
1341 | } |
1338 | |
1342 | |
1339 | /*----------------------------------------------------------------------*/ |
1343 | /*----------------------------------------------------------------------*/ |
1340 | /* |
1344 | /* |
… | |
… | |
1393 | |
1397 | |
1394 | #ifndef __QNX__ |
1398 | #ifndef __QNX__ |
1395 | /* spin off the command interpreter */ |
1399 | /* spin off the command interpreter */ |
1396 | switch (cmd_pid = fork ()) |
1400 | switch (cmd_pid = fork ()) |
1397 | { |
1401 | { |
1398 | case -1: |
1402 | case -1: |
1399 | rxvt_print_error("can't fork"); |
1403 | rxvt_print_error("can't fork"); |
1400 | return -1; |
1404 | return -1; |
1401 | case 0: |
1405 | case 0: |
1402 | close (cfd); /* only keep tty_fd and STDERR open */ |
1406 | close (cfd); /* only keep tty_fd and STDERR open */ |
1403 | close (Xfd); |
1407 | close (Xfd); |
1404 | if (rxvt_control_tty (tty_fd, ttydev) < 0) |
1408 | if (rxvt_control_tty (tty_fd, ttydev) < 0) |
1405 | rxvt_print_error ("could not obtain control of tty"); |
1409 | rxvt_print_error ("could not obtain control of tty"); |
1406 | else |
1410 | else |
|
|
1411 | { |
|
|
1412 | /* Reopen stdin, stdout and stderr over the tty file descriptor */ |
|
|
1413 | dup2 (tty_fd, STDIN_FILENO); |
|
|
1414 | dup2 (tty_fd, STDOUT_FILENO); |
|
|
1415 | dup2 (tty_fd, STDERR_FILENO); |
|
|
1416 | |
|
|
1417 | if (tty_fd > 2) |
|
|
1418 | close (tty_fd); |
|
|
1419 | |
|
|
1420 | run_child (argv); |
|
|
1421 | } |
|
|
1422 | exit (EXIT_FAILURE); |
|
|
1423 | /* NOTREACHED */ |
|
|
1424 | default: |
1407 | { |
1425 | { |
1408 | /* Reopen stdin, stdout and stderr over the tty file descriptor */ |
1426 | #if defined(HAVE_STRUCT_UTMP) && defined(HAVE_TTYSLOT) |
|
|
1427 | int fdstdin; |
|
|
1428 | |
|
|
1429 | fdstdin = dup (STDIN_FILENO); |
1409 | dup2 (tty_fd, STDIN_FILENO); |
1430 | dup2 (tty_fd, STDIN_FILENO); |
|
|
1431 | #endif |
|
|
1432 | |
|
|
1433 | #ifdef UTMP_SUPPORT |
|
|
1434 | privileged_utmp (SAVE); |
|
|
1435 | #endif |
|
|
1436 | |
|
|
1437 | #if defined(HAVE_STRUCT_UTMP) && defined(HAVE_TTYSLOT) |
|
|
1438 | |
1410 | dup2 (tty_fd, STDOUT_FILENO); |
1439 | dup2 (fdstdin, STDIN_FILENO); |
1411 | dup2 (tty_fd, STDERR_FILENO); |
|
|
1412 | |
|
|
1413 | if (tty_fd > 2) |
|
|
1414 | close (tty_fd); |
1440 | close (fdstdin); |
|
|
1441 | #endif |
1415 | |
1442 | |
1416 | run_child (argv); |
|
|
1417 | } |
1443 | } |
1418 | exit (EXIT_FAILURE); |
|
|
1419 | /* NOTREACHED */ |
|
|
1420 | default: |
|
|
1421 | { |
|
|
1422 | #if defined(HAVE_STRUCT_UTMP) && defined(HAVE_TTYSLOT) |
|
|
1423 | int fdstdin; |
|
|
1424 | |
|
|
1425 | fdstdin = dup (STDIN_FILENO); |
|
|
1426 | dup2 (tty_fd, STDIN_FILENO); |
|
|
1427 | #endif |
|
|
1428 | |
|
|
1429 | #ifdef UTMP_SUPPORT |
|
|
1430 | privileged_utmp (SAVE); |
|
|
1431 | #endif |
|
|
1432 | |
|
|
1433 | #if defined(HAVE_STRUCT_UTMP) && defined(HAVE_TTYSLOT) |
|
|
1434 | |
|
|
1435 | dup2 (fdstdin, STDIN_FILENO); |
|
|
1436 | close (fdstdin); |
|
|
1437 | #endif |
|
|
1438 | |
|
|
1439 | } |
|
|
1440 | close (tty_fd); /* keep STDERR_FILENO, cmd_fd, Xfd open */ |
1444 | close (tty_fd); /* keep STDERR_FILENO, cmd_fd, Xfd open */ |
1441 | break; |
1445 | break; |
1442 | } |
1446 | } |
1443 | #else /* __QNX__ uses qnxspawn() */ |
1447 | #else /* __QNX__ uses qnxspawn() */ |
1444 | fchmod (tty_fd, 0622); |
1448 | fchmod (tty_fd, 0622); |
1445 | fcntl (tty_fd, F_SETFD, FD_CLOEXEC); |
1449 | fcntl (tty_fd, F_SETFD, FD_CLOEXEC); |
1446 | fcntl (cfd, F_SETFD, FD_CLOEXEC); |
1450 | fcntl (cfd, F_SETFD, FD_CLOEXEC); |
… | |
… | |
1480 | { |
1484 | { |
1481 | if (ioctl (fd, SRIOCSREDIR, NULL) < 0) |
1485 | if (ioctl (fd, SRIOCSREDIR, NULL) < 0) |
1482 | close (fd); |
1486 | close (fd); |
1483 | } |
1487 | } |
1484 | #endif /* SRIOCSREDIR */ |
1488 | #endif /* SRIOCSREDIR */ |
|
|
1489 | |
1485 | } |
1490 | } |
1486 | |
1491 | |
1487 | /* reset signals and spin off the command interpreter */ |
1492 | /* reset signals and spin off the command interpreter */ |
1488 | signal (SIGINT, SIG_DFL); |
1493 | signal (SIGINT, SIG_DFL); |
1489 | signal (SIGQUIT, SIG_DFL); |
1494 | signal (SIGQUIT, SIG_DFL); |
… | |
… | |
1584 | } |
1589 | } |
1585 | arg_v = arg_a; |
1590 | arg_v = arg_a; |
1586 | } |
1591 | } |
1587 | iov_a[0] = iov_a[1] = iov_a[2] = tty_fd; |
1592 | iov_a[0] = iov_a[1] = iov_a[2] = tty_fd; |
1588 | cmd_pid = qnx_spawn(0, 0, 0, -1, -1, |
1593 | cmd_pid = qnx_spawn(0, 0, 0, -1, -1, |
1589 | _SPAWN_SETSID | _SPAWN_TCSETPGRP, |
1594 | _SPAWN_SETSID | _SPAWN_TCSETPGRP, |
1590 | command, arg_v, environ, iov_a, 0); |
1595 | command, arg_v, environ, iov_a, 0); |
1591 | if (login) |
1596 | if (login) |
1592 | free(login); |
1597 | free(login); |
1593 | |
1598 | |
1594 | close(tty_fd); |
1599 | close(tty_fd); |
1595 | return cmd_fd; |
1600 | return cmd_fd; |