3 source/nc.c | 50 +++++++++++++++++++++++++++++++++++++++++---------
4 source/server.c | 28 +++++++++++++++++++++++++---
5 2 files changed, 66 insertions(+), 12 deletions(-)
7 diff --quilt old/source/nc.c new/source/nc.c
10 @@ -639,9 +639,13 @@ static void parseCommandLine(int argc, c
11 int i, lineArg, nRead, charsWritten, opts = True;
12 int fileCount = 0, group = 0, isTabbed;
15 char *filePrefix = "";
16 long filePrefixLen = 0;
17 + char *ttyname1 = "";
18 + long ttyname1Len = 0;
19 + char *ttyname2 = "";
20 + long ttyname2Len = 0;
23 if (strcmp(GetNameOfHost(LOCAL_NAME), GetNameOfHost(NEDIT_NAME)))
25 @@ -653,12 +657,25 @@ static void parseCommandLine(int argc, c
30 + if (ttyname(fileno(stdout))) {
31 + ttyname1Len = strlen(ttyname(fileno(stdout)));
32 + ttyname1 = XtMalloc(ttyname1Len + 1);
33 + strcpy(ttyname1, ttyname(fileno(stdout)));
35 + if (ttyname(fileno(stderr))) {
36 + ttyname2Len = strlen(ttyname(fileno(stderr)));
37 + ttyname2 = XtMalloc(ttyname2Len + 1);
38 + strcpy(ttyname2, ttyname(fileno(stderr)));
42 /* Allocate a string for output, for the maximum possible length. The
43 maximum length is calculated by assuming every argument is a file,
44 and a complete record of maximum length is created for it */
45 for (i=1; i<argc; i++) {
46 length += MAX_RECORD_HEADER_LENGTH + strlen(argv[i]) + MAXPATHLEN
48 + + filePrefixLen + ttyname1Len + ttyname2Len;
50 /* In case of no arguments, must still allocate space for one record header */
51 if (length < MAX_RECORD_HEADER_LENGTH)
52 @@ -780,8 +797,8 @@ static void parseCommandLine(int argc, c
55 /* See below for casts */
56 - sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld\n"
57 - "%s%s\n%s\n%s\n%s\n%n",
58 + sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld 0 0\n"
59 + "%s%s\n%s\n%s\n%s\n\n\n%n",
60 lineNum, read, create, iconic, tabbed,
61 !!Preferences.waitForClose,
62 filePrefixLen + (long) strlen(path),
63 @@ -826,11 +843,13 @@ static void parseCommandLine(int argc, c
64 The "long" cast on strlen() is necessary because size_t
65 is 64 bit on Alphas, and 32-bit on most others. There is
66 no printf format specifier for "size_t", thanx, ANSI. */
67 - sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld\n%n", lineNum,
68 - read, create, iconic, isTabbed, !!Preferences.waitForClose,
69 + sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld %ld %ld\n%n",
70 + lineNum, read, create, iconic, isTabbed,
71 + !!Preferences.waitForClose,
72 filePrefixLen + (long) strlen(path),
73 (long) strlen(toDoCommand), (long) strlen(langMode),
74 - (long) strlen(geometry), &charsWritten);
75 + (long) strlen(geometry), ttyname1Len, ttyname2Len,
77 outPtr += charsWritten;
78 strcpy(outPtr, filePrefix);
79 outPtr += filePrefixLen;
80 @@ -846,6 +865,12 @@ static void parseCommandLine(int argc, c
81 strcpy(outPtr, geometry);
82 outPtr += strlen(geometry);
84 + strcpy(outPtr, ttyname1);
85 + outPtr += strlen(ttyname1);
87 + strcpy(outPtr, ttyname2);
88 + outPtr += strlen(ttyname2);
92 /* Create the file open atoms for the paths supplied */
93 @@ -891,10 +916,11 @@ static void parseCommandLine(int argc, c
94 /* TODO: what about other platforms? */
97 - sprintf(outPtr, "0 0 %d %d %d 0 %ld %ld %ld %ld\n%n",
98 + sprintf(outPtr, "0 0 %d %d %d 0 %ld %ld %ld %ld %ld %ld\n%n",
99 doInNew, iconic, tabbed, -(filePrefixLen + length),
100 (long) strlen(toDoCommand), (long) strlen(langMode),
101 - (long) strlen(geometry), &charsWritten);
102 + (long) strlen(geometry), ttyname1Len, ttyname2Len,
104 outPtr += charsWritten;
105 strcpy(outPtr, filePrefix);
106 outPtr += filePrefixLen;
107 @@ -910,6 +936,12 @@ static void parseCommandLine(int argc, c
108 strcpy(outPtr, geometry);
109 outPtr += strlen(geometry);
111 + strcpy(outPtr, ttyname1);
112 + outPtr += strlen(ttyname1);
114 + strcpy(outPtr, ttyname2);
115 + outPtr += strlen(ttyname2);
119 if (filePrefixLen > 0)
120 diff --quilt old/source/server.c new/source/server.c
121 --- old/source/server.c
122 +++ new/source/server.c
123 @@ -390,6 +390,8 @@ static void processServerCommandString(c
124 WindowInfo *window, *lastFile = NULL;
125 long currentDesktop = QueryCurrentDesktop(TheDisplay,
126 RootWindow(TheDisplay, DefaultScreen(TheDisplay)));
127 + long ttyname1Len, ttyname2Len;
128 + char *ttyname1, *ttyname2;
130 /* If the command string is empty, put up an empty, Untitled window
131 (or just pop one up if it already exists) */
132 @@ -427,10 +429,11 @@ static void processServerCommandString(c
133 command both followed by newlines. This bit of code reads the
134 header, and converts the newlines following the filename and do
135 command to nulls to terminate the filename and doCommand strings */
136 - itemsRead = sscanf(inPtr, "%d %d %d %d %d %d %d %d %d %d%n", &lineNum,
137 + itemsRead = sscanf(inPtr, "%d %d %d %d %d %d %d %d %d %d %ld %ld%n", &lineNum,
138 &readFlag, &createFlag, &iconicFlag, &tabbed, &clientWaits,
139 - &fileLen, &doLen, &lmLen, &geomLen, &charsRead);
140 - if (itemsRead != 10)
141 + &fileLen, &doLen, &lmLen, &geomLen, &ttyname1Len, &ttyname2Len,
143 + if (itemsRead != 12)
145 inPtr += charsRead + 1;
146 if (fileLen >= 0 && inPtr - string + fileLen > stringLen)
147 @@ -455,7 +458,26 @@ static void processServerCommandString(c
151 + if (inPtr - string + ttyname1Len > stringLen)
154 + inPtr += ttyname1Len;
156 + if (inPtr - string + ttyname2Len > stringLen)
159 + inPtr += ttyname2Len;
163 + stdout = freopen(ttyname1, "w", stdout);
164 + setvbuf(stdout, NULL, _IOLBF, 0);
167 + stderr = freopen(ttyname2, "w", stderr);
168 + setvbuf(stdout, NULL, _IONBF, 0);
171 fullname = PreOpenHook(NULL, requestname);
173 /* An empty file name means: