1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _UUCP_H
#define _UUCP_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <parms.h>
#include <stdio.h>
#include <ctype.h>
#include <setjmp.h>
#include <sys/param.h>
#include <termio.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <utime.h>
#include <dirent.h>
#include <time.h>
#include <sys/times.h>
#include <errno.h>
#include <sys/mkdev.h>
#include <strings.h>
#include <ulimit.h>
#include <sys/utsname.h>
#include <ustat.h>
#ifdef __cplusplus
extern "C" {
#endif
/* what mode should user files be allowed to have upon creation? */
/* NOTE: This does not allow setuid or execute bits on transfer. */
#define LEGALMODE (mode_t)0666
/* what mode should public files have upon creation? */
#define PUB_FILEMODE (mode_t)0666
/* what mode should log files have upon creation? */
#define LOGFILEMODE (mode_t)0644
/* what mode should C. files have upon creation? */
#define CFILEMODE (mode_t)0644
/* what mode should D. files have upon creation? */
#define DFILEMODE (mode_t)0600
/* define the value of PUBMASK, used for creating "public" directories */
#define PUBMASK (mode_t)0000
/* what mode should public directories have upon creation? */
#define PUB_DIRMODE (mode_t)0777
/* define the value of DIRMASK, used for creating "system" subdirectories */
#define DIRMASK (mode_t)0022
#define MAXSTART 300 /* how long to wait on startup */
/* define the last characters for ACU (used for 801/212 dialers) */
#define ACULAST "<"
/*
* caution - the fillowing names are also in Makefile
* any changes here have to also be made there
*
* it's a good idea to make directories .foo, since this ensures
* that they'll be ignored by processes that search subdirectories in SPOOL
*
* XQTDIR = /var/uucp/.Xqtdir
* CORRUPT = /var/uucp/.Corrupt
* LOGDIR = /var/uucp/.Log
* SEQDIR = /var/uucp/.Sequence
* STATDIR = /var/uucp/.Status
*/
/* where to put the STST. files? */
#define STATDIR (const char *)"/var/uucp/.Status"
/* where should logfiles be kept? */
#define LOGUUX (const char *)"/var/uucp/.Log/uux"
#define LOGUUXQT (const char *)"/var/uucp/.Log/uuxqt"
#define LOGUUCP (const char *)"/var/uucp/.Log/uucp"
#define LOGCICO (const char *)"/var/uucp/.Log/uucico"
#define CORRUPTDIR (const char *)"/var/uucp/.Corrupt"
/* some sites use /var/uucp/.XQTDIR here */
/* use caution since things are linked into there */
#define XQTDIR (const char *)"/var/uucp/.Xqtdir"
/* how much of a system name can we print in a [CX]. file? */
/* MAXBASENAME - 1 (pre) - 1 ('.') - 1 (grade) - 4 (sequence number) */
#define SYSNSIZE (MAXBASENAME - 7)
#ifdef USRSPOOLLOCKS
#define LOCKPRE (const char *)"/var/spool/locks/LCK."
#else
#define LOCKPRE (const char *)"/var/spool/uucp/LCK."
#endif /* USRSPOOLLOCKS */
#define SQFILE (const char *)"/etc/uucp/SQFILE"
#define SQTMP (const char *)"/etc/uucp/SQTMP"
#define SLCKTIME 5400 /* system/device timeout (LCK.. files) */
#define DIALCODES (const char *)"/etc/uucp/Dialcodes"
#define PERMISSIONS (const char *)"/etc/uucp/Permissions"
#define SPOOL (const char *)"/var/spool/uucp"
#define SEQDIR (const char *)"/var/uucp/.Sequence"
#define X_LOCKTIME 3600
#ifdef USRSPOOLLOCKS
#define SEQLOCK (const char *)"/var/spool/locks/LCK.SQ."
#define SQLOCK (const char *)"/var/spool/locks/LCK.SQ"
#define X_LOCK (const char *)"/var/spool/locks/LCK.X"
#define S_LOCK (const char *)"/var/spool/locks/LCK.S"
#define L_LOCK (const char *)"/var/spool/locks/LK"
#define X_LOCKDIR (const char *)"/var/spool/locks"
/* must be dir part of above */
#else
#define SEQLOCK (const char *)"/var/spool/uucp/LCK.SQ."
#define SQLOCK (const char *)"/var/spool/uucp/LCK.SQ"
#define X_LOCK (const char *)"/var/spool/uucp/LCK.X"
#define S_LOCK (const char *)"/var/spool/uucp/LCK.S"
#define L_LOCK (const char *)"/var/spool/uucp/LK"
#define X_LOCKDIR (const char *)"/var/spool/uucp"
/* must be dir part of above */
#endif /* USRSPOOLLOCKS */
#define X_LOCKPRE (const char *)"LCK.X" /* must be last part of above */
#define PUBDIR (const char *)"/var/spool/uucppublic"
#define ADMIN (const char *)"/var/uucp/.Admin"
#define ERRLOG (const char *)"/var/uucp/.Admin/errors"
#define SYSLOG (const char *)"/var/uucp/.Admin/xferstats"
#define RMTDEBUG (const char *)"/var/uucp/.Admin/audit"
#define CLEANUPLOGFILE (const char *)"/var/uucp/.Admin/uucleanup"
#define CMDLOG (const char *)"/var/uucp/.Admin/command"
#define PERFLOG (const char *)"/var/uucp/.Admin/perflog"
#define ACCOUNT (const char *)"/var/uucp/.Admin/account"
#define SECURITY (const char *)"/var/uucp/.Admin/security"
#define WORKSPACE (const char *)"/var/uucp/.Workspace"
#define SQTIME 60
#define TRYCALLS 2 /* number of tries to dial call */
#define MINULIMIT (1L<<11) /* minimum reasonable ulimit */
#define MAX_LOCKTRY 5 /* number of attempts to lock device */
/*
* CDEBUG is for communication line debugging
* DEBUG is for program debugging
* #define SMALL to compile without the DEBUG code
*/
#define CDEBUG(l, f, s)
#define SMALL
#ifndef SMALL
#define DEBUG(l, f, s) if (Debug >= l) fprintf(stderr, f, s)
#else
#define DEBUG(l, f, s)
#endif /* SMALL */
/*
* VERBOSE is used by cu and ct to inform the user of progress
* In other programs, the Value of Verbose is always 0.
*/
#define VERBOSE(f, s) { if (Verbose > 0) (void) fprintf(stderr, f, s); }
#define PREFIX(pre, str) (strncmp((pre), (str), strlen(pre)) == SAME)
#define BASENAME(str, c) ((Bnptr = strrchr((str), c)) ? (Bnptr + 1) : (str))
#define EQUALS(a, b) ((a != CNULL) && (b != CNULL) && \
(strcmp((a), (b)) == SAME))
#define EQUALSN(a, b, n) ((a != CNULL) && (b != CNULL) && \
(strncmp((a), (b), (n)) == SAME))
#define LASTCHAR(s) (s+strlen(s)-1)
#define SAME 0
#define ANYREAD 04
#define ANYWRITE 02
#define FAIL -1
#define SUCCESS 0
#define NULLCHAR '\0'
#define CNULL (char *)0
#define STBNULL (struct sgttyb *)0
#define MASTER 1
#define SLAVE 0
#define MAXBASENAME 14 /* should be DIRSIZ but that is now fs dependent */
#define MAXFULLNAME BUFSIZ
#define MAXNAMESIZE 64 /* /var/spool/uucp/<14 chars>/<14 chars>+slop */
#define CONNECTTIME 30
#define EXPECTTIME 45
#define MSGTIME 60
#define NAMESIZE MAXBASENAME+1
#define SIZEOFPID 10 /* maximum number of digits in a pid */
#define EOTMSG "\004\n\004\n"
#define CALLBACK 1
/* manifests for sysfiles.c's sysaccess() */
/* check file access for REAL user id */
#define ACCESS_SYSTEMS 1
#define ACCESS_DEVICES 2
#define ACCESS_DIALERS 3
/* check file access for EFFECTIVE user id */
#define EACCESS_SYSTEMS 4
#define EACCESS_DEVICES 5
#define EACCESS_DIALERS 6
/* manifest for chkpth flag */
#define CK_READ 0
#define CK_WRITE 1
/*
* commands
*/
#define SHELL (const char *)"/usr/bin/sh"
#define MAIL (const char *)"mail"
#define UUCICO (const char *)"/usr/lib/uucp/uucico"
#define UUXQT (const char *)"/usr/lib/uucp/uuxqt"
#define UUX (const char *)"/usr/bin/uux"
#define UUCP (const char *)"/usr/bin/uucp"
/* system status stuff */
#define SS_OK 0
#define SS_NO_DEVICE 1
#define SS_TIME_WRONG 2
#define SS_INPROGRESS 3
#define SS_CONVERSATION 4
#define SS_SEQBAD 5
#define SS_LOGIN_FAILED 6
#define SS_DIAL_FAILED 7
#define SS_BAD_LOG_MCH 8
#define SS_LOCKED_DEVICE 9
#define SS_ASSERT_ERROR 10
#define SS_BADSYSTEM 11
#define SS_CANT_ACCESS_DEVICE 12
#define SS_DEVICE_FAILED 13 /* used for interface failure */
#define SS_WRONG_MCH 14
#define SS_CALLBACK 15
#define SS_RLOCKED 16
#define SS_RUNKNOWN 17
#define SS_RLOGIN 18
#define SS_UNKNOWN_RESPONSE 19
#define SS_STARTUP 20
#define SS_CHAT_FAILED 21
#define SS_CALLBACK_LOOP 22
#define MAXPH 60 /* maximum phone string size */
#define MAXC BUFSIZ
#define TRUE 1
#define FALSE 0
#define NAMEBUF 32
/* The call structure is used by ct.c, cu.c, and dial.c. */
struct call {
char *speed; /* transmission baud rate */
char *line; /* device name for outgoing line */
char *telno; /* ptr to tel-no digit string */
char *type; /* type of device to use for call. */
};
/* structure of an Systems file line */
#define F_MAX 50 /* max number of fields in Systems file line */
#define F_NAME 0
#define F_TIME 1
#define F_TYPE 2
#define F_CLASS 3 /* an optional prefix and the speed */
#define F_PHONE 4
#define F_LOGIN 5
/* structure of an Devices file line */
#define D_TYPE 0
#define D_LINE 1
#define D_CALLDEV 2
#define D_CLASS 3
#define D_CALLER 4
#define D_ARG 5
#define D_MAX 50 /* max number of fields in Devices file line */
#define D_ACU 1
#define D_DIRECT 2
#define D_PROT 4
#define GRADES "/etc/uucp/Grades"
#define D_QUEUE 'Z' /* default queue */
/* past here, local changes are not recommended */
#define CMDPRE 'C'
#define DATAPRE 'D'
#define XQTPRE 'X'
/*
* stuff for command execution
*/
#define X_RQDFILE 'F'
#define X_STDIN 'I'
#define X_STDOUT 'O'
#define X_STDERR 'E'
#define X_CMD 'C'
#define X_USER 'U'
#define X_BRINGBACK 'B'
#define X_MAILF 'M'
#define X_RETADDR 'R'
#define X_COMMENT '#'
#define X_NONZERO 'Z'
#define X_SENDNOTHING 'N'
#define X_SENDZERO 'n'
/* This structure describes call routines */
struct caller {
const char *CA_type;
int (*CA_caller)();
};
/* structure for a saved C file */
struct cs_struct {
char file[NAMESIZE];
char sys[NAMESIZE+5];
char sgrade[NAMESIZE];
char grade;
long jsize;
};
/* This structure describes dialing routines */
struct dialer {
char *DI_type;
int (*DI_dialer)();
};
struct nstat {
pid_t t_pid; /* process id */
time_t t_start; /* start time */
time_t t_scall; /* start call to system */
time_t t_ecall; /* end call to system */
time_t t_tacu; /* acu time */
time_t t_tlog; /* login time */
time_t t_sftp; /* start file transfer protocol */
time_t t_sxf; /* start xfer */
time_t t_exf; /* end xfer */
time_t t_eftp; /* end file transfer protocol */
time_t t_qtime; /* time file queued */
int t_ndial; /* # of dials */
int t_nlogs; /* # of login trys */
struct tms t_tbb; /* start execution times */
struct tms t_txfs; /* xfer start times */
struct tms t_txfe; /* xfer end times */
struct tms t_tga; /* garbage execution times */
};
/* This structure describes the values from Limits file */
struct limits {
int totalmax; /* overall limit */
int sitemax; /* limit per site */
char mode[64]; /* uucico mode */
};
/* external declarations */
static ssize_t (*Read)(), (*Write)();
static int (*Ioctl)(int, int, ...);
static int Debug, Verbose;
static uid_t Uid, Euid; /* user-id and effective-uid */
static mode_t Dev_mode; /* save device mode here */
static long Retrytime;
static char Dc[]; /* line name */
static const char *Spool;
static const char *Pubdir;
static char Progname[];
static char *Bnptr; /* used when BASENAME macro is expanded */
static int Uerror; /* global error code */
static char *UerrorText[]; /* text for error code */
#define UERRORTEXT UerrorText[Uerror]
#define UTEXT(x) UerrorText[x]
/* things get kind of tricky beyond this point -- please stay out */
/* uucp functions and subroutine */
static void (*genbrk)();
extern int iswrk(), gtwvec(); /* anlwrk.c */
extern void findgrade(); /* grades.c */
extern void chremdir(), mkremdir(); /* chremdir.c */
extern void toCorrupt(); /* cpmv.c */
extern int xmv(); /* cpmv.c */
static int getargs(); /* getargs.c */
static void bsfix(); /* getargs.c */
extern char *getprm(); /* getprm.c */
extern char *next_token(); /* permission.c */
extern char *nextarg(); /* permission.c */
extern int getuline(); /* permission.c */
static void logent(const char *, const char *); /* logent.c */
extern void commandlog(); /* logent.c */
extern time_t millitick(); /* logent.c */
extern unsigned long getfilesize(); /* statlog.c */
extern void putfilesize(); /* statlog.c */
extern int logFind(), mchFind(); /* permission.c */
extern int chkperm(), chkpth(); /* permission.c */
extern int cmdOK(), switchRole(); /* permission.c */
extern int callBack(), requestOK(); /* permission.c */
extern int noSpool(); /* permission.c */
extern void myName(); /* permission.c */
extern int mkdirs(); /* expfile.c */
extern int scanlimit(); /* limits.c */
extern void systat(); /* systat.c */
static int fd_mklock(); /* ulockf.c */
static int mklock(), cklock(); /* ulockf.c */
static void fd_rmlock(), rmlock(); /* ulockf.c */
extern char *timeStamp(); /* utility.c */
static void assert(const char *s1, const char *s2,
int i1, const char *s3, int i2); /* utility.c */
extern void uucpname(); /* uucpname.c */
extern int versys(); /* versys.c */
extern void xuuxqt(), xuucico(); /* xqt.c */
static void cleanup(); /* misc main.c */
#define ASSERT(e, s1, s2, i1) if (!(e)) { \
assert(s1, s2, i1, __FILE__, __LINE__); \
cleanup(FAIL); \
};
/* messages */
static const char Ct_OPEN[];
static const char Ct_WRITE[];
static const char Ct_READ[];
static const char Ct_CREATE[];
static const char Ct_ALLOCATE[];
static const char Ct_LOCK[];
static const char Ct_STAT[];
static const char Ct_CHOWN[];
static const char Ct_CHMOD[];
static const char Ct_LINK[];
static const char Ct_CHDIR[];
static const char Ct_UNLINK[];
static const char Wr_ROLE[];
static const char Ct_CORRUPT[];
static const char Ct_FORK[];
static const char Ct_CLOSE[];
static const char Ct_BADOWN[];
static const char Fl_EXISTS[];
#ifdef __cplusplus
}
#endif
#endif /* _UUCP_H */
|