1 /* $OpenBSD: defs.h,v 1.16 2008/01/02 17:44:11 chl Exp $ */ 2 3 #ifndef __DEFS_H__ 4 #define __DEFS_H__ 5 /* 6 * Copyright (c) 1983 Regents of the University of California. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 /* 35 * $From: defs.h,v 1.6 2001/03/12 18:16:30 kim Exp $ 36 * @(#)defs.h 5.2 (Berkeley) 3/20/86 37 */ 38 39 #include <unistd.h> 40 #include <stdlib.h> 41 #include <stdio.h> 42 #include <string.h> 43 #include <ctype.h> 44 #include <errno.h> 45 #include <pwd.h> 46 #include <grp.h> 47 #include <regex.h> 48 #include <syslog.h> 49 #include <setjmp.h> 50 #include <sys/types.h> 51 #include <sys/param.h> 52 #include <sys/file.h> 53 #include <sys/time.h> 54 #include <sys/stat.h> 55 56 #ifndef __GNUC__ 57 # ifndef __attribute__ 58 # define __attribute__(a) 59 # endif 60 #endif 61 62 #ifndef __STDC__ 63 # ifndef const 64 # define const 65 # endif 66 #endif 67 68 #include "version.h" 69 #include "config-def.h" 70 #include "config.h" 71 #include "config-data.h" 72 #include "pathnames.h" 73 #include "types.h" 74 #include "filesys.h" 75 76 #include <signal.h> 77 78 /* 79 * This belongs in os-svr4.h but many SVR4 OS's 80 * define SVR4 externel to Rdist so we put this 81 * check here. 82 */ 83 #if defined(SVR4) 84 #define NEED_FCNTL_H 85 #define NEED_NETDB_H 86 #endif /* defined(SVR4) */ 87 88 #if defined(NEED_NETDB_H) 89 #include <netdb.h> 90 #endif /* NEED_NETDB_H */ 91 #if defined(NEED_FCNTL_H) 92 #include <fcntl.h> 93 #endif /* NEED_FCNTL_H */ 94 #if defined(NEED_LIMITS_H) 95 #include <limits.h> 96 #endif /* NEED_LIMITS_H */ 97 98 #if defined(ARG_TYPE) 99 #if ARG_TYPE == ARG_STDARG 100 #include <stdarg.h> 101 #endif 102 #if ARG_TYPE == ARG_VARARGS 103 #include <varargs.h> 104 #endif 105 #endif /* ARG_TYPE */ 106 107 /* boolean truth */ 108 #ifndef TRUE 109 #define TRUE 1 110 #endif 111 #ifndef FALSE 112 #define FALSE 0 113 #endif 114 115 /* file modes */ 116 #ifndef S_IXUSR 117 #define S_IXUSR 0000100 118 #endif 119 #ifndef S_IXGRP 120 #define S_IXGRP 0000010 121 #endif 122 #ifndef S_IXOTH 123 #define S_IXOTH 0000001 124 #endif 125 126 /* lexical definitions */ 127 #define QUOTECHAR 160 /* quote next character */ 128 129 /* table sizes */ 130 #define HASHSIZE 1021 131 #define INMAX 3500 132 133 /* expand type definitions */ 134 #define E_VARS 0x1 135 #define E_SHELL 0x2 136 #define E_TILDE 0x4 137 #define E_ALL 0x7 138 139 /* actions for lookup() */ 140 #define LOOKUP 0 141 #define INSERT 1 142 #define REPLACE 2 143 144 /* Bit flag test macros */ 145 #define IS_ON(b,f) (b > 0 && (b & f)) 146 #define IS_OFF(b,f) !(IS_ON(b,f)) 147 #define FLAG_ON(b,f) b |= f 148 #define FLAG_OFF(b,f) b &= ~(f) 149 150 /* 151 * POSIX systems should already have S_* defined. 152 */ 153 #ifndef S_ISDIR 154 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 155 #endif 156 #ifndef S_ISREG 157 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 158 #endif 159 #ifndef S_ISLNK 160 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) 161 #endif 162 163 #define ALLOC(x) (struct x *) xmalloc(sizeof(struct x)) 164 #define A(s) ((s) ? s : "<null>") 165 166 /* 167 * Environment variable names 168 */ 169 #define E_FILES "FILES" /* List of files */ 170 #define E_LOCFILE "FILE" /* Local Filename */ 171 #define E_REMFILE "REMFILE" /* Remote Filename */ 172 #define E_BASEFILE "BASEFILE" /* basename of Remote File */ 173 174 /* 175 * Suffix to use when saving files 176 */ 177 #ifndef SAVE_SUFFIX 178 #define SAVE_SUFFIX ".OLD" 179 #endif 180 181 /* 182 * Get system error string 183 */ 184 #define SYSERR strerror(errno) 185 186 #define COMMENT_CHAR '#' /* Config file comment char */ 187 #define CNULL '\0' /* NULL character */ 188 189 /* 190 * These are the top level protocol commands. 191 */ 192 #define C_NONE '=' /* No command - pass cleanly */ 193 #define C_ERRMSG '\1' /* Log an error message */ 194 #define C_FERRMSG '\2' /* Log a fatal error message */ 195 #define C_NOTEMSG '\3' /* Log a note message */ 196 #define C_LOGMSG '\4' /* Log a message */ 197 #define C_ACK '\5' /* Acknowledge */ 198 #define C_SETCONFIG 'c' /* Set configuration parameters */ 199 #define C_DIRTARGET 'T' /* Set target directory name */ 200 #define C_TARGET 't' /* Set target file name */ 201 #define C_RECVREG 'R' /* Receive a regular file */ 202 #define C_RECVDIR 'D' /* Receive a directory */ 203 #define C_RECVSYMLINK 'K' /* Receive a symbolic link */ 204 #define C_RECVHARDLINK 'k' /* Receive a hard link */ 205 #define C_END 'E' /* Indicate end of receive/send */ 206 #define C_CLEAN 'C' /* Clean up */ 207 #define C_QUERY 'Q' /* Query without checking */ 208 #define C_SPECIAL 'S' /* Execute special command */ 209 #define C_CMDSPECIAL 's' /* Execute cmd special command */ 210 #define C_CHMOG 'M' /* Chown,Chgrp,Chmod a file */ 211 212 #define ack() (void) sendcmd(C_ACK, (char *)NULL) 213 #define err() (void) sendcmd(C_ERRMSG, (char *)NULL) 214 215 /* 216 * Session startup commands. 217 */ 218 #define S_VERSION 'V' /* Version number */ 219 #define S_REMOTEUSER 'R' /* Remote user name */ 220 #define S_LOCALUSER 'L' /* Local user name */ 221 #define S_END 'E' /* End of session startup commands */ 222 223 /* 224 * These are the commands for "set config". 225 */ 226 #define SC_FREESPACE 's' /* Set min free space */ 227 #define SC_FREEFILES 'f' /* Set min free files */ 228 #define SC_HOSTNAME 'H' /* Set client hostname */ 229 #define SC_LOGGING 'L' /* Set logging options */ 230 #define SC_DEFOWNER 'o' /* Set default owner */ 231 #define SC_DEFGROUP 'g' /* Set default group */ 232 233 /* 234 * Query commands 235 */ 236 #define QC_ONNFS 'F' /* File exists & is on a NFS */ 237 #define QC_ONRO 'O' /* File exists & is on a readonly fs */ 238 #define QC_NO 'N' /* File does not exist */ 239 #define QC_SYM 'l' /* File exists & is a symlink */ 240 #define QC_YES 'Y' /* File does exist */ 241 242 /* 243 * Clean commands 244 */ 245 #define CC_QUERY 'Q' /* Query if file should be rm'ed */ 246 #define CC_END 'E' /* End of cleaning */ 247 #define CC_YES 'Y' /* File doesn't exist - remove */ 248 #define CC_NO 'N' /* File does exist - don't remove */ 249 250 /* 251 * Run Command commands 252 */ 253 #define RC_FILE 'F' /* Name of a target file */ 254 #define RC_COMMAND 'C' /* Command to run */ 255 256 /* 257 * Name list 258 */ 259 struct namelist { /* for making lists of strings */ 260 char *n_name; 261 regex_t *n_regex; 262 struct namelist *n_next; 263 }; 264 265 /* 266 * Sub command structure 267 */ 268 struct subcmd { 269 short sc_type; /* type - INSTALL,NOTIFY,EXCEPT,SPECIAL */ 270 opt_t sc_options; 271 char *sc_name; 272 struct namelist *sc_args; 273 struct subcmd *sc_next; 274 }; 275 276 /* 277 * Cmd flags 278 */ 279 #define CMD_ASSIGNED 0x01 /* This entry has been assigned */ 280 #define CMD_CONNFAILED 0x02 /* Connection failed */ 281 #define CMD_NOCHKNFS 0x04 /* Disable NFS checks */ 282 283 /* 284 * General command structure 285 */ 286 struct cmd { 287 int c_type; /* type - ARROW,DCOLON */ 288 int c_flags; /* flags - CMD_USED,CMD_FAILED */ 289 char *c_name; /* hostname or time stamp file name */ 290 char *c_label; /* label for partial update */ 291 struct namelist *c_files; 292 struct subcmd *c_cmds; 293 struct cmd *c_next; 294 }; 295 296 /* 297 * Hard link buffer information 298 */ 299 struct linkbuf { 300 ino_t inum; 301 dev_t devnum; 302 int count; 303 char *pathname; 304 char *src; 305 char *target; 306 struct linkbuf *nextp; 307 }; 308 309 extern char *optarg; /* Option argument */ 310 extern char *path_remsh; /* Remote shell command */ 311 extern char host[]; /* Host name of master copy */ 312 extern char *currenthost; /* Name of current host */ 313 extern char *progname; /* Name of this program */ 314 extern char **realargv; /* Real argv */ 315 extern int optind; /* Option index into argv */ 316 extern int debug; /* Debugging flag */ 317 extern opt_t defoptions; /* Default install options */ 318 extern int do_fork; /* Should we do fork()'ing */ 319 #ifndef __STDC__ 320 extern int errno; /* System error number */ 321 #endif 322 extern int isserver; /* Acting as remote server */ 323 extern int nerrs; /* Number of errors seen */ 324 extern int nflag; /* NOP flag, don't execute commands */ 325 extern opt_t options; /* Global options */ 326 extern int proto_version; /* Protocol version number */ 327 extern int realargc; /* Real argc */ 328 extern int rem_r; /* Remote file descriptor, reading */ 329 extern int rem_w; /* Remote file descriptor, writing */ 330 extern int rtimeout; /* Response time out in seconds */ 331 extern int setjmp_ok; /* setjmp/longjmp flag */ 332 extern UID_T userid; /* User ID of rdist user */ 333 extern jmp_buf finish_jmpbuf; /* Setjmp buffer for finish() */ 334 extern struct group *gr; /* pointer to static area used by getgrent */ 335 extern struct linkbuf *ihead; /* list of files with more than one link */ 336 extern struct passwd *pw; /* pointer to static area used by getpwent */ 337 extern char defowner[64]; /* Default owner */ 338 extern char defgroup[64]; /* Default group */ 339 extern volatile sig_atomic_t contimedout; /* Connection timed out */ 340 #ifdef USE_STATDB 341 extern int dostatdb; 342 extern int juststatdb; 343 #endif /* USE_STATDB */ 344 345 /* 346 * Our own declarations. 347 */ 348 349 /* child.c */ 350 void waitup(void); 351 int spawn(struct cmd *, struct cmd *); 352 int setnonblocking(int, int); 353 int setnonblocking(int, int); 354 355 /* client.c */ 356 char *remfilename(char *, char *, char *, char *, int); 357 int inlist(struct namelist *, char *); 358 void runcmdspecial(struct cmd *, opt_t); 359 int checkfilename(char *); 360 void freelinkinfo(struct linkbuf *); 361 void cleanup(int); 362 int install(char *, char *, int, int , opt_t); 363 364 /* common.c */ 365 WRITE_RETURN_T xwrite(int, void *, WRITE_AMT_T); 366 int init(int, char **, char **); 367 void finish(void); 368 void lostconn(void); 369 void coredump(void); 370 void sighandler(int); 371 int sendcmd(char, char *, ...); 372 int remline(u_char *, int, int); 373 int readrem(char *, int); 374 char *getusername(UID_T, char *, opt_t); 375 char *getgroupname(GID_T, char *, opt_t); 376 int response(void); 377 char *exptilde(char *, char *, size_t); 378 int becomeuser(void); 379 int becomeroot(void); 380 int setfiletime(char *, time_t, time_t); 381 char *getversion(void); 382 void runcommand(char *); 383 char *xmalloc(size_t); 384 char *xrealloc(char *, size_t); 385 char *xcalloc(size_t, size_t); 386 char *xstrdup(const char *); 387 char *xbasename(char *); 388 char *searchpath(char *); 389 int mysetlinebuf(FILE *); 390 391 /* distopt.c */ 392 DISTOPTINFO *getdistopt(char *, int *); 393 int parsedistopts(char *, opt_t *, int); 394 char *getdistoptlist(void); 395 char *getondistoptlist(opt_t); 396 397 /* docmd.c */ 398 void markassigned(struct cmd *, struct cmd *); 399 int okname(char *); 400 int except(char *); 401 void docmds(struct namelist *, int, char **); 402 403 /* expand.c */ 404 struct namelist *expand(struct namelist *, int); 405 u_char *xstrchr(u_char *, int); 406 void expstr(u_char *); 407 void expsh(u_char *); 408 void matchdir(char *); 409 int execbrc(u_char *, u_char *); 410 int match(char *, char *); 411 int amatch(char *, u_char *); 412 413 /* filesys.c */ 414 char *find_file(char *, struct stat *, int *); 415 mntent_t *findmnt(struct stat *, struct mntinfo *); 416 int isdupmnt(mntent_t *, struct mntinfo *); 417 void wakeup(int); 418 struct mntinfo *makemntinfo(struct mntinfo *); 419 mntent_t *getmntpt(char *, struct stat *, int *); 420 int is_nfs_mounted(char *, struct stat *, int *); 421 int is_ro_mounted(char *, struct stat *, int *); 422 int is_symlinked(char *, struct stat *, int *); 423 int getfilesysinfo(char *, long *, long *); 424 425 /* gram.c */ 426 int yylex(void); 427 int any(int, char *); 428 void insert(char *, struct namelist *, struct namelist *, struct subcmd *); 429 void append(char *, struct namelist *, char *, struct subcmd *); 430 void yyerror(char *); 431 struct namelist *makenl(char *); 432 struct subcmd *makesubcmd(int); 433 int yyparse(void); 434 435 /* hasmntopt.c */ 436 #ifdef NEED_HASMNTOPT 437 char *hasmntopt(struct mntent *, char *); 438 #endif 439 440 /* isexec.c */ 441 int isexec(char *, struct stat *); 442 443 /* lookup.c */ 444 void define(char *); 445 struct namelist *lookup(char *, int, struct namelist *); 446 447 /* message.c */ 448 void msgprusage(void); 449 void msgprconfig(void); 450 char *msgparseopts(char *, int); 451 void checkhostname(void); 452 void message(int, char *, ...); 453 void debugmsg(int, char *, ...); 454 void error(char *, ...); 455 void fatalerr(char *, ...); 456 char *getnotifyfile(void); 457 458 /* rdist.c */ 459 FILE *opendist(char *); 460 void docmdargs(int, char *[]); 461 char *getnlstr(struct namelist *); 462 463 /* rshrcmd.c */ 464 int rshrcmd(char **, u_short, char *, char *, char *, int *); 465 466 /* server.c */ 467 void server(void); 468 469 /* setargs.c */ 470 void setargs_settup(int, char **, char **); 471 void _setproctitle(char *); 472 void setproctitle(const char *, ...); 473 474 /* signal.c */ 475 #ifdef NEED_SIGBLOCK 476 int sigblock(int); 477 #endif 478 #ifdef NEED_SIGMASK 479 int sigsetmask(int); 480 #endif 481 482 /* strcasecmp.c */ 483 #ifdef NEED_STRCASECMP 484 int strcasecmp(char *, char *); 485 int strncasecmp(char *, char *, int); 486 #endif 487 488 /* strerror.c */ 489 #ifdef NEED_STRERROR 490 char *strerror(int); 491 #endif 492 493 /* strtol.c */ 494 #ifdef NEED_STRTOL 495 long strtol(char *, char **, int); 496 #endif 497 498 /* unvis.c */ 499 #ifdef NEED_VIS 500 int unvis(char *, int, int *, int ); 501 int strunvis(char *, const char *); 502 #endif 503 504 /* vis.c */ 505 #ifdef NEED_VIS 506 char *vis(char *, int, int, int ); 507 int strvis(char *, const char *, int); 508 int strvisx(char *, const char *, size_t, int); 509 #endif 510 511 /* vsnprintf.c */ 512 #ifdef NEED_VSNPRINTF 513 int vsnprintf(char *, size_t, const char *, va_list); 514 int snprintf(char *, size_t, const char *, ...); 515 #endif 516 517 /* zopen.c */ 518 int zread(void *, char *, int); 519 int zwrite(void *, const char *, int); 520 int z_close(void *); 521 void *z_open(int, char *, int); 522 523 #include <vis.h> 524 #define DECODE(a, b) strunvis(a, b) 525 #define ENCODE(a, b) strvis(a, b, VIS_WHITE) 526 527 #endif /* __DEFS_H__ */ 528