annotate uip/msh.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children 441a2190cfae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* msh.c - The MH shell (sigh) */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 static char ident[] = "@(#)$Id$";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 /* TODO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 Keep more status information in maildrop map
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include "../h/dropsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include "../h/formatsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include "../h/scansbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #include "../zotnet/mts.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #include <sys/types.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #ifndef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #include <sgtty.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #else /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #include <termio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #ifndef NOIOCTLH
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #include <sys/ioctl.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #endif /* NOIOCTLH */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #include <pwd.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 #include <setjmp.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #include "../h/mshsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 #include "../h/vmhsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 #ifdef READLINE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #include <readline/readline.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 #ifndef MIME
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 #define MIMEminc(a) (a)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 #define MIMEminc(a) 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 #define QUOTE '\\' /* sigh */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 static struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 #define IDSW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 "idstart number", -7, /* interface from bbc */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53 #define FDSW 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 "idstop number", -6, /* .. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 #define QDSW 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 "idquit number", -6, /* .. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 #define NMSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 "idname BBoard", -6, /* .. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 #define PRMPTSW 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 "prompt string", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 #define SCANSW 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 "scan", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 #define NSCANSW 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 "noscan", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 #define READSW 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 "vmhread fd", -7,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 #define WRITESW 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 "vmhwrite fd", -8,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73 #define PREADSW 9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 "popread fd", -7,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 #define PWRITSW 10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 "popwrite fd", -8,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 #define TCURSW 11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 "topcur", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 #define NTCURSW 12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 "notopcur", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83 #define HELPSW 13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 "help", 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 /* FOLDER */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 char *fmsh = NULL; /* folder instead of file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 int modified; /* command modified folder */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 struct msgs *mp; /* used a lot */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 static int nMsgs = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 struct Msg *Msgs = NULL; /* Msgs[0] not used */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 static FILE *fp; /* input file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 static FILE *yp = NULL; /* temporary file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 static int mode; /* mode of file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 static int numfds = 0; /* number of files cached */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 static int maxfds = 0; /* number of files cached to be cached */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 static time_t mtime = (time_t) 0;/* mtime of file */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 /* VMH */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 #define ALARM ((unsigned int) 10)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 #define ttyN(c) ttyNaux ((c), NULLCP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 static int vmh = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 static int vmhpid = OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 static int vmhfd0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 static int vmhfd1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 static int vmhfd2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 static int vmhtty = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 #define SCAN 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 #define STATUS 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 #define DISPLAY 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 #define NWIN DISPLAY
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 static int topcur = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 static int numwins = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 static int windows[NWIN + 1];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 static jmp_buf peerenv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 void padios (), padvise ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 static TYPESIG alrmser ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 /* POP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 int pmsh = 0; /* BPOP enabled */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 extern char response[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 /* PARENT */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 static int pfd = NOTOK; /* fd parent is reading from */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 static int ppid = 0; /* pid of parent */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 /* COMMAND */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 int interactive; /* running from a /dev/tty */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 int redirected; /* re-directing output */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 FILE *sp = NULL; /* original stdout */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 char *cmd_name; /* command being run */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 char myfilter[BUFSIZ]; /* path to mhl.forward */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 static char *myprompt = "(%s) ";/* prompting string */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 /* BBOARDS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 static int gap; /* gap in BBoard-ID:s */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 static char *myname = NULL; /* BBoard name */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 char *BBoard_ID = "BBoard-ID";/* BBoard-ID constant */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166 /* SIGNALS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 TYPESIG (*istat) (); /* original SIGINT */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 static TYPESIG (*pstat) (); /* current SIGPIPE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 TYPESIG (*qstat) (); /* original SIGQUIT */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 #ifdef SIGTSTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 static TYPESIG (*tstat) (); /* original SIGTSTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 #endif /* SIGTSTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 int interrupted; /* SIGINT detected */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 int broken_pipe; /* SIGPIPE detected */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 int told_to_quit; /* SIGQUIT detected */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 #if defined(BSD42) || defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 int should_intr; /* signal handler should interrupt call */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 jmp_buf sigenv; /* the environment pointer */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 static TYPESIG intrser (), pipeser (), quitser ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 #ifndef __STDC__
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 #ifdef SYS5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 struct passwd *getpwnam ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 #endif /* SYS5 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 static int read_map(), read_file(), check_folder(), getargs(), parse();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 static int getcmds(), init_io(), initaux_io(), finaux_io(), peerwait();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 static int pINI(), pQRY(), pQRY1(), pQRY2(), pCMD(), pFIN();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 static int ttyR(), ttyNaux(), winN(), winR(), winX();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 static msh(), m_gMsgs(), scanrange(), scanstring(), quit();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 static fin_io(), m_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 static int read_pop();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 char **argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 int id = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 scansw = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 vmh1 = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 vmh2 = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 int pmsh1 = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 pmsh2 = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 *file = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 *folder = NULL,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 **ap,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 **argp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 buf[80],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 *arguments[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 invo_name = r1bindex (argv[0], '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231 mts_init (invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 if ((cp = m_find (invo_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 ap = brkstring (cp = getcpy (cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 ap = copyip (ap, arguments);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 ap = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 (void) copyip (argv + 1, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 argp = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 while (cp = *argp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 switch (smatch (++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 ambigsw (cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 adios (NULLCP, "-%s unknown", cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 (void) sprintf (buf, "%s [switches] file", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 help (buf, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 case IDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 if ((id = atoi (cp)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 case FDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 if ((pfd = atoi (cp)) <= 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 case QDSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 if ((ppid = atoi (cp)) <= 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 case NMSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 if (!(myname = *argp++) || *myname == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 case SCANSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 scansw++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 case NSCANSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 scansw = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 case PRMPTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 if (!(myprompt = *argp++) || *myprompt == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 case READSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 if ((vmh1 = atoi (cp)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 case WRITESW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 if ((vmh2 = atoi (cp)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 case PREADSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 if ((pmsh1 = atoi (cp)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 case PWRITSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 if (!(cp = *argp++) || *cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316 if ((pmsh2 = atoi (cp)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 adios (NULLCP, "bad argument %s %s", argp[-2], cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 case TCURSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 topcur++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 case NTCURSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 topcur = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 if (*cp == '+' || *cp == '@') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 if (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 adios (NULLCP, "only one folder at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 if (file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 adios (NULLCP, "only one file at a time!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 file = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 if (!file && !folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 file = "./msgbox";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 if (file && folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 adios (NULLCP, "use a file or a folder, not both");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 (void) strcpy (myfilter, libpath (mhlforward));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 #ifdef FIOCLEX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 if (pfd > 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 (void) ioctl (pfd, FIOCLEX, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 #endif /* FIOCLEX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 #if defined(BSD42) || defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 should_intr = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 setsigx (istat, SIGINT, intrser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 setsigx (qstat, SIGQUIT, quitser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 (void) sc_width (); /* MAGIC... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 if (vmh = vmh1 && vmh2) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 (void) rcinit (vmh1, vmh2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 (void) pINI ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 (void) signal (SIGINT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 (void) signal (SIGQUIT, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 #ifdef SIGTSTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 tstat = signal (SIGTSTP, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 #endif /* SIGTSTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 if (pmsh = pmsh1 && pmsh2) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 cp = getenv ("MHPOPDEBUG");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 #ifdef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 if (pop_set (pmsh1, pmsh2, cp && *cp, myname) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 if (pop_set (pmsh1, pmsh2, cp && *cp) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 padios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 if (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 file = folder, folder = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 if (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 fsetup (folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 setup (file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 readids (id);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 display_info (id > 0 ? scansw : 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 msh (id > 0 ? scansw : 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 m_reset ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 done (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 static struct swit mshcmds[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 #define ADVCMD 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 "advance", -7,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 #define ALICMD 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 "ali", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 #define EXPLCMD 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 "burst", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 #define COMPCMD 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 "comp", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 #define DISTCMD 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 "dist", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 #define EXITCMD 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 "exit", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 #define FOLDCMD 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 "folder", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 #define FORWCMD 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 "forw", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 #define HELPCMD 8
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 "help", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 #define INCMD 9
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 "inc", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 #define MARKCMD 10
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 "mark", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 #define MAILCMD 11
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 "mhmail", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 #define MHNCMD 12
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 "mhn", MIMEminc(-3),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 #define MSGKCMD 13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 "msgchk", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 #define NEXTCMD 14
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 "next", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 #define PACKCMD 15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 "packf", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 #define PICKCMD 16
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 "pick", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 #define PREVCMD 17
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 "prev", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 #define QUITCMD 18
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 "quit", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 #define FILECMD 19
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 "refile", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 #define REPLCMD 20
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 "repl", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 #define RMMCMD 21
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 "rmm", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 #define SCANCMD 22
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 "scan", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 #define SENDCMD 23
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 "send", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 #define SHOWCMD 24
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 "show", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 #define SORTCMD 25
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 "sortm", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 #define WHATCMD 26
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 "whatnow", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 #define WHOMCMD 27
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 "whom", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 static msh (scansw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 int scansw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 register char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 **ap;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 char prompt[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471 *vec[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 struct Cmd typein;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 static int once_only = ADVCMD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 (void) sprintf (prompt, myprompt, invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 cmdp = &typein;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 #ifdef READLINE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 (void) initialize_readline();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 if (yp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 (void) fclose (yp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 yp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 if (vmh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 if ((i = getcmds (mshcmds, cmdp, scansw)) == EOF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 (void) rcdone ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 (void) check_folder (scansw);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 if ((i = getargs (prompt, mshcmds, cmdp)) == EOF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 (void) putchar ('\n');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500 cmd_name = mshcmds[i].sw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 switch (i) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 case QUITCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 quit ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 case ADVCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 if (once_only == ADVCMD)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 once_only = i = SHOWCMD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 i = mp -> curmsg != mp -> hghmsg ? NEXTCMD : EXITCMD;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 cmd_name = mshcmds[i].sw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513 /* and fall... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515 case EXITCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 case EXPLCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 case FOLDCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 case FORWCMD: /* sigh */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 case MARKCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 case NEXTCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521 case PACKCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 case PICKCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 case PREVCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 case RMMCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 case SHOWCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 case SCANCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 case SORTCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 if ((cp = m_find (cmd_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 ap = brkstring (cp = getcpy (cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 ap = copyip (ap, vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 ap = vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 cp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 ap = vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 (void) copyip (cmdp -> args + 1, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543 m_init ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545 if (!vmh && init_io (cmdp, vmh) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 if (cp != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 modified = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 redirected = vmh || cmdp -> direction != STDIO;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 switch (i) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 case ALICMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 case COMPCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 case INCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557 case MAILCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 case MSGKCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 case SENDCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 case WHATCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 case WHOMCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 if (!vmh || ttyN (cmdp) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 forkcmd (vec, cmd_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 case DISTCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 if (!vmh || ttyN (cmdp) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 distcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 case EXPLCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 explcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576 case FILECMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 if (!vmh
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 || (filehak (vec) == OK ? ttyN (cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 : winN (cmdp, DISPLAY, 1)) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 filecmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 case FOLDCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 foldcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 case FORWCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 if (!vmh || ttyN (cmdp) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590 forwcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593 case HELPCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 helpcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 case EXITCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 case MARKCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 markcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 case MHNCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 #ifdef MIME
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 if (!vmh || ttyN (cmdp) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 mhncmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 case NEXTCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612 case PREVCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 case SHOWCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 showcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 case PACKCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 if (!vmh
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620 || (packhak (vec) == OK ? ttyN (cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 : winN (cmdp, DISPLAY, 1)) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 packcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 case PICKCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 pickcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 case REPLCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 if (!vmh || ttyN (cmdp) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 replcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 case RMMCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 rmmcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640 case SCANCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 scancmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 case SORTCMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646 if (!vmh || winN (cmdp, DISPLAY, 1) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 sortcmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651 padios (NULLCP, "no dispatch for %s", cmd_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 if (vmh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 if (vmhtty != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 (void) ttyR (cmdp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 if (vmhpid > OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 (void) winR (cmdp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661 fin_io (cmdp, vmh);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 if (cp != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 if (i == EXITCMD) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 quit ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 fsetup (folder)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 char *folder;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676 register int msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 char *maildir;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 maildir = m_maildir (folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 if (chdir (maildir) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 padios (maildir, "unable to change directory to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 if (!(mp = m_gmsg (folder)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 padios (NULLCP, "unable to read folder %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 if (mp -> hghmsg == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 padios (NULLCP, "no messages in %s", folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 mode = m_gmprot ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 mtime = stat (mp -> foldpath, &st) != NOTOK ? st.st_mtime : 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 m_gMsgs (mp -> hghmsg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 for (msgnum = mp -> lowmsg; msgnum <= mp -> hghmsg; msgnum++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694 Msgs[msgnum].m_bboard_id = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 Msgs[msgnum].m_top = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 Msgs[msgnum].m_start = Msgs[msgnum].m_stop = 0L;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 Msgs[msgnum].m_scanl = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 m_init ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 fmsh = getcpy (folder);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 #if !defined(BSD42) && !defined(linux) && defined(_NFILE)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 maxfds = _NFILE / 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 #else /* BSD42 || linux */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 maxfds = getdtablesize () / 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 #endif /* BSD42 || linux */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709 if ((maxfds -= 2) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 maxfds = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 setup (file)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 char tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 if (pmsh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727 (void) strcpy (tmpfil, m_tmpfil (invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 if ((fp = fopen (tmpfil, "w+")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 padios (tmpfil, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 if ((fp = fopen (file, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 padios (file, "unable to read");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736 #ifdef FIOCLEX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737 (void) ioctl (fileno (fp), FIOCLEX, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 #endif /* FIOCLEX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 if (fstat (fileno (fp), &st) != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 mode = (int) (st.st_mode & 0777), mtime = st.st_mtime;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 msgp = read_map (file, (long) st.st_size);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 mode = m_gmprot (), mtime = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 msgp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748 if ((msgp = read_file (msgp ? Msgs[msgp].m_stop : 0L, msgp + 1)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 padios (NULLCP, "no messages in %s", myname ? myname : file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 mp = (struct msgs *) calloc ((unsigned) 1, MHSIZE (mp, 1, msgp + 1));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 if (mp == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 padios (NULLCP, "unable to allocate folder storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 mp -> hghmsg = msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 mp -> nummsg = msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757 mp -> lowmsg = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 mp -> curmsg = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 mp -> foldpath = getcpy (myname ? myname : file);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 mp -> msgflags = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 if (pmsh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 mp -> msgflags |= READONLY;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 (void) stat (file, &st);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 if (st.st_uid != getuid () || access (file, 02) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 mp -> msgflags |= READONLY;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 mp -> lowoff = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 mp -> hghoff = mp -> hghmsg + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 #ifdef MTR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777 mp -> msgstats = (short *)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 calloc ((unsigned) 1, MHSIZEX (mp, mp -> lowmsg, mp -> hghmsg));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 if (mp -> msgstats == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780 padios (NULLCP, "unable to allocate messages storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 mp -> msgstats = (mp -> msgbase = mp -> msgstats) - mp -> lowoff;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782 if (mp -> msgstats < (short *)0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 padios (NULLCP, "setup() botch -- you lose big");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 #endif /* MTR */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 if (pmsh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 for (i = mp -> lowmsg; i <= mp -> hghmsg; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 Msgs[i].m_top = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 mp -> msgstats[i] = EXISTS | VIRTUAL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 for (i = mp -> lowmsg; i <= mp -> hghmsg; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 if (Msgs[i].m_top) /* set in read_pop() */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 mp -> msgstats[i] = EXISTS | VIRTUAL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 for (i = mp -> lowmsg; i <= mp -> hghmsg; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802 mp -> msgstats[i] = EXISTS;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 m_init ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 mp -> msgattrs[0] = getcpy ("unseen");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 mp -> msgattrs[1] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 m_unknown (fp); /* the MAGIC invocation */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 if (fmsh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 free (fmsh);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811 fmsh = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 static int read_map (file, size)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 char *file;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 long size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 register int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822 msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 register struct drop *dp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 struct drop *rp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 if (pmsh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 return read_pop ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 if ((i = map_read (file, size, &rp, 1)) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 m_gMsgs (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837 msgp = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 for (dp = rp + 1; i-- > 0; msgp++, dp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 mp = &Msgs[msgp].m_drop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 mp -> d_id = dp -> d_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 mp -> d_size = dp -> d_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842 mp -> d_start = dp -> d_start;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 mp -> d_stop = dp -> d_stop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 Msgs[msgp].m_scanl = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
845 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
846 free ((char *) rp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
847
bce86c4163a3 Initial revision
kono
parents:
diff changeset
848 return (msgp - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
849 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
850
bce86c4163a3 Initial revision
kono
parents:
diff changeset
851 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
852
bce86c4163a3 Initial revision
kono
parents:
diff changeset
853 static int read_file (pos, msgp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
854 register long pos;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
855 register int msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
856 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
857 register int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
858 register struct drop *dp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
859 *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
860 struct drop *rp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
861
bce86c4163a3 Initial revision
kono
parents:
diff changeset
862 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
863 if (pmsh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
864 return (msgp - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
865 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
866
bce86c4163a3 Initial revision
kono
parents:
diff changeset
867 if ((i = mbx_read (fp, pos, &rp, 1)) <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
868 return (msgp - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
869
bce86c4163a3 Initial revision
kono
parents:
diff changeset
870 m_gMsgs ((msgp - 1) + i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
871
bce86c4163a3 Initial revision
kono
parents:
diff changeset
872 for (dp = rp; i-- > 0; msgp++, dp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
873 mp = &Msgs[msgp].m_drop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
874 mp -> d_id = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
875 mp -> d_size = dp -> d_size;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
876 mp -> d_start = dp -> d_start;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
877 mp -> d_stop = dp -> d_stop;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
878 Msgs[msgp].m_scanl = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
879 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
880 free ((char *) rp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
881
bce86c4163a3 Initial revision
kono
parents:
diff changeset
882 return (msgp - 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
883 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
884
bce86c4163a3 Initial revision
kono
parents:
diff changeset
885 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
886
bce86c4163a3 Initial revision
kono
parents:
diff changeset
887 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
888 #ifdef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
889 static int pop_base = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
890
bce86c4163a3 Initial revision
kono
parents:
diff changeset
891 static int pop_statmsg (s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
892 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
893 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
894 register int i, n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
895
bce86c4163a3 Initial revision
kono
parents:
diff changeset
896 n = (i = atoi (s)) - pop_base; /* s="nnn header-line..." */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
897 Msgs[n].m_top = Msgs[n].m_bboard_id = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
898 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
899
bce86c4163a3 Initial revision
kono
parents:
diff changeset
900 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
901 static int read_pop () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
902 int nmsgs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
903 nbytes;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
904
bce86c4163a3 Initial revision
kono
parents:
diff changeset
905 if (pop_stat (&nmsgs, &nbytes) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
906 padios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
907
bce86c4163a3 Initial revision
kono
parents:
diff changeset
908 m_gMsgs (nmsgs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
909
bce86c4163a3 Initial revision
kono
parents:
diff changeset
910 #ifdef NNTP /* this makes read_pop() do some real work... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
911 pop_base = nbytes - 1; /* nmsgs=last-first+1, nbytes=first */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
912 pop_exists (pop_statmsg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
913 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
914 return nmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
915 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
916
bce86c4163a3 Initial revision
kono
parents:
diff changeset
917
bce86c4163a3 Initial revision
kono
parents:
diff changeset
918 static int pop_action (s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
919 register char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
920 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
921 fprintf (yp, "%s\n", s);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
922 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
923 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
924
bce86c4163a3 Initial revision
kono
parents:
diff changeset
925 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
926
bce86c4163a3 Initial revision
kono
parents:
diff changeset
927 static m_gMsgs (n)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
928 int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
929 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
930 int nmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
931
bce86c4163a3 Initial revision
kono
parents:
diff changeset
932 if (Msgs == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
933 nMsgs = n + MAXFOLDER / 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
934 Msgs = (struct Msg *) calloc ((unsigned) (nMsgs + 2), sizeof *Msgs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
935 if (Msgs == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
936 padios (NULLCP, "unable to allocate Msgs structure");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
937 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
938 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
939
bce86c4163a3 Initial revision
kono
parents:
diff changeset
940 if (nMsgs >= n)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
941 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
942
bce86c4163a3 Initial revision
kono
parents:
diff changeset
943 nmsgs = nMsgs + n + MAXFOLDER / 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
944 Msgs = (struct Msg *) realloc ((char *) Msgs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
945 (unsigned) (nmsgs + 2) * sizeof *Msgs);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
946 if (Msgs == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
947 padios (NULLCP, "unable to reallocate Msgs structure");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
948 bzero ((char *) (Msgs + nMsgs + 2),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
949 (unsigned) ((nmsgs - nMsgs) * sizeof *Msgs));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
950
bce86c4163a3 Initial revision
kono
parents:
diff changeset
951 nMsgs = nmsgs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
952 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
953
bce86c4163a3 Initial revision
kono
parents:
diff changeset
954 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
955
bce86c4163a3 Initial revision
kono
parents:
diff changeset
956 FILE *msh_ready (msgnum, full)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
957 register int msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
958 int full;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
959 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
960 register int msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
961 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
962 long pos1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
963 pos2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
964 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
965 tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
966
bce86c4163a3 Initial revision
kono
parents:
diff changeset
967 if (yp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
968 (void) fclose (yp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
969 yp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
970 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
971
bce86c4163a3 Initial revision
kono
parents:
diff changeset
972 if (fmsh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
973 if ((fd = Msgs[msgnum].m_top) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
974 if (numfds >= maxfds)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
975 for (msgp = mp -> lowmsg; msgp <= mp -> hghmsg; msgp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
976 if (Msgs[msgp].m_top != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
977 (void) close (Msgs[msgp].m_top);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
978 Msgs[msgp].m_top = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
979 numfds--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
980 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
981 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
982
bce86c4163a3 Initial revision
kono
parents:
diff changeset
983 if ((fd = open (cp = m_name (msgnum), 0)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
984 padios (cp, "unable to open message");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
985 Msgs[msgnum].m_top = fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
986 numfds++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
987 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
988
bce86c4163a3 Initial revision
kono
parents:
diff changeset
989 if ((fd = dup (fd)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
990 padios ("cached message", "unable to dup");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
991 if ((yp = fdopen (fd, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
992 padios (NULLCP, "unable to fdopen cached message");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
993 (void) fseek (yp, 0L, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
994 return yp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
995 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
996
bce86c4163a3 Initial revision
kono
parents:
diff changeset
997 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
998 if (pmsh && (mp -> msgstats[msgnum] & VIRTUAL)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
999 if (Msgs[msgnum].m_top == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1000 padios (NULLCP, "msh_ready (%d, %d) botch", msgnum, full);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1001 if (!full) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1002 (void) strcpy (tmpfil, m_tmpfil (invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1003 if ((yp = fopen (tmpfil, "w+")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1004 padios (tmpfil, "unable to create");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1005 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1006
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1007 if (pop_top (Msgs[msgnum].m_top, 4, pop_action) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1008 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1009 padios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1010 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1011 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1012 if (strncmp(response, "423 ", 4) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1013 /* 423 no such article number in this group */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1014 fprintf (yp, "Expired:\n\n"); /* dummy */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1015 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1016 padios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1017 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1018 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1019
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1020 m_eomsbr ((int (*)()) 0); /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1021 msg_style = MS_DEFAULT; /* .. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1022 (void) fseek (yp, 0L, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1023 return yp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1024 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1025
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1026 (void) fseek (fp, 0L, 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1027 (void) fwrite (mmdlm1, 1, strlen (mmdlm1), fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1028 if (fflush (fp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1029 padios ("temporary file", "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1030 (void) fseek (fp, 0L, 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1031 pos1 = ftell (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1032
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1033 yp = fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1034 if (pop_retr (Msgs[msgnum].m_top, pop_action) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1035 #ifndef NNTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1036 padios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1037 #else /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1038 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1039 if (strncmp(response, "423 ", 4) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1040 /* 423 no such article number in this group */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1041 fprintf (yp, "Expired:\n\n"); /* dummy */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1042 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1043 padios (NULLCP, "%s", response);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1044 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1045 #endif /* NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1046 yp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1047
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1048 (void) fseek (fp, 0L, 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1049 pos2 = ftell (fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1050 (void) fwrite (mmdlm2, 1, strlen (mmdlm2), fp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1051 if (fflush (fp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1052 padios ("temporary file", "write error on");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1053
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1054 Msgs[msgnum].m_start = pos1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1055 Msgs[msgnum].m_stop = pos2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1056
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1057 mp -> msgstats[msgnum] &= ~VIRTUAL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1058 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1059 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1060
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1061 m_eomsbr ((int (*)()) 0); /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1062 (void) fseek (fp, Msgs[msgnum].m_start, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1063 return fp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1064 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1065
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1066 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1067
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1068 static int check_folder (scansw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1069 int scansw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1070 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1071 int flags,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1072 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1073 low,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1074 hgh,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1075 msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1076 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1077
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1078 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1079 if (pmsh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1080 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1081 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1082
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1083 if (fmsh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1084 if (stat (mp -> foldpath, &st) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1085 padios (mp -> foldpath, "unable to stat");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1086 if (mtime == st.st_mtime)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1087 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1088 mtime = st.st_mtime;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1089
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1090 low = mp -> hghmsg + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1091 m_fmsg (mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1092
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1093 if (!(mp = m_gmsg (fmsh)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1094 padios (NULLCP, "unable to re-read folder %s", fmsh);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1095
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1096 hgh = mp -> hghmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1097
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1098 for (msgp = mp -> lowmsg; msgp <= mp -> hghmsg; msgp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1099 if (Msgs[msgp].m_top != NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1100 (void) close (Msgs[msgp].m_top);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1101 Msgs[msgp].m_top = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1102 numfds--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1103 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1104 if (Msgs[msgp].m_scanl) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1105 free (Msgs[msgp].m_scanl);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1106 Msgs[msgp].m_scanl = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1107 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1108 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1109
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1110 m_init ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1111
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1112 if (modified || low > hgh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1113 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1114 goto check_vmh;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1115 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1116 if (fstat (fileno (fp), &st) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1117 padios (mp -> foldpath, "unable to fstat");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1118 if (mtime == st.st_mtime)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1119 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1120 mode = (int) (st.st_mode & 0777);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1121 mtime = st.st_mtime;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1122
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1123 if ((msgp = read_file (Msgs[mp -> hghmsg].m_stop, mp -> hghmsg + 1)) < 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1124 padios (NULLCP, "no messages in %s", mp -> foldpath); /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1125 if (msgp <= mp -> hghmsg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1126 return 0; /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1127
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1128 if ((mp = m_remsg (mp, 0, msgp)) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1129 padios (NULLCP, "unable to allocate folder storage");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1130
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1131 low = mp -> hghmsg + 1, hgh = msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1132 flags = scansw ? m_seqflag (mp, "unseen") : 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1133 for (i = mp -> hghmsg + 1; i <= msgp; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1134 mp -> msgstats[i] = EXISTS | flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1135 mp -> nummsg++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1136 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1137 mp -> hghmsg = msgp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1138 m_init ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1139
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1140 check_vmh: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1141 if (vmh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1142 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1143
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1144 advise (NULLCP, "new messages have arrived!\007");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1145 if (scansw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1146 scanrange (low, hgh);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1147
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1148 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1149 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1150
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1151 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1152
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1153 static scanrange (low, hgh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1154 int low,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1155 hgh;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1156 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1157 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1158
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1159 (void) sprintf (buffer, "%d-%d", low, hgh);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1160 scanstring (buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1161 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1162
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1163
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1164 static scanstring (arg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1165 char *arg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1166 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1167 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1168 **ap,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1169 *vec[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1170
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1171 if ((cp = m_find (cmd_name = "scan")) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1172 ap = brkstring (cp = getcpy (cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1173 ap = copyip (ap, vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1174 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1175 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1176 ap = vec;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1177 *ap++ = arg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1178 *ap = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1179 m_init ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1180 scancmd (vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1181 if (cp != NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1182 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1183 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1184
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1185 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1186
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1187 readids (id)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1188 int id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1189 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1190 register int cur,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1191 flags,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1192 i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1193 msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1194
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1195 if (mp -> curmsg == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1196 m_setcur (mp, mp -> lowmsg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1197 if (id <= 0 || (flags = m_seqflag (mp, "unseen")) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1198 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1199
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1200 for (msgnum = mp -> hghmsg; msgnum >= mp -> lowmsg; msgnum--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1201 mp -> msgstats[msgnum] |= flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1202
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1203 if (id != 1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1204 cur = mp -> curmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1205
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1206 for (msgnum = mp -> hghmsg; msgnum >= mp -> lowmsg; msgnum--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1207 if (mp -> msgstats[msgnum] & EXISTS) /* FIX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1208 if ((i = readid (msgnum)) > 0 && i < id) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1209 cur = msgnum + 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1210 mp -> msgstats[msgnum] &= ~flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1211 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1212 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1213 for (i = mp -> lowmsg; i < msgnum; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1214 mp -> msgstats[i] &= ~flags;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1215
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1216 if (cur > mp -> hghmsg)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1217 cur = mp -> hghmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1218
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1219 m_setcur (mp, cur);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1220 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1221
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1222 if ((gap = 1 < id && id < (i = readid (mp -> lowmsg)) ? id : 0) && !vmh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1223 advise (NULLCP, "gap in ID:s, last seen %d, lowest present %d\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1224 id - 1, i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1225 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1226
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1227 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1228
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1229 int readid (msgnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1230 int msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1231 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1232 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1233 state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1234 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1235 int arg1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1236 arg2,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1237 arg3;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1238 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1239 char *bp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1240 buf[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1241 name[NAMESZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1242 register FILE *zp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1243
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1244 if (Msgs[msgnum].m_bboard_id)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1245 return Msgs[msgnum].m_bboard_id;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1246 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1247 if (pmsh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1248 if (Msgs[msgnum].m_top == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1249 padios (NULLCP, "readid (%d) botch", msgnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1250 if (pop_list (Msgs[msgnum].m_top, (int *) 0, &arg1, &arg2, &arg3) == OK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1251 && arg3 > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1252 return (Msgs[msgnum].m_bboard_id = arg3);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1253 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1254 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1255
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1256 zp = msh_ready (msgnum, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1257 for (state = FLD;;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1258 switch (state = m_getfld (state, name, buf, sizeof buf, zp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1259 case FLD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1260 case FLDEOF:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1261 case FLDPLUS:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1262 if (uleq (name, BBoard_ID)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1263 bp = getcpy (buf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1264 while (state == FLDPLUS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1265 state = m_getfld (state, name, buf, sizeof buf, zp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1266 bp = add (buf, bp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1267 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1268 i = atoi (bp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1269 free (bp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1270 if (i > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1271 return (Msgs[msgnum].m_bboard_id = i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1272 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1273 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1274 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1275 while (state == FLDPLUS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1276 state = m_getfld (state, name, buf, sizeof buf, zp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1277 if (state != FLDEOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1278 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1279
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1280 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1281 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1282 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1283 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1284
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1285 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1286
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1287 display_info (scansw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1288 int scansw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1289 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1290 int flags,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1291 sd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1292
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1293 interactive = isatty (fileno (stdout));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1294 if (sp == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1295 if ((sd = dup (fileno (stdout))) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1296 padios ("standard output", "unable to dup");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1297 #ifndef BSD42 /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1298 #ifdef FIOCLEX
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1299 (void) ioctl (sd, FIOCLEX, NULL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1300 #endif /* FIOCLEX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1301 #endif /* not BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1302 if ((sp = fdopen (sd, "w")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1303 padios ("standard output", "unable to fdopen");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1304 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1305
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1306 (void) m_putenv ("mhfolder", mp -> foldpath);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1307 if (vmh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1308 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1309
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1310 if (myname) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1311 printf ("Reading ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1312 if (SOprintf ("%s", myname))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1313 printf ("%s", myname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1314 printf (", currently at message %d of %d\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1315 mp -> curmsg, mp -> hghmsg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1316 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1317 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1318 printf ("Reading ");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1319 if (fmsh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1320 printf ("+%s", fmsh);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1321 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1322 printf ("%s", mp -> foldpath);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1323 printf (", currently at message %d of %d\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1324 mp -> curmsg, mp -> hghmsg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1325 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1326
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1327 if ((flags = m_seqflag (mp, "unseen"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1328 && scansw
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1329 && (mp -> msgstats[mp -> hghmsg] & flags))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1330 scanstring ("unseen");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1331 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1332
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1333 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1334
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1335 static write_ids () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1336 int i = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1337 flags,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1338 msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1339 char buffer[80];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1340
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1341 if (pfd <= 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1342 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1343
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1344 if (flags = m_seqflag (mp, "unseen"))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1345 for (msgnum = mp -> hghmsg; msgnum >= mp -> lowmsg; msgnum--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1346 if (!(mp -> msgstats[msgnum] & flags)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1347 if (Msgs[msgnum].m_bboard_id == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1348 (void) readid (msgnum);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1349 if ((i = Msgs[msgnum].m_bboard_id) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1350 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1351 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1352
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1353 (void) sprintf (buffer, "%d %d\n", i, Msgs[mp -> hghmsg].m_bboard_id);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1354 (void) write (pfd, buffer, sizeof buffer);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1355 (void) close (pfd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1356 pfd = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1357 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1358
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1359 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1360
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1361 static quit () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1362 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1363 md,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1364 msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1365 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1366 tmpfil[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1367 map1[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1368 map2[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1369 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1370 FILE *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1371
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1372 if (!(mp -> msgflags & MODIFIED) || mp -> msgflags & READONLY || fmsh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1373 if (vmh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1374 (void) rc2peer (RC_FIN, 0, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1375 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1376 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1377
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1378 if (vmh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1379 (void) ttyNaux (NULLCMD, "FAST");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1380 cp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1381 if ((dp = lkfopen (mp -> foldpath, "r")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1382 advise (mp -> foldpath, "unable to lock");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1383 if (vmh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1384 (void) ttyR (NULLCMD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1385 (void) pFIN ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1386 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1387 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1388 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1389 if (fstat (fileno (dp), &st) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1390 advise (mp -> foldpath, "unable to stat");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1391 goto release;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1392 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1393 if (mtime != st.st_mtime) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1394 advise (NULLCP, "new messages have arrived, no update");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1395 goto release;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1396 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1397 mode = (int) (st.st_mode & 0777);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1398
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1399 if (mp -> nummsg == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1400 cp = concat ("Zero file \"", mp -> foldpath, "\"? ", NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1401 if (getanswer (cp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1402 if ((i = creat (mp -> foldpath, mode)) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1403 (void) close (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1404 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1405 advise (mp -> foldpath, "error zero'ing");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1406 (void) unlink (map_name (mp -> foldpath));/* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1407 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1408 goto release;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1409 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1410
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1411 cp = concat ("Update file \"", mp -> foldpath, "\"? ", NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1412 if (!getanswer (cp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1413 goto release;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1414 (void) strcpy (tmpfil, m_backup (mp -> foldpath));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1415 if ((md = mbx_open (tmpfil, st.st_uid, st.st_gid, mode)) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1416 advise (tmpfil, "unable to open");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1417 goto release;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1418 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1419
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1420 for (msgnum = mp -> lowmsg; msgnum <= mp -> hghmsg; msgnum++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1421 if (mp -> msgstats[msgnum] & EXISTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1422 && pack (tmpfil, md, msgnum) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1423 (void) mbx_close (tmpfil, md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1424 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1425 (void) unlink (map_name (tmpfil));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1426 goto release;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1427 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1428 (void) mbx_close (tmpfil, md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1429
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1430 if (rename (tmpfil, mp -> foldpath) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1431 admonish (mp -> foldpath, "unable to rename %s to", tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1432 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1433 (void) strcpy (map1, map_name (tmpfil));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1434 (void) strcpy (map2, map_name (mp -> foldpath));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1435
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1436 if (rename (map1, map2) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1437 admonish (map2, "unable to rename %s to", map1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1438 (void) unlink (map1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1439 (void) unlink (map2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1440 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1441 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1442
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1443 release: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1444 if (cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1445 free (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1446 (void) lkfclose (dp, mp -> foldpath);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1447 if (vmh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1448 (void) ttyR (NULLCMD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1449 (void) pFIN ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1450 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1451 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1452
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1453 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1454
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1455 #ifdef READLINE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1456 char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1457 command_comp(text, state)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1458 char *text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1459 int state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1460 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1461 static int list_index, len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1462 char *name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1463
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1464 if (!state) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1465 list_index = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1466 len = strlen(text);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1467 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1468 while ((name = mshcmds[list_index].sw) != NULLCP) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1469 if (mshcmds[list_index++].minchars < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1470 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1471 if (strncmp(name, text, len) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1472 return getcpy(name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1473 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1474 return NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1475 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1476
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1477 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1478 #include <dirent.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1479 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1480 #include <direct.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1481 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1482
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1483 char *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1484 folder_comp(text, state)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1485 char *text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1486 int state;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1487 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1488 static DIR *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1489 static char *dirname = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1490 static char *filename = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1491 static char *foldername = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1492 static char *subdir = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1493 static int len;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1494 #ifdef SYS5DIR
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1495 struct dirent *entry = (struct dirent *)0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1496 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1497 struct direct *entry = (struct direct *)0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1498 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1499 char *p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1500
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1501 if (!state) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1502 foldername = getcpy(text);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1503 if ((p = rindex(text, '/')) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1504 foldername[p-text+1] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1505 filename = getcpy(p+1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1506 dirname = m_mailpath(path(foldername+1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1507 *text == '+' ? TFOLDER : TSUBCWF));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1508 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1509 foldername[1] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1510 filename = getcpy(text+1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1511 dirname = m_mailpath(*text == '+' ? "" : path("./", TSUBCWF));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1512 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1513 dp = opendir(dirname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1514 len = strlen(filename);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1515 subdir = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1516 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1517 if (subdir && *subdir) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1518 p = subdir;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1519 subdir = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1520 return p;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1521 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1522 while (dp && (entry = readdir(dp))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1523 if ((len == 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1524 && (entry->d_name[0] != '.' ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1525 (entry->d_name[1] &&
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1526 (entry->d_name[1] != '.' || entry->d_name[2]))))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1527 ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1528 (len != 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1529 && strncmp(filename, entry->d_name, len) == 0)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1530 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1531 if (lstat(add(entry->d_name, add("/", add(dirname, NULLCP))), &st)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1532 != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1533 && (st.st_mode & S_IFDIR)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1534 if (st.st_nlink > 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1535 subdir = add("/", add(entry->d_name,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1536 add(foldername, NULLCP)));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1537 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1538 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1539 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1540 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1541 if (entry)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1542 return add(entry->d_name, add(foldername, NULLCP));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1543
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1544 if (dp) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1545 closedir(dp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1546 dp = (DIR *)0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1547 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1548 if (dirname) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1549 free(dirname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1550 dirname = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1551 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1552 if (filename) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1553 free(filename);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1554 filename = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1555 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1556 if (foldername) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1557 free(foldername);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1558 foldername = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1559 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1560 if (subdir) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1561 free(subdir);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1562 subdir = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1563 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1564 return NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1565 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1566
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1567 char **
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1568 msh_completion(text, start, end)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1569 char *text;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1570 int start, end;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1571 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1572 char **matches = NULLVP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1573
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1574 if (start == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1575 matches = completion_matches(text, command_comp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1576 else if (text[0] == '+' || text[0] == '@')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1577 matches = completion_matches(text, folder_comp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1578
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1579 return matches;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1580 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1581
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1582 initialize_readline()
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1583 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1584 rl_readline_name = invo_name;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1585 rl_basic_word_break_characters = " \t\n\"\\'`$><=;|&{(";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1586 rl_attempted_completion_function = (CPPFunction *)msh_completion;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1587 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1588 #endif /* READLINE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1589
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1590 static int getargs (prompt, sw, cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1591 char *prompt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1592 struct swit *sw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1593 struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1594 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1595 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1596 char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1597 static char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1598
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1599 told_to_quit = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1600 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1601 interrupted = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1602 #if defined(BSD42) || defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1603 switch (setjmp (sigenv)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1604 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1605 should_intr = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1606 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1607
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1608 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1609 should_intr = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1610 if (interrupted && !told_to_quit) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1611 (void) putchar ('\n');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1612 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1613 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1614 if (ppid > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1615 (void) kill (ppid, SIGEMT);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1616 return EOF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1617 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1618 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1619 #ifdef READLINE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1620 if (!(cp = readline(interactive ? prompt : ""))) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1621 #if !defined(BSD42) && !defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1622 if (ppid > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1623 (void) kill (ppid, SIGEMT);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1624 return EOF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1625 #else /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1626 longjmp (sigenv, DONE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1627 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1628 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1629 if (!*cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1630 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1631 add_history(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1632 strncpy(buffer, cp, sizeof buffer - 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1633 buffer[sizeof buffer - 2] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1634 free(cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1635 #else /* READLINE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1636 if (interactive) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1637 printf ("%s", prompt);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1638 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1639 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1640 for (cp = buffer; (i = getchar ()) != '\n';) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1641 #if !defined(BSD42) && !defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1642 if (interrupted && !told_to_quit) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1643 buffer[0] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1644 (void) putchar ('\n');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1645 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1646 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1647 if (told_to_quit || i == EOF) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1648 if (ppid > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1649 (void) kill (ppid, SIGEMT);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1650 return EOF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1651 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1652 #else /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1653 if (i == EOF)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1654 longjmp (sigenv, DONE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1655 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1656 if (cp < &buffer[sizeof buffer - 2])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1657 *cp++ = i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1658 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1659 *cp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1660
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1661 if (buffer[0] == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1662 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1663 #endif /* READLINE */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1664 if (buffer[0] == '?') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1665 printf ("commands:\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1666 printsw (ALL, sw, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1667 printf ("type CTRL-D or use ``quit'' to leave %s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1668 invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1669 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1670 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1671
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1672 if (parse (buffer, cmdp) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1673 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1674
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1675 switch (i = smatch (cmdp -> args[0], sw)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1676 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1677 ambigsw (cmdp -> args[0], sw);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1678 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1679 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1680 printf ("say what: ``%s'' -- type ? (or help) for help\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1681 cmdp -> args[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1682 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1683 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1684 #if defined(BSD42) || defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1685 should_intr = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1686 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1687 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1688 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1689 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1690 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1691
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1692 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1693
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1694 static int getcmds (sw, cmdp, scansw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1695 struct swit *sw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1696 struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1697 int scansw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1698 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1699 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1700 struct record rcs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1701 *rc = &rcs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1702
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1703 initrc (rc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1704
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1705 for (;;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1706 switch (peer2rc (rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1707 case RC_QRY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1708 (void) pQRY (rc -> rc_data, scansw);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1709 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1710
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1711 case RC_CMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1712 if ((i = pCMD (rc -> rc_data, sw, cmdp)) != NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1713 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1714 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1715
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1716 case RC_FIN:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1717 if (ppid > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1718 (void) kill (ppid, SIGEMT);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1719 return EOF;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1720
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1721 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1722 padios (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1723
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1724 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1725 (void) fmt2peer (RC_ERR, "pLOOP protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1726 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1727 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1728 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1729
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1730 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1731
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1732 static int parse (buffer, cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1733 char *buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1734 struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1735 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1736 int argp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1737 char c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1738 *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1739 *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1740
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1741 cmdp -> line[0] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1742 pp = cmdp -> args[argp++] = cmdp -> line;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1743 cmdp -> redirect = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1744 cmdp -> direction = STDIO;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1745 cmdp -> stream = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1746
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1747 for (cp = buffer; c = *cp; cp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1748 if (!isspace ((unsigned char) c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1749 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1750 if (c == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1751 if (vmh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1752 (void) fmt2peer (RC_EOF, "null command");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1753 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1754 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1755
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1756 while (c = *cp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1757 if (isspace ((unsigned char) c)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1758 while (isspace ((unsigned char) c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1759 c = *cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1760 if (c == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1761 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1762 *pp++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1763 cmdp -> args[argp++] = pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1764 *pp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1765 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1766
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1767 switch (c) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1768 case '"':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1769 for (;;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1770 switch (c = *cp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1771 case 0:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1772 padvise (NULLCP, "unmatched \"");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1773 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1774 case '"':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1775 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1776 case QUOTE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1777 if ((c = *cp++) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1778 goto no_quoting;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1779 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1780 *pp++ = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1781 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1782 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1783 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1784 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1785 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1786
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1787 case QUOTE:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1788 if ((c = *cp++) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1789 no_quoting: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1790 padvise (NULLCP, "the newline character can not be quoted");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1791 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1792 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1793
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1794 default: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1795 *pp++ = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1796 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1797
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1798 case '>':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1799 case '|':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1800 if (pp == cmdp -> line) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1801 padvise (NULLCP, "invalid null command");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1802 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1803 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1804 if (*cmdp -> args[argp - 1] == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1805 argp--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1806 cmdp -> direction = c == '>' ? CRTIO : PIPIO;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1807 if (cmdp -> direction == CRTIO && (c = *cp) == '>') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1808 cmdp -> direction = APPIO;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1809 cp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1810 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1811 cmdp -> redirect = pp + 1;/* sigh */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1812 for (; c = *cp; cp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1813 if (!isspace ((unsigned char) c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1814 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1815 if (c == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1816 padvise (NULLCP, cmdp -> direction != PIPIO
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1817 ? "missing name for redirect"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1818 : "invalid null command");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1819 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1820 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1821 (void) strcpy (cmdp -> redirect, cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1822 if (cmdp -> direction != PIPIO) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1823 for (; *cp; cp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1824 if (isspace ((unsigned char) *cp)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1825 padvise (NULLCP, "bad name for redirect");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1826 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1827 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1828 if (expand (cmdp -> redirect) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1829 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1830 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1831 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1832 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1833 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1834 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1835
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1836 *pp++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1837 cmdp -> args[argp] = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1838
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1839 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1840 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1841
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1842 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1843
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1844 int expand (redirect)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1845 char *redirect;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1846 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1847 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1848 *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1849 char path[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1850 struct passwd *pw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1851
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1852 if (*redirect != '~')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1853 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1854
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1855 if (cp = index (pp = redirect + 1, '/'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1856 *cp++ = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1857 if (*pp == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1858 pp = mypath;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1859 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1860 if (pw = getpwnam (pp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1861 pp = pw -> pw_dir;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1862 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1863 padvise (NULLCP, "unknown user: %s", pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1864 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1865 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1866
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1867 (void) sprintf (path, "%s/%s", pp, cp ? cp : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1868 (void) strcpy (redirect, path);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1869 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1870 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1871
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1872 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1873
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1874 static int init_io (cmdp, vio)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1875 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1876 int vio;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1877 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1878 int io,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1879 result;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1880
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1881 io = vmh;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1882
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1883 vmh = vio;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1884 result = initaux_io (cmdp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1885 vmh = io;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1886
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1887 return result;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1888 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1889
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1890
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1891 static int initaux_io (cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1892 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1893 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1894 char *mode;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1895
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1896 switch (cmdp -> direction) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1897 case STDIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1898 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1899
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1900 case CRTIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1901 case APPIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1902 mode = cmdp -> direction == CRTIO ? "write" : "append";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1903 if ((cmdp -> stream = fopen (cmdp -> redirect, mode)) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1904 padvise (cmdp -> redirect, "unable to %s ", mode);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1905 cmdp -> direction = STDIO;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1906 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1907 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1908 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1909
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1910 case PIPIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1911 if ((cmdp -> stream = popen (cmdp -> redirect, "w")) == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1912 padvise (cmdp -> redirect, "unable to pipe");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1913 cmdp -> direction = STDIO;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1914 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1915 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1916 (void) signal (SIGPIPE, pipeser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1917 broken_pipe = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1918 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1919
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1920 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1921 padios (NULLCP, "unknown redirection for command");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1922 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1923
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1924 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1925 if (dup2 (fileno (cmdp -> stream), fileno (stdout)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1926 padios ("standard output", "unable to dup2");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1927 clearerr (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1928
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1929 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1930 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1931
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1932 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1933
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1934 static fin_io (cmdp, vio)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1935 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1936 int vio;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1937 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1938 int io;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1939
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1940 io = vmh;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1941
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1942 vmh = vio;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1943 finaux_io (cmdp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1944 vmh = io;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1945 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1946
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1947
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1948 static int finaux_io (cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1949 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1950 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1951 switch (cmdp -> direction) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1952 case STDIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1953 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1954
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1955 case CRTIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1956 case APPIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1957 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1958 (void) close (fileno (stdout));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1959 if (ferror (stdout))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1960 padvise (NULLCP, "problems writing %s", cmdp -> redirect);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1961 (void) fclose (cmdp -> stream);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1962 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1963
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1964 case PIPIO:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1965 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1966 (void) close (fileno (stdout));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1967 (void) pclose (cmdp -> stream);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1968 (void) signal (SIGPIPE, SIG_DFL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1969 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1970
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1971 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1972 padios (NULLCP, "unknown redirection for command");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1973 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1974
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1975 if (dup2 (fileno (sp), fileno (stdout)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1976 padios ("standard output", "unable to dup2");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1977 clearerr (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1978
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1979 cmdp -> direction = STDIO;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1980 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1981
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1982 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1983
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1984 static m_init () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1985 int msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1986
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1987 for (msgnum = mp -> lowmsg; msgnum <= mp -> hghmsg; msgnum++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1988 mp -> msgstats[msgnum] &= ~SELECTED;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1989 mp -> lowsel = mp -> hghsel = mp -> numsel = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1990 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1991
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1992
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1993 m_reset () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1994 write_ids ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1995 m_fmsg (mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1996 myname = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1997 #if defined(BPOP) || defined(NNTP)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1998 if (pmsh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1999 (void) pop_done ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2000 pmsh = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2001 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2002 #endif /* BPOP || NNTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2003 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2004
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2005 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2006
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2007 void m_setcur (mp, msgnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2008 register struct msgs *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2009 register int msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2010 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2011 if (mp -> curmsg == msgnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2012 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2013
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2014 if (mp -> curmsg && Msgs[mp -> curmsg].m_scanl) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2015 free (Msgs[mp -> curmsg].m_scanl);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2016 Msgs[mp -> curmsg].m_scanl = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2017 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2018 if (Msgs[msgnum].m_scanl) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2019 free (Msgs[msgnum].m_scanl);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2020 Msgs[msgnum].m_scanl = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2021 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2022
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2023 mp -> curmsg = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2024 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2025
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2026 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2027
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2028 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2029
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2030 static TYPESIG intrser (i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2031 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2032 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2033 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2034 (void) signal (SIGINT, intrser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2035 #endif /* not BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2036
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2037 discard (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2038
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2039 interrupted++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2040 #if defined(BSD42) || defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2041 if (should_intr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2042 longjmp (sigenv, NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2043 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2044 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2045
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2046
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2047 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2048
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2049 static TYPESIG pipeser (i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2050 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2051 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2052 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2053 (void) signal (SIGPIPE, pipeser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2054 #endif /* not BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2055
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2056 if (broken_pipe++ == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2057 fprintf (stderr, "broken pipe\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2058 told_to_quit++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2059 interrupted++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2060 #if defined(BSD42) || defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2061 if (should_intr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2062 longjmp (sigenv, NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2063 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2064 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2065
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2066
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2067 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2068
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2069 static TYPESIG quitser (i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2070 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2071 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2072 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2073 (void) signal (SIGQUIT, quitser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2074 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2075
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2076 told_to_quit++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2077 interrupted++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2078 #if defined(BSD42) || defined(SVR4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2079 if (should_intr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2080 longjmp (sigenv, NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2081 #endif /* BSD42 || SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2082 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2083
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2084 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2085
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2086 static int pINI () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2087 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2088 vrsn;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2089 char *bp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2090 struct record rcs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2091 *rc = &rcs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2092
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2093 initrc (rc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2094
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2095 switch (peer2rc (rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2096 case RC_INI:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2097 bp = rc -> rc_data;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2098 while (isspace (*bp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2099 bp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2100 if (sscanf (bp, "%d", &vrsn) != 1) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2101 bad_init: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2102 (void) fmt2peer (RC_ERR, "bad init \"%s\"", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2103 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2104 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2105 if (vrsn != RC_VRSN) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2106 (void) fmt2peer (RC_ERR, "version %d unsupported", vrsn);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2107 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2108 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2109
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2110 while (*bp && !isspace (*bp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2111 bp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2112 while (isspace (*bp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2113 bp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2114 if (sscanf (bp, "%d", &numwins) != 1 || numwins <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2115 goto bad_init;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2116 if (numwins > NWIN)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2117 numwins = NWIN;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2118
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2119 for (i = 1; i <= numwins; i++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2120 while (*bp && !isspace (*bp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2121 bp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2122 while (isspace (*bp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2123 bp++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2124 if (sscanf (bp, "%d", &windows[i]) != 1 || windows[i] <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2125 goto bad_init;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2126 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2127 (void) rc2peer (RC_ACK, 0, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2128 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2129
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2130 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2131 padios (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2132
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2133 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2134 (void) fmt2peer (RC_ERR, "pINI protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2135 done (1); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2136 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2137 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2138
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2139 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2140
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2141 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2142
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2143 static int pQRY (str, scansw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2144 char *str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2145 int scansw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2146 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2147 if (pQRY1 (scansw) == NOTOK || pQRY2 () == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2148 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2149
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2150 (void) rc2peer (RC_EOF, 0, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2151 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2152 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2153
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2154 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2155
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2156 static int pQRY1 (scansw)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2157 int scansw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2158 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2159 int oldhgh;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2160 static int lastlow = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2161 lastcur = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2162 lasthgh = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2163 lastnum = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2164
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2165 oldhgh = mp -> hghmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2166 if (check_folder (scansw) && oldhgh < mp -> hghmsg) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2167 switch (winX (STATUS)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2168 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2169 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2170
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2171 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2172 printf ("new messages have arrived!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2173 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2174 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2175 _exit (0); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2176
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2177 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2178 lastlow = lastcur = lasthgh = lastnum = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2179 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2180 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2181
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2182 switch (winX (DISPLAY)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2183 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2184 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2185
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2186 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2187 scanrange (oldhgh + 1, mp -> hghmsg);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2188 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2189 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2190 _exit (0); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2191
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2192 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2193 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2194 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2195 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2196 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2198 if (gap)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2199 switch (winX (STATUS)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2200 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2201 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2202
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2203 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2204 printf ("%s: gap in ID:s, last seen %d, lowest present %d\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2205 myname ? myname : fmsh ? fmsh : mp -> foldpath, gap - 1,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2206 readid (mp -> lowmsg));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2207 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2208 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2209 _exit (0); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2210
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2211 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2212 gap = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2213 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2214 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2215
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2216 if (mp -> lowmsg != lastlow
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2217 || mp -> curmsg != lastcur
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2218 || mp -> hghmsg != lasthgh
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2219 || mp -> nummsg != lastnum)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2220 switch (winX (STATUS)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2221 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2222 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2223
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2224 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2225 foldcmd (NULLVP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2226 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2227 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2228 _exit (0); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2229
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2230 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2231 lastlow = mp -> lowmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2232 lastcur = mp -> curmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2233 lasthgh = mp -> hghmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2234 lastnum = mp -> nummsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2235 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2236 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2237
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2238 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2239 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2241 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2242
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2243 static int pQRY2 () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2244 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2245 j,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2246 k,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2247 msgnum,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2248 n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2249 static int cur = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2250 num = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2251 lo = 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2252 hi = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2253
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2254 if (mp -> nummsg == 0 && mp -> nummsg != num)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2255 switch (winX (SCAN)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2256 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2257 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2258
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2259 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2260 printf ("empty!");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2261 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2262 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2263 _exit (0); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2264
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2265 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2266 num = mp -> nummsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2267 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2268 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2269 num = mp -> nummsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2270
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2271 i = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2272 j = (k = windows[SCAN]) / 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2273 for (msgnum = mp -> curmsg; msgnum <= mp -> hghmsg; msgnum++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2274 if (mp -> msgstats[msgnum] & EXISTS)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2275 i++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2276 if (i-- > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2277 if (topcur)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2278 k = i >= k ? 1 : k - i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2279 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2280 k -= i > j ? j : i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2281
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2282 i = j = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2283 n = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2284 for (msgnum = mp -> curmsg; msgnum >= mp -> lowmsg; msgnum--)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2285 if (mp -> msgstats[msgnum] & EXISTS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2286 i = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2287 if (j == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2288 j = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2289 if (n++ >= k)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2290 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2291 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2292 for (msgnum = mp -> curmsg + 1; msgnum <= mp -> hghmsg; msgnum++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2293 if (mp -> msgstats[msgnum] & EXISTS) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2294 if (i == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2295 i = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2296 j = msgnum;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2297 if (n++ >= windows[SCAN])
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2298 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2299 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2300 if (!topcur
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2301 && lo > 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2302 && hi > 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2303 && mp -> msgstats[lo] & EXISTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2304 && mp -> msgstats[hi] & EXISTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2305 && (lo < mp -> curmsg
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2306 || (lo == mp -> curmsg && lo == mp -> lowmsg))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2307 && (mp -> curmsg < hi
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2308 || (hi == mp -> curmsg && hi == mp -> hghmsg))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2309 && hi - lo == j - i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2310 i = lo, j = hi;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2311
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2312 if (mp -> curmsg != cur || modified)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2313 switch (winN (NULLCMD, SCAN, 0)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2314 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2315 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2316
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2317 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2318 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2319
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2320 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2321 scanrange (lo = i, hi = j);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2322 cur = mp -> curmsg;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2323 (void) winR (NULLCMD);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2324 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2325 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2326
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2327 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2328 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2329
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2330 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2331
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2332 static int pCMD (str, sw, cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2333 char *str;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2334 struct swit *sw;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2335 struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2336 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2337 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2338
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2339 if (*str == '?')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2340 switch (winX (DISPLAY)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2341 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2342 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2343
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2344 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2345 printf ("commands:\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2346 printsw (ALL, sw, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2347 printf ("type ``quit'' to leave %s\n", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2348 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2349 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2350 _exit (0); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2351
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2352 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2353 (void) rc2peer (RC_EOF, 0, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2354 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2355 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2356
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2357 if (parse (str, cmdp) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2358 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2359
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2360 switch (i = smatch (cmdp -> args[0], sw)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2361 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2362 switch (winX (DISPLAY)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2363 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2364 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2365
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2366 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2367 ambigsw (cmdp -> args[0], sw);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2368 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2369 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2370 _exit (0); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2371
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2372 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2373 (void) rc2peer (RC_EOF, 0, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2374 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2375 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2376
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2377 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2378 (void) fmt2peer (RC_ERR,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2379 "say what: ``%s'' -- type ? (or help) for help",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2380 cmdp -> args[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2381 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2382
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2383 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2384 return i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2385 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2386 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2387
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2388 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2389
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2390 static int pFIN () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2391 int status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2392
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2393 switch (setjmp (peerenv)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2394 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2395 (void) signal (SIGALRM, alrmser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2396 (void) alarm (ALARM);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2397
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2398 status = peerwait ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2399
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2400 (void) alarm (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2401 return status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2402
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2403 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2404 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2405 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2406 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2407
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2408
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2409 static int peerwait () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2410 struct record rcs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2411 *rc = &rcs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2412
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2413 initrc (rc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2414
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2415 switch (peer2rc (rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2416 case RC_QRY:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2417 case RC_CMD:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2418 (void) rc2peer (RC_FIN, 0, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2419 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2420
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2421 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2422 advise (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2423 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2424
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2425 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2426 (void) fmt2peer (RC_FIN, "pLOOP protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2427 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2428 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2429 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2430
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2431
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2432 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2433
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2434 static TYPESIG alrmser (i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2435 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2436 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2437 longjmp (peerenv, DONE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2438 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2439
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2440 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2441
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2442 static int ttyNaux (cmdp, s)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2443 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2444 char *s;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2445 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2446 struct record rcs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2447 *rc = &rcs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2448
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2449 initrc (rc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2450
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2451 if (cmdp && init_io (cmdp, vmh) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2452 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2453
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2454 if (!fmsh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2455 (void) fseek (fp, 0L, 0);/* XXX: fseek() too tricky for our own good */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2456
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2457 vmhtty = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2458 switch (rc2rc (RC_TTY, s ? strlen (s) : 0, s, rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2459 case RC_ACK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2460 vmhtty = OK; /* fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2461 case RC_ERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2462 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2463
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2464 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2465 padios (NULLCP, "%s", rc -> rc_data);/* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2466
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2467 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2468 (void) fmt2peer (RC_ERR, "pTTY protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2469 done (1); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2470 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2471
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2472 #ifdef SIGTSTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2473 (void) signal (SIGTSTP, tstat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2474 #endif /* SIGTSTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2475 return vmhtty;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2476 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2477
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2478 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2479
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2480 static int ttyR (cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2481 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2482 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2483 struct record rcs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2484 *rc = &rcs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2485
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2486 #ifdef SIGTSTP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2487 (void) signal (SIGTSTP, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2488 #endif /* SIGTSTP */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2489
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2490 if (vmhtty != OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2491 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2492
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2493 initrc (rc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2494
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2495 if (cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2496 fin_io (cmdp, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2497
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2498 vmhtty = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2499 switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2500 case RC_ACK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2501 (void) rc2peer (RC_EOF, 0, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2502 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2503
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2504 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2505 padios (NULLCP, "%s", rc -> rc_data);/* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2506
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2507 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2508 (void) fmt2peer (RC_ERR, "pTTY protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2509 done (1); /* NOTREACHED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2510 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2511 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2512
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2513 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2514
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2515 static int winN (cmdp, n, eof)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2516 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2517 int n,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2518 eof;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2519 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2520 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2521 pd[2];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2522 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2523 struct record rcs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2524 *rc = &rcs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2525
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2526 if (vmhpid == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2527 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2528
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2529 initrc (rc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2530
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2531 if (!fmsh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2532 (void) fseek (fp, 0L, 0);/* XXX: fseek() too tricky for our own good */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2533
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2534 vmhpid = OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2535
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2536 (void) sprintf (buffer, "%d", n);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2537 switch (str2rc (RC_WIN, buffer, rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2538 case RC_ACK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2539 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2540
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2541 case RC_ERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2542 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2543
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2544 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2545 padios (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2546
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2547 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2548 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2549 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2550 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2551
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2552 if (pipe (pd) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2553 (void) err2peer (RC_ERR, "pipe", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2554 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2555 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2556
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2557 switch (vmhpid = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2558 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2559 (void) err2peer (RC_ERR, "fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2560 (void) close (pd[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2561 (void) close (pd[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2562 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2563
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2564 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2565 (void) close (pd[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2566 (void) signal (SIGPIPE, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2567 while ((i = read (pd[0], buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2568 switch (rc2rc (RC_DATA, i, buffer, rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2569 case RC_ACK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2570 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2571
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2572 case RC_ERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2573 _exit (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2574
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2575 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2576 advise (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2577 _exit (2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2578
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2579 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2580 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2581 _exit (2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2582 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2583 if (i == OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2584 switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2585 case RC_ACK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2586 if (eof)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2587 (void) rc2peer (RC_EOF, 0, NULLCP);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2588 i = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2589 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2590
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2591 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2592 advise (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2593 i = 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2594 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2595
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2596 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2597 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2598 i = 2;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2599 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2600 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2601 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2602 (void) err2peer (RC_ERR, "pipe", "error reading from");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2603 (void) close (pd[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2604 _exit (i != NOTOK ? i : 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2605
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2606 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2607 if ((vmhfd0 = dup (fileno (stdin))) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2608 padios ("standard input", "unable to dup");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2609 if ((vmhfd1 = dup (fileno (stdout))) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2610 padios ("standard output", "unable to dup");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2611 if ((vmhfd2 = dup (fileno (stderr))) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2612 padios ("diagnostic output", "unable to dup");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2613
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2614 (void) close (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2615 if ((i = open ("/dev/null", 0)) != NOTOK && i != fileno (stdin)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2616 (void) dup2 (i, fileno (stdin));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2617 (void) close (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2618 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2619
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2620 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2621 if (dup2 (pd[1], fileno (stdout)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2622 padios ("standard output", "unable to dup2");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2623 clearerr (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2624
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2625 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2626 if (dup2 (pd[1], fileno (stderr)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2627 padios ("diagnostic output", "unable to dup2");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2628 clearerr (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2629
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2630 if (cmdp && init_io (cmdp, 0) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2631 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2632 pstat = signal (SIGPIPE, pipeser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2633 broken_pipe = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2634
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2635 (void) close (pd[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2636 (void) close (pd[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2637
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2638 return vmhpid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2639 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2640 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2641
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2642 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2643
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2644 static int winR (cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2645 register struct Cmd *cmdp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2646 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2647 int status;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2648
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2649 if (vmhpid <= OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2650 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2651
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2652 if (cmdp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2653 fin_io (cmdp, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2654
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2655 if (dup2 (vmhfd0, fileno (stdin)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2656 padios ("standard input", "unable to dup2");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2657 clearerr (stdin);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2658 (void) close (vmhfd0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2659
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2660 (void) fflush (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2661 if (dup2 (vmhfd1, fileno (stdout)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2662 padios ("standard output", "unable to dup2");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2663 clearerr (stdout);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2664 (void) close (vmhfd1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2665
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2666 (void) fflush (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2667 if (dup2 (vmhfd2, fileno (stderr)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2668 padios ("diagnostic output", "unable to dup2");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2669 clearerr (stderr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2670 (void) close (vmhfd2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2671
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2672 (void) signal (SIGPIPE, pstat);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2673
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2674 if ((status = pidwait (vmhpid, OK)) == 2)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2675 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2676
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2677 vmhpid = OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2678 return (status == 0 ? OK : NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2679 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2680
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2681 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2682
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2683 static int winX (n)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2684 int n;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2685 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2686 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2687 pid,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2688 pd[2];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2689 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2690 struct record rcs,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2691 *rc = &rcs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2692
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2693 initrc (rc);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2694
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2695 if (!fmsh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2696 (void) fseek (fp, 0L, 0);/* XXX: fseek() too tricky for our own good */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2697
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2698 (void) sprintf (buffer, "%d", n);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2699 switch (str2rc (RC_WIN, buffer, rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2700 case RC_ACK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2701 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2702
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2703 case RC_ERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2704 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2705
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2706 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2707 padios (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2708
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2709 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2710 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2711 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2712 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2713
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2714 if (pipe (pd) == NOTOK) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2715 (void) err2peer (RC_ERR, "pipe", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2716 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2717 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2718
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2719 switch (pid = fork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2720 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2721 (void) err2peer (RC_ERR, "fork", "unable to");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2722 (void) close (pd[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2723 (void) close (pd[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2724 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2725
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2726 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2727 (void) close (fileno (stdin));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2728 if ((i = open ("/dev/null", 0)) != NOTOK && i != fileno (stdin)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2729 (void) dup2 (i, fileno (stdin));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2730 (void) close (i);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2731 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2732 (void) dup2 (pd[1], fileno (stdout));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2733 (void) dup2 (pd[1], fileno (stderr));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2734 (void) close (pd[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2735 (void) close (pd[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2736 vmhpid = NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2737 return OK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2738
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2739 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2740 (void) close (pd[1]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2741 while ((i = read (pd[0], buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2742 switch (rc2rc (RC_DATA, i, buffer, rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2743 case RC_ACK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2744 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2745
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2746 case RC_ERR:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2747 (void) close (pd[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2748 (void) pidwait (pid, OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2749 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2750
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2751 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2752 padios (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2753
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2754 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2755 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2756 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2757 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2758 if (i == OK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2759 switch (rc2rc (RC_EOF, 0, NULLCP, rc)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2760 case RC_ACK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2761 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2762
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2763 case RC_XXX:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2764 padios (NULLCP, "%s", rc -> rc_data);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2765
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2766 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2767 (void) fmt2peer (RC_ERR, "pWIN protocol screw-up");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2768 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2769 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2770 if (i == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2771 (void) err2peer (RC_ERR, "pipe", "error reading from");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2772
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2773 (void) close (pd[0]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2774 (void) pidwait (pid, OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2775 return (i != NOTOK ? pid : NOTOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2776 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2777 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2778
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2779 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2780
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2781 /* VARARGS2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2782
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2783 void padios (what, fmt, a, b, c, d, e, f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2784 char *what,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2785 *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2786 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2787 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2788 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2789 *d,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2790 *e,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2791 *f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2792 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2793 if (vmh) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2794 (void) err2peer (RC_FIN, what, fmt, a, b, c, d, e, f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2795 (void) rcdone ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2796 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2797 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2798 advise (what, fmt, a, b, c, d, e, f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2799
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2800 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2801 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2802
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2803
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2804 /* VARARGS2 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2805
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2806 void padvise (what, fmt, a, b, c, d, e, f)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2807 char *what,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2808 *fmt,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2809 *a,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2810 *b,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2811 *c,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2812 *d,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2813 *e,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2814 *f;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2815 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2816 if (vmh)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2817 (void) err2peer (RC_ERR, what, fmt, a, b, c, d, e, f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2818 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2819 advise (what, fmt, a, b, c, d, e, f);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2820 }