3 source/nc.c | 51 ++++++++++++++++++++++++++++++++++++++++++---------
4 source/server.c | 28 +++++++++++++++++++++++++---
5 2 files changed, 67 insertions(+), 12 deletions(-)
7 diff --quilt old/source/nc.c new/source/nc.c
10 @@ -639,9 +639,14 @@ 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;
21 + const char *ttynameTmp;
24 if (strcmp(GetNameOfHost(LOCAL_NAME), GetNameOfHost(NEDIT_NAME)))
26 @@ -653,12 +658,25 @@ static void parseCommandLine(int argc, c
31 + if ((ttynameTmp = ttyname(fileno(stdout)))) {
32 + ttyname1Len = strlen(ttynameTmp);
33 + ttyname1 = XtMalloc(ttyname1Len + 1);
34 + strcpy(ttyname1, ttynameTmp);
36 + if ((ttynameTmp = ttyname(fileno(stderr)))) {
37 + ttyname2Len = strlen(ttynameTmp);
38 + ttyname2 = XtMalloc(ttyname2Len + 1);
39 + strcpy(ttyname2, ttynameTmp);
43 /* Allocate a string for output, for the maximum possible length. The
44 maximum length is calculated by assuming every argument is a file,
45 and a complete record of maximum length is created for it */
46 for (i=1; i<argc; i++) {
47 length += MAX_RECORD_HEADER_LENGTH + strlen(argv[i]) + MAXPATHLEN
49 + + filePrefixLen + ttyname1Len + ttyname2Len;
51 /* In case of no arguments, must still allocate space for one record header */
52 if (length < MAX_RECORD_HEADER_LENGTH)
53 @@ -780,8 +798,8 @@ static void parseCommandLine(int argc, c
56 /* See below for casts */
57 - sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld\n"
58 - "%s%s\n%s\n%s\n%s\n%n",
59 + sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld 0 0\n"
60 + "%s%s\n%s\n%s\n%s\n\n\n%n",
61 lineNum, read, create, iconic, tabbed,
62 !!Preferences.waitForClose,
63 filePrefixLen + (long) strlen(path),
64 @@ -826,11 +844,13 @@ static void parseCommandLine(int argc, c
65 The "long" cast on strlen() is necessary because size_t
66 is 64 bit on Alphas, and 32-bit on most others. There is
67 no printf format specifier for "size_t", thanx, ANSI. */
68 - sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld\n%n", lineNum,
69 - read, create, iconic, isTabbed, !!Preferences.waitForClose,
70 + sprintf(outPtr, "%d %d %d %d %d %d %ld %ld %ld %ld %ld %ld\n%n",
71 + lineNum, read, create, iconic, isTabbed,
72 + !!Preferences.waitForClose,
73 filePrefixLen + (long) strlen(path),
74 (long) strlen(toDoCommand), (long) strlen(langMode),
75 - (long) strlen(geometry), &charsWritten);
76 + (long) strlen(geometry), ttyname1Len, ttyname2Len,
78 outPtr += charsWritten;
79 strcpy(outPtr, filePrefix);
80 outPtr += filePrefixLen;
81 @@ -846,6 +866,12 @@ static void parseCommandLine(int argc, c
82 strcpy(outPtr, geometry);
83 outPtr += strlen(geometry);
85 + strcpy(outPtr, ttyname1);
86 + outPtr += ttyname1Len;
88 + strcpy(outPtr, ttyname2);
89 + outPtr += ttyname2Len;
93 /* Create the file open atoms for the paths supplied */
94 @@ -891,10 +917,11 @@ static void parseCommandLine(int argc, c
95 /* TODO: what about other platforms? */
98 - sprintf(outPtr, "0 0 %d %d %d 0 %ld %ld %ld %ld\n%n",
99 + sprintf(outPtr, "0 0 %d %d %d 0 %ld %ld %ld %ld %ld %ld\n%n",
100 doInNew, iconic, tabbed, -(filePrefixLen + length),
101 (long) strlen(toDoCommand), (long) strlen(langMode),
102 - (long) strlen(geometry), &charsWritten);
103 + (long) strlen(geometry), ttyname1Len, ttyname2Len,
105 outPtr += charsWritten;
106 strcpy(outPtr, filePrefix);
107 outPtr += filePrefixLen;
108 @@ -910,6 +937,12 @@ static void parseCommandLine(int argc, c
109 strcpy(outPtr, geometry);
110 outPtr += strlen(geometry);
112 + strcpy(outPtr, ttyname1);
113 + outPtr += ttyname1Len;
115 + strcpy(outPtr, ttyname2);
116 + outPtr += ttyname2Len;
120 if (filePrefixLen > 0)
121 diff --quilt old/source/server.c new/source/server.c
122 --- old/source/server.c
123 +++ new/source/server.c
124 @@ -390,6 +390,8 @@ static void processServerCommandString(c
125 WindowInfo *window, *lastFile = NULL;
126 long currentDesktop = QueryCurrentDesktop(TheDisplay,
127 RootWindow(TheDisplay, DefaultScreen(TheDisplay)));
128 + long ttyname1Len, ttyname2Len;
129 + char *ttyname1, *ttyname2;
131 /* If the command string is empty, put up an empty, Untitled window
132 (or just pop one up if it already exists) */
133 @@ -427,10 +429,11 @@ static void processServerCommandString(c
134 command both followed by newlines. This bit of code reads the
135 header, and converts the newlines following the filename and do
136 command to nulls to terminate the filename and doCommand strings */
137 - itemsRead = sscanf(inPtr, "%d %d %d %d %d %d %d %d %d %d%n", &lineNum,
138 + itemsRead = sscanf(inPtr, "%d %d %d %d %d %d %d %d %d %d %ld %ld%n", &lineNum,
139 &readFlag, &createFlag, &iconicFlag, &tabbed, &clientWaits,
140 - &fileLen, &doLen, &lmLen, &geomLen, &charsRead);
141 - if (itemsRead != 10)
142 + &fileLen, &doLen, &lmLen, &geomLen, &ttyname1Len, &ttyname2Len,
144 + if (itemsRead != 12)
146 inPtr += charsRead + 1;
147 if (fileLen >= 0 && inPtr - string + fileLen > stringLen)
148 @@ -455,7 +458,26 @@ static void processServerCommandString(c
152 + if (inPtr - string + ttyname1Len > stringLen)
155 + inPtr += ttyname1Len;
157 + if (inPtr - string + ttyname2Len > stringLen)
160 + inPtr += ttyname2Len;
164 + stdout = freopen(ttyname1, "w", stdout);
165 + setvbuf(stdout, NULL, _IOLBF, 0);
168 + stderr = freopen(ttyname2, "w", stderr);
169 + setvbuf(stdout, NULL, _IONBF, 0);
172 fullname = PreOpenHook(NULL, requestname);
174 /* An empty file name means: