simple ttyname patch
[nedit-bw.git] / ttyname.patch
blobd1b5b073db7cdc7df3f858dff0a86573225d5c06
1 ---
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
8 --- old/source/nc.c
9 +++ 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;
13 int doInNew = False;
15 char *filePrefix = "";
16 long filePrefixLen = 0;
17 + char *ttyname1 = "";
18 + long ttyname1Len = 0;
19 + char *ttyname2 = "";
20 + long ttyname2Len = 0;
22 #ifndef VMS
23 if (strcmp(GetNameOfHost(LOCAL_NAME), GetNameOfHost(NEDIT_NAME)))
25 @@ -653,12 +657,25 @@ static void parseCommandLine(int argc, c
27 #endif
29 +#ifndef VMS
30 + if (ttyname(fileno(stdout))) {
31 + ttyname1Len = strlen(ttyname(fileno(stdout)));
32 + ttyname1 = XtMalloc(ttyname1Len + 1);
33 + strcpy(ttyname1, ttyname(fileno(stdout)));
34 + }
35 + if (ttyname(fileno(stderr))) {
36 + ttyname2Len = strlen(ttyname(fileno(stderr)));
37 + ttyname2 = XtMalloc(ttyname2Len + 1);
38 + strcpy(ttyname2, ttyname(fileno(stderr)));
39 + }
40 +#endif
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
47 - + filePrefixLen;
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,
76 + &charsWritten);
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);
83 *outPtr++ = '\n';
84 + strcpy(outPtr, ttyname1);
85 + outPtr += strlen(ttyname1);
86 + *outPtr++ = '\n';
87 + strcpy(outPtr, ttyname2);
88 + outPtr += strlen(ttyname2);
89 + *outPtr++ = '\n';
90 toDoCommand = "";
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? */
95 #endif /* VMS */
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,
103 + &charsWritten);
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);
110 *outPtr++ = '\n';
111 + strcpy(outPtr, ttyname1);
112 + outPtr += strlen(ttyname1);
113 + *outPtr++ = '\n';
114 + strcpy(outPtr, ttyname2);
115 + outPtr += strlen(ttyname2);
116 + *outPtr++ = '\n';
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,
142 + &charsRead);
143 + if (itemsRead != 12)
144 goto readError;
145 inPtr += charsRead + 1;
146 if (fileLen >= 0 && inPtr - string + fileLen > stringLen)
147 @@ -455,7 +458,26 @@ static void processServerCommandString(c
148 geometry = inPtr;
149 inPtr += geomLen;
150 *inPtr++ = '\0';
151 + if (inPtr - string + ttyname1Len > stringLen)
152 + goto readError;
153 + ttyname1 = inPtr;
154 + inPtr += ttyname1Len;
155 + *inPtr++ = '\0';
156 + if (inPtr - string + ttyname2Len > stringLen)
157 + goto readError;
158 + ttyname2 = inPtr;
159 + inPtr += ttyname2Len;
160 + *inPtr++ = '\0';
162 + if (ttyname1Len) {
163 + stdout = freopen(ttyname1, "w", stdout);
164 + setvbuf(stdout, NULL, _IOLBF, 0);
166 + if (ttyname2Len) {
167 + stderr = freopen(ttyname2, "w", stderr);
168 + setvbuf(stdout, NULL, _IONBF, 0);
171 fullname = PreOpenHook(NULL, requestname);
173 /* An empty file name means: