1 /*        $NetBSD: defs.h,v 1.19 2011/09/06 18:28:18 joerg Exp $      */
2 
3 /*
4  * Copyright (c) 1983, 1993
5  *        The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  *        from: @(#)defs.h    8.1 (Berkeley) 6/9/93
32  */
33 
34 #include <sys/param.h>
35 #include <sys/stat.h>
36 #include <sys/time.h>
37 #include <sys/file.h>
38 
39 #include <netinet/in.h>
40 
41 #include <stdio.h>
42 #include <ctype.h>
43 #include <unistd.h>
44 #include <string.h>
45 #include <stdlib.h>
46 #include <dirent.h>
47 #include <time.h>
48 
49 #include "pathnames.h"
50 
51 /*
52  * The version number should be changed whenever the protocol changes.
53  */
54 #define VERSION      3
55 
56           /* defines for yacc */
57 #define EQUAL       1
58 #define LP          2
59 #define RP          3
60 #define SM          4
61 #define ARROW       5
62 #define COLON       6
63 #define DCOLON      7
64 #define NAME        8
65 #define STRING      9
66 #define INSTALL     10
67 #define NOTIFY      11
68 #define EXCEPT      12
69 #define PATTERN     13
70 #define SPECIAL     14
71 #define OPTION      15
72 
73           /* lexical definitions */
74 #define   QUOTE     0200                /* used internally for quoted characters */
75 #define   TRIM      0177                /* Mask to strip quote bit */
76 
77           /* table sizes */
78 #define HASHSIZE    1021
79 #define INMAX       3500
80 
81           /* option flags */
82 #define VERIFY      0x1
83 #define WHOLE       0x2
84 #define YOUNGER     0x4
85 #define COMPARE     0x8
86 #define REMOVE      0x10
87 #define FOLLOW      0x20
88 #define IGNLNKS     0x40
89 
90           /* expand type definitions */
91 #define E_VARS      0x1
92 #define E_SHELL     0x2
93 #define E_TILDE     0x4
94 #define E_ALL       0x7
95 
96           /* actions for lookup() */
97 #define LOOKUP      0
98 #define INSERT      1
99 #define REPLACE     2
100 
101 #define ALLOC(x) (struct x *) malloc(sizeof(struct x))
102 
103 struct namelist {   /* for making lists of strings */
104           char      *n_name;
105           struct    namelist *n_next;
106 };
107 
108 struct subcmd {
109           short     sc_type;  /* type - INSTALL,NOTIFY,EXCEPT,SPECIAL */
110           short     sc_options;
111           char      *sc_name;
112           struct    namelist *sc_args;
113           struct    subcmd *sc_next;
114 };
115 
116 struct cmd {
117           int       c_type;             /* type - ARROW,DCOLON */
118           char      *c_name;  /* hostname or time stamp file name */
119           char      *c_label; /* label for partial update */
120           struct    namelist *c_files;
121           struct    subcmd *c_cmds;
122           struct    cmd *c_next;
123 };
124 
125 struct linkbuf {
126           ino_t     inum;
127           dev_t     devnum;
128           int       count;
129           char      pathname[BUFSIZ];
130           char      target[BUFSIZ];
131           struct    linkbuf *nextp;
132 };
133 
134 extern int debug;             /* debugging flag */
135 extern int nflag;             /* NOP flag, don't execute commands */
136 extern int qflag;             /* Quiet. don't print messages */
137 extern int options;           /* global options */
138 
139 extern int nerrs;             /* number of errors seen */
140 extern int rem;                         /* remote file descriptor */
141 extern int iamremote;                   /* acting as remote server */
142 extern char tempfile[];                 /* file name for logging changes */
143 extern struct linkbuf *ihead; /* list of files with more than one link */
144 extern char host[];           /* host name of master copy */
145 extern char buf[BUFSIZ];      /* general purpose buffer */
146 
147 extern struct passwd *pw;     /* pointer to static area used by getpwent */
148 extern struct group *gr;      /* pointer to static area used by getgrent */
149 extern uid_t userid;                    /* user's user ID */
150 extern gid_t groupid;                   /* user's group ID */
151 
152 int        any(int, const char *);
153 char      *colon(char *);
154 void       cleanup(int) __dead;
155 void       define(char *);
156 void       docmds(char **, int, char **);
157 void       error(const char *, ...) __printflike(1, 2);
158 int        except(char *);
159 struct namelist *
160            expand(struct namelist *, int);
161 char      *exptilde(char [], char *);
162 void       fatal(const char *, ...) __printflike(1, 2);
163 int        inlist(struct namelist *, char *);
164 void       insert(char *,
165               struct namelist *, struct namelist *, struct subcmd *);
166 void       install(char *, char *, int, int);
167 void       dolog(FILE *, const char *, ...) __printflike(2, 3);
168 struct namelist *
169            lookup(char *, int, struct namelist *);
170 void       lostconn(int) __dead;
171 struct namelist *
172            makenl(char *);
173 void       freenl(struct namelist *);
174 struct subcmd *
175            makesubcmd(int);
176 void       freesubcmd(struct subcmd *);
177 void       prnames(struct namelist *);
178 void       server(void);
179 void       yyerror(const char *);
180 int        yyparse(void);
181