sync from MirBSD
[alioth/cvs.git] / src / cvs.h
1 /* $MirOS: src/gnu/usr.bin/cvs/src/cvs.h,v 1.9 2017/11/18 23:04:55 tg Exp $ */
2
3 /*
4  * Copyright © 2017 mirabilos <m@mirbsd.org>
5  * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
6  *
7  * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
8  *                                  and others.
9  *
10  * Portions Copyright (C) 1992, Brian Berliner and Jeff Polk
11  * Portions Copyright (C) 1989-1992, Brian Berliner
12  *
13  * You may distribute under the terms of the GNU General Public License as
14  * specified in the README file that comes with the CVS kit.
15  */
16
17 /*
18  * basic information used in all source files
19  *
20  */
21
22
23 #ifdef HAVE_CONFIG_H
24 # include <config.h>            /* this is stuff found via autoconf */
25 #endif /* CONFIG_H */
26
27 /* Add GNU attribute suppport.  */
28 #ifndef __attribute__
29 /* This feature is available in gcc versions 2.5 and later.  */
30 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || (defined(__STRICT_ANSI__) && (__STRICT_ANSI__))
31 #  define __attribute__(Spec) /* empty */
32 # else
33 #   if __GNUC__ == 2 && __GNUC_MINOR__ < 96
34 #    define __pure__    /* empty */
35 #   endif
36 #   if __GNUC__ < 3
37 #    define __malloc__  /* empty */
38 #   endif
39 # endif
40 /* The __-protected variants of `format' and `printf' attributes
41    are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
42 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
43 #  define __const__     const
44 #  define __format__    format
45 #  define __noreturn__  noreturn
46 #  define __printf__    printf
47 # endif
48 #endif /* __attribute__ */
49
50 /* Some GNULIB headers require that we include system headers first.  */
51 #include "system.h"
52
53 /* begin GNULIB headers */
54 #include "dirname.h"
55 #include "exit.h"
56 #include "getdate.h"
57 #include "minmax.h"
58 #include "regex.h"
59 #include "strcase.h"
60 #include "stat-macros.h"
61 #include "timespec.h"
62 #include "unlocked-io.h"
63 #include "xalloc.h"
64 #include "xgetcwd.h"
65 #include "xreadlink.h"
66 #include "xsize.h"
67 /* end GNULIB headers */
68
69 #if ! STDC_HEADERS
70 char *getenv();
71 #endif /* ! STDC_HEADERS */
72
73 /* Under OS/2, <stdio.h> doesn't define popen()/pclose(). */
74 #ifdef USE_OWN_POPEN
75 #include "popen.h"
76 #endif
77
78 #ifdef SERVER_SUPPORT
79 /* If the system doesn't provide strerror, it won't be declared in
80    string.h.  */
81 char *strerror (int);
82 #endif
83
84 #include "hash.h"
85 #include "stack.h"
86
87 #include "root.h"
88
89 #if defined(SERVER_SUPPORT) || defined(CLIENT_SUPPORT)
90 # include "client.h"
91 #endif
92
93 #ifdef MY_NDBM
94 #include "myndbm.h"
95 #else
96 #include <ndbm.h>
97 #endif /* MY_NDBM */
98
99 #include "wait.h"
100
101 #include "rcs.h"
102
103
104
105 /* Note that the _ONLY_ reason for PATH_MAX is if various system calls (getwd,
106  * getcwd, readlink) require/want us to use it.  All other parts of CVS
107  * allocate pathname buffers dynamically, and we want to keep it that way.
108  */
109 #include "pathmax.h"
110
111
112
113 /* Definitions for the CVS Administrative directory and the files it contains.
114    Here as #define's to make changing the names a simple task.  */
115
116 #ifdef USE_VMS_FILENAMES
117 #define CVSADM          "CVS"
118 #define CVSADM_ENT      "CVS/Entries."
119 #define CVSADM_ENTBAK   "CVS/Entries.Backup"
120 #define CVSADM_ENTLOG   "CVS/Entries.Log"
121 #define CVSADM_ENTSTAT  "CVS/Entries.Static"
122 #define CVSADM_REP      "CVS/Repository."
123 #define CVSADM_ROOT     "CVS/Root."
124 #define CVSADM_TAG      "CVS/Tag."
125 #define CVSADM_NOTIFY   "CVS/Notify."
126 #define CVSADM_NOTIFYTMP "CVS/Notify.tmp"
127 #define CVSADM_BASE      "CVS/Base"
128 #define CVSADM_BASEREV   "CVS/Baserev."
129 #define CVSADM_BASEREVTMP "CVS/Baserev.tmp"
130 #define CVSADM_TEMPLATE "CVS/Template."
131 #else /* USE_VMS_FILENAMES */
132 #define CVSADM          "CVS"
133 #define CVSADM_ENT      "CVS/Entries"
134 #define CVSADM_ENTBAK   "CVS/Entries.Backup"
135 #define CVSADM_ENTLOG   "CVS/Entries.Log"
136 #define CVSADM_ENTSTAT  "CVS/Entries.Static"
137 #define CVSADM_REP      "CVS/Repository"
138 #define CVSADM_ROOT     "CVS/Root"
139 #define CVSADM_TAG      "CVS/Tag"
140 #define CVSADM_NOTIFY   "CVS/Notify"
141 #define CVSADM_NOTIFYTMP "CVS/Notify.tmp"
142 /* A directory in which we store base versions of files we currently are
143    editing with "cvs edit".  */
144 #define CVSADM_BASE     "CVS/Base"
145 #define CVSADM_BASEREV  "CVS/Baserev"
146 #define CVSADM_BASEREVTMP "CVS/Baserev.tmp"
147 /* File which contains the template for use in log messages.  */
148 #define CVSADM_TEMPLATE "CVS/Template"
149 #endif /* USE_VMS_FILENAMES */
150
151 /* This is the special directory which we use to store various extra
152    per-directory information in the repository.  It must be the same as
153    CVSADM to avoid creating a new reserved directory name which users cannot
154    use, but is a separate #define because if anyone changes it (which I don't
155    recommend), one needs to deal with old, unconverted, repositories.
156    
157    See fileattr.h for details about file attributes, the only thing stored
158    in CVSREP currently.  */
159 #define CVSREP "CVS"
160
161 /*
162  * Definitions for the CVSROOT Administrative directory and the files it
163  * contains.  This directory is created as a sub-directory of the $CVSROOT
164  * environment variable, and holds global administration information for the
165  * entire source repository beginning at $CVSROOT.
166  */
167 #define CVSROOTADM              "CVSROOT"
168 #define CVSROOTADM_CHECKOUTLIST "checkoutlist"
169 #define CVSROOTADM_COMMITINFO   "commitinfo"
170 #define CVSROOTADM_CONFIG       "config"
171 #define CVSROOTADM_HISTORY      "history"
172 #define CVSROOTADM_IGNORE       "cvsignore"
173 #define CVSROOTADM_LOGINFO      "loginfo"
174 #define CVSROOTADM_MODULES      "modules"
175 #define CVSROOTADM_NOTIFY       "notify"
176 #define CVSROOTADM_PASSWD       "passwd"
177 #define CVSROOTADM_POSTADMIN    "postadmin"
178 #define CVSROOTADM_POSTPROXY    "postproxy"
179 #define CVSROOTADM_POSTTAG      "posttag"
180 #define CVSROOTADM_POSTWATCH    "postwatch"
181 #define CVSROOTADM_PREPROXY     "preproxy"
182 #define CVSROOTADM_RCSINFO      "rcsinfo"
183 #define CVSROOTADM_READERS      "readers"
184 #define CVSROOTADM_TAGINFO      "taginfo"
185 #define CVSROOTADM_USERS        "users"
186 #define CVSROOTADM_VALTAGS      "val-tags"
187 #define CVSROOTADM_VERIFYMSG    "verifymsg"
188 #define CVSROOTADM_WRAPPER      "cvswrappers"
189 #define CVSROOTADM_WRITERS      "writers"
190
191 #define CVSNULLREPOS            "Emptydir"      /* an empty directory */
192
193 /* Other CVS file names */
194
195 /* Files go in the attic if the head main branch revision is dead,
196    otherwise they go in the regular repository directories.  The whole
197    concept of having an attic is sort of a relic from before death
198    support but on the other hand, it probably does help the speed of
199    some operations (such as main branch checkouts and updates).  */
200 #define CVSATTIC        "Attic"
201
202 #define CVSLCK          "#cvs.lock"
203 #define CVSHISTORYLCK   "#cvs.history.lock"
204 #define CVSVALTAGSLCK   "#cvs.val-tags.lock"
205 #define CVSRFL          "#cvs.rfl"
206 #define CVSPFL          "#cvs.pfl"
207 #define CVSWFL          "#cvs.wfl"
208 #define CVSPFLPAT       "#cvs.pfl.*"    /* wildcard expr to match plocks */
209 #define CVSRFLPAT       "#cvs.rfl.*"    /* wildcard expr to match read locks */
210 #define CVSEXT_LOG      ",t"
211 #define CVSPREFIX       ",,"
212 #define CVSDOTIGNORE    ".cvsignore"
213 #define CVSDOTWRAPPER   ".cvswrappers"
214
215 /* Command attributes -- see function lookup_command_attribute(). */
216 #define CVS_CMD_IGNORE_ADMROOT        1
217
218 /* Set if CVS needs to create a CVS/Root file upon completion of this
219    command.  The name may be slightly confusing, because the flag
220    isn't really as general purpose as it seems (it is not set for cvs
221    release).  */
222
223 #define CVS_CMD_USES_WORK_DIR         2
224
225 #define CVS_CMD_MODIFIES_REPOSITORY   4
226
227 /* miscellaneous CVS defines */
228
229 /* This is the string which is at the start of the non-log-message lines
230    that we put up for the user when they edit the log message.  */
231 #define CVSEDITPREFIX   "CVS: "
232 /* Number of characters in CVSEDITPREFIX to compare when deciding to strip
233    off those lines.  We don't check for the space, to accomodate users who
234    have editors which strip trailing spaces.  */
235 #define CVSEDITPREFIXLEN 4
236
237 #define CVSLCKAGE       (60*60)         /* 1-hour old lock files cleaned up */
238 #define CVSLCKSLEEP     30              /* wait 30 seconds before retrying */
239 #define CVSBRANCH       "1.1.1"         /* RCS branch used for vendor srcs */
240
241 #ifdef USE_VMS_FILENAMES
242 # define BAKPREFIX      "_$"
243 #else /* USE_VMS_FILENAMES */
244 # define BAKPREFIX      ".#"            /* when rcsmerge'ing */
245 #endif /* USE_VMS_FILENAMES */
246
247 /*
248  * Special tags. -rHEAD refers to the head of an RCS file, regardless of any
249  * sticky tags. -rBASE  refers to the current revision the user has checked
250  * out This mimics the behaviour of RCS.
251  */
252 #define TAG_HEAD        "HEAD"
253 #define TAG_BASE        "BASE"
254
255 /* Environment variable used by CVS */
256 #define CVSREAD_ENV     "CVSREAD"       /* make files read-only */
257 #define CVSREAD_DFLT    0               /* writable files by default */
258
259 #define CVSREADONLYFS_ENV "CVSREADONLYFS" /* repository is read-only */
260
261 #define TMPDIR_ENV      "TMPDIR"        /* Temporary directory */
262 #define CVS_PID_ENV     "CVS_PID"       /* pid of running cvs */
263
264 #define EDITOR1_ENV     "CVSEDITOR"     /* which editor to use */
265 #define EDITOR2_ENV     "VISUAL"        /* which editor to use */
266 #define EDITOR3_ENV     "EDITOR"        /* which editor to use */
267
268 #define CVSROOT_ENV     "CVSROOT"       /* source directory root */
269 /* Define CVSROOT_DFLT to a fallback value for CVSROOT.
270  *
271 #undef  CVSROOT_DFL
272  */
273
274 #define IGNORE_ENV      "CVSIGNORE"     /* More files to ignore */
275 #define WRAPPER_ENV     "CVSWRAPPERS"   /* name of the wrapper file */
276
277 #define CVSUMASK_ENV    "CVSUMASK"      /* Effective umask for repository */
278
279 /*
280  * If the beginning of the Repository matches the following string, strip it
281  * so that the output to the logfile does not contain a full pathname.
282  *
283  * If the CVSROOT environment variable is set, it overrides this define.
284  */
285 #define REPOS_STRIP     "/master/"
286
287 /* Large enough to hold DATEFORM.  Not an arbitrary limit as long as
288    it is used for that purpose, and not to hold a string from the
289    command line, the client, etc.  */
290 #define MAXDATELEN      50
291
292 /* The type of an entnode.  */
293 enum ent_type
294 {
295     ENT_FILE, ENT_SUBDIR
296 };
297
298 /* structure of a entry record */
299 struct entnode
300 {
301     enum ent_type type;
302     char *user;
303     char *version;
304
305     /* Timestamp, or "" if none (never NULL).  */
306     char *timestamp;
307
308     /* Keyword expansion options, or "" if none (never NULL).  */
309     char *options;
310
311     char *tag;
312     char *date;
313     char *conflict;
314 };
315 typedef struct entnode Entnode;
316
317 /* The type of request that is being done in do_module() */
318 enum mtype
319 {
320     CHECKOUT, TAG, PATCH, EXPORT, MISC
321 };
322
323 /*
324  * structure used for list-private storage by Entries_Open() and
325  * Version_TS() and Find_Directories().
326  */
327 struct stickydirtag
328 {
329     /* These fields pass sticky tag information from Entries_Open() to
330        Version_TS().  */
331     int aflag;
332     char *tag;
333     char *date;
334     int nonbranch;
335
336     /* This field is set by Entries_Open() if there was subdirectory
337        information; Find_Directories() uses it to see whether it needs
338        to scan the directory itself.  */
339     int subdirs;
340 };
341
342 /* Flags for find_{names,dirs} routines */
343 #define W_LOCAL                 0x01    /* look for files locally */
344 #define W_REPOS                 0x02    /* look for files in the repository */
345 #define W_ATTIC                 0x04    /* look for files in the attic */
346
347 /* Flags for return values of direnter procs for the recursion processor */
348 enum direnter_type
349 {
350     R_PROCESS = 1,                      /* process files and maybe dirs */
351     R_SKIP_FILES,                       /* don't process files in this dir */
352     R_SKIP_DIRS,                        /* don't process sub-dirs */
353     R_SKIP_ALL                          /* don't process files or dirs */
354 };
355 #ifdef ENUMS_CAN_BE_TROUBLE
356 typedef int Dtype;
357 #else
358 typedef enum direnter_type Dtype;
359 #endif
360
361 /* Recursion processor lock types */
362 #define CVS_LOCK_NONE   0
363 #define CVS_LOCK_READ   1
364 #define CVS_LOCK_WRITE  2
365
366 /* Option flags for Parse_Info() */
367 #define PIOPT_ALL 1     /* accept "all" keyword */
368
369 extern const char *program_name, *program_path, *cvs_cmd_name;
370 extern char *Editor;
371 extern char *LogMsgFile;
372 extern int cvsadmin_root;
373 extern char *CurDir;
374 extern int really_quiet, quiet;
375 extern int use_editor;
376 extern int cvswrite;
377 extern mode_t cvsumask;
378
379 /* Temp dir abstraction.  */
380 /* From main.c.  */
381 const char *get_cvs_tmp_dir (void);
382 /* From filesubr.c.  */
383 const char *get_system_temp_dir (void);
384 void push_env_temp_dir (void);
385
386
387 /* This global variable holds the global -d option.  It is NULL if -d
388    was not used, which means that we must get the CVSroot information
389    from the CVSROOT environment variable or from a CVS/Root file.  */
390 extern char *CVSroot_cmdline;
391
392 /* This variable keeps track of all of the CVSROOT directories that
393  * have been seen by the client.
394  */
395 extern List *root_directories;
396
397 char *emptydir_name (void);
398 int safe_location (char *);
399
400 extern int trace;               /* Show all commands */
401 extern int noexec;              /* Don't modify disk anywhere */
402 extern int readonlyfs;          /* fail on all write locks; succeed all read locks */
403 extern int logoff;              /* Don't write history entry */
404
405
406
407 #define LOGMSG_REREAD_NEVER 0   /* do_verify - never  reread message */
408 #define LOGMSG_REREAD_ALWAYS 1  /* do_verify - always reread message */
409 #define LOGMSG_REREAD_STAT 2    /* do_verify - reread message if changed */
410
411 /* This header needs the LOGMSG_* defns above.  */
412 #include "parseinfo.h"
413
414 /* This structure holds the global configuration data.  */
415 extern struct config *config;
416
417 #ifdef CLIENT_SUPPORT
418 extern List *dirs_sent_to_server; /* used to decide which "Argument
419                                      xxx" commands to send to each
420                                      server in multiroot mode. */
421 #endif
422
423 extern char *hostname;
424
425 /* Externs that are included directly in the CVS sources */
426
427 int RCS_merge (RCSNode *, const char *, const char *, const char *,
428                const char *, const char *);
429 /* Flags used by RCS_* functions.  See the description of the individual
430    functions for which flags mean what for each function.  */
431 #define RCS_FLAGS_FORCE 1
432 #define RCS_FLAGS_DEAD 2
433 #define RCS_FLAGS_QUIET 4
434 #define RCS_FLAGS_MODTIME 8
435 #define RCS_FLAGS_KEEPFILE 16
436 #define RCS_FLAGS_USETIME 32
437
438 int RCS_exec_rcsdiff (RCSNode *rcsfile, int diff_argc,
439                       char * const *diff_argv, const char *options,
440                       const char *rev1, const char *rev1_cache,
441                       const char *rev2,
442                       const char *label1, const char *label2,
443                       const char *workfile);
444 int diff_exec (const char *file1, const char *file2,
445                const char *label1, const char *label2,
446                int iargc, char * const *iargv, const char *out);
447
448
449 #include "error.h"
450
451 /* If non-zero, error will use the CVS protocol to report error
452  * messages.  This will only be set in the CVS server parent process;
453  * most other code is run via do_cvs_command, which forks off a child
454  * process and packages up its stderr in the protocol.
455  *
456  * This needs to be here rather than in error.h in order to use an unforked
457  * error.h from GNULIB.
458  */
459 extern int error_use_protocol;
460
461
462 DBM *open_module (void);
463 List *Find_Directories (char *repository, int which, List *entries);
464 void Entries_Close (List *entries);
465 List *Entries_Open (int aflag, char *update_dir);
466 void Subdirs_Known (List *entries);
467 void Subdir_Register (List *, const char *, const char *);
468 void Subdir_Deregister (List *, const char *, const char *);
469
470 void parse_tagdate (char **tag, char **date, const char *input);
471 char *Make_Date (const char *rawdate);
472 char *date_from_time_t (time_t);
473 void date_to_internet (char *, const char *);
474 void date_to_tm (struct tm *, const char *);
475 void tm_to_internet (char *, const struct tm *);
476 char *gmformat_time_t (time_t unixtime);
477 char *format_date_alloc (char *text);
478
479 char *Name_Repository (const char *dir, const char *update_dir);
480 const char *Short_Repository (const char *repository);
481 void Sanitize_Repository_Name (char *repository);
482
483 char *entries_time (time_t unixtime);
484 time_t unix_time_stamp (const char *file);
485 char *time_stamp (const char *file);
486
487 typedef int (*CALLPROC) (const char *repository, const char *value,
488                          void *closure);
489 int Parse_Info (const char *infofile, const char *repository,
490                 CALLPROC callproc, int opt, void *closure);
491
492 typedef RETSIGTYPE (*SIGCLEANUPPROC)    (int);
493 int SIG_register (int sig, SIGCLEANUPPROC sigcleanup);
494 bool isdir (const char *file);
495 bool isfile (const char *file);
496 ssize_t islink (const char *file);
497 bool isdevice (const char *file);
498 bool isreadable (const char *file);
499 bool iswritable (const char *file);
500 bool isaccessible (const char *file, const int mode);
501 const char *last_component (const char *path);
502 char *get_homedir (void);
503 char *strcat_filename_onto_homedir (const char *, const char *);
504 char *cvs_temp_name (void);
505 FILE *cvs_temp_file (char **filename);
506
507 int ls (int argc, char *argv[]);
508 int unlink_file (const char *f);
509 int unlink_file_dir (const char *f);
510
511 int suck (int argc, char *argv[]);
512
513 /* This is the structure that the recursion processor passes to the
514    fileproc to tell it about a particular file.  */
515 struct file_info
516 {
517     /* Name of the file, without any directory component.  */
518     const char *file;
519
520     /* Name of the directory we are in, relative to the directory in
521        which this command was issued.  We have cd'd to this directory
522        (either in the working directory or in the repository, depending
523        on which sort of recursion we are doing).  If we are in the directory
524        in which the command was issued, this is "".  */
525     const char *update_dir;
526
527     /* update_dir and file put together, with a slash between them as
528        necessary.  This is the proper way to refer to the file in user
529        messages.  */
530     const char *fullname;
531
532     /* Name of the directory corresponding to the repository which contains
533        this file.  */
534     const char *repository;
535
536     /* The pre-parsed entries for this directory.  */
537     List *entries;
538
539     RCSNode *rcs;
540 };
541
542 /* This needs to be included after the struct file_info definition since some
543  * of the functions subr.h defines refer to struct file_info.
544  */
545 #include "subr.h"
546
547 int update (int argc, char *argv[]);
548 /* The only place this is currently used outside of update.c is add.c.
549  * Restricting its use to update.c seems to be in the best interest of
550  * modularity, but I can't think of a good way to get an update of a
551  * resurrected file done and print the fact otherwise.
552  */
553 void write_letter (struct file_info *finfo, int letter);
554 int xcmp (const char *file1, const char *file2);
555 void *valloc (size_t bytes);
556
557 int Create_Admin (const char *dir, const char *update_dir,
558                   const char *repository, const char *tag, const char *date,
559                   int nonbranch, int warn, int dotemplate);
560 int expand_at_signs (const char *, size_t, FILE *);
561
562 /* Locking subsystem (implemented in lock.c).  */
563
564 int Reader_Lock (char *xrepository);
565 void Simple_Lock_Cleanup (void);
566 void Lock_Cleanup (void);
567
568 /* Writelock an entire subtree, well the part specified by ARGC, ARGV, LOCAL,
569    and AFLAG, anyway.  */
570 void lock_tree_promotably (int argc, char **argv, int local, int which,
571                            int aflag);
572
573 /* See lock.c for description.  */
574 void lock_dir_for_write (const char *);
575
576 /* Get a write lock for the history file.  */
577 int history_lock (const char *);
578 void clear_history_lock (void);
579
580 /* Get a write lock for the val-tags file.  */
581 int val_tags_lock (const char *);
582 void clear_val_tags_lock (void);
583
584 void Scratch_Entry (List * list, const char *fname);
585 void ParseTag (char **tagp, char **datep, int *nonbranchp);
586 void WriteTag (const char *dir, const char *tag, const char *date,
587                int nonbranch, const char *update_dir, const char *repository);
588 void WriteTemplate (const char *update_dir, int dotemplate,
589                     const char *repository);
590 void cat_module (int status);
591 void check_entries (char *dir);
592 void close_module (DBM * db);
593 void copy_file (const char *from, const char *to);
594 void fperrmsg (FILE * fp, int status, int errnum, char *message, ...)
595         __attribute__ ((__format__(__printf__, 4, 5)));
596
597 int ign_name (char *name);
598 void ign_add (char *ign, int hold);
599 void ign_add_file (char *file, int hold);
600 void ign_setup (void);
601 void ign_dir_add (char *name);
602 int ignore_directory (const char *name);
603 typedef void (*Ignore_proc) (const char *, const char *);
604 void ignore_files (List *, List *, const char *, Ignore_proc);
605 extern int ign_inhibit_server;
606
607 #include "update.h"
608
609 void make_directories (const char *name);
610 void make_directory (const char *name);
611 int mkdir_if_needed (const char *name);
612 void rename_file (const char *from, const char *to);
613 /* Expand wildcards in each element of (ARGC,ARGV).  This is according to the
614    files which exist in the current directory, and accordingly to OS-specific
615    conventions regarding wildcard syntax.  It might be desirable to change the
616    former in the future (e.g. "cvs status *.h" including files which don't exist
617    in the working directory).  The result is placed in *PARGC and *PARGV;
618    the *PARGV array itself and all the strings it contains are newly
619    malloc'd.  It is OK to call it with PARGC == &ARGC or PARGV == &ARGV.  */
620 void expand_wild (int argc, char **argv, 
621                   int *pargc, char ***pargv);
622
623 /* exithandle.c */
624 void signals_register (RETSIGTYPE (*handler)(int));
625 void cleanup_register (void (*handler) (void));
626
627 void update_delproc (Node * p);
628 void usage (const char *const *cpp)
629         __attribute__((__noreturn__));
630 void xchmod (const char *fname, int writable);
631 List *Find_Names (char *repository, int which, int aflag,
632                   List ** optentries);
633 void Register (List * list, const char *fname, const char *vn, const char *ts,
634                const char *options, const char *tag, const char *date,
635                const char *ts_conflict);
636 void Update_Logfile (const char *repository, const char *xmessage,
637                      FILE *xlogfp, List *xchanges);
638 void do_editor (const char *dir, char **messagep,
639                 const char *repository, List *changes);
640 void logmsg_cleanup (int err);
641
642 void do_verify (char **messagep, const char *repository, List *changes);
643
644 typedef int (*CALLBACKPROC)     (int argc, char *argv[], char *where,
645         char *mwhere, char *mfile, int shorten, int local_specified,
646         char *omodule, char *msg);
647
648
649 typedef int (*FILEPROC) (void *callerdat, struct file_info *finfo);
650 typedef int (*FILESDONEPROC) (void *callerdat, int err,
651                               const char *repository, const char *update_dir,
652                               List *entries);
653 typedef Dtype (*DIRENTPROC) (void *callerdat, const char *dir,
654                              const char *repos, const char *update_dir,
655                              List *entries);
656 typedef int (*DIRLEAVEPROC) (void *callerdat, const char *dir, int err,
657                              const char *update_dir, List *entries);
658
659 int mkmodules (char *dir);
660 int init (int argc, char **argv);
661
662 int do_module (DBM * db, char *mname, enum mtype m_type, char *msg,
663                 CALLBACKPROC callback_proc, char *where, int shorten,
664                 int local_specified, int run_module_prog, int build_dirs,
665                 char *extra_arg);
666 void history_write (int type, const char *update_dir, const char *revs,
667                     const char *name, const char *repository);
668 int start_recursion (FILEPROC fileproc, FILESDONEPROC filesdoneproc,
669                      DIRENTPROC direntproc, DIRLEAVEPROC dirleaveproc,
670                      void *callerdat,
671                      int argc, char *argv[], int local, int which,
672                      int aflag, int locktype, char *update_preload,
673                      int dosrcs, char *repository);
674 void SIG_beginCrSect (void);
675 void SIG_endCrSect (void);
676 int SIG_inCrSect (void);
677 void read_cvsrc (int *argc, char ***argv, const char *cmdname);
678
679 /* flags for run_exec(), the fast system() for CVS */
680 #define RUN_NORMAL            0x0000    /* no special behaviour */
681 #define RUN_COMBINED          0x0001    /* stdout is duped to stderr */
682 #define RUN_REALLY            0x0002    /* do the exec, even if noexec is on */
683 #define RUN_STDOUT_APPEND     0x0004    /* append to stdout, don't truncate */
684 #define RUN_STDERR_APPEND     0x0008    /* append to stderr, don't truncate */
685 #define RUN_SIGIGNORE         0x0010    /* ignore interrupts for command */
686 #define RUN_TTY               (char *)0 /* for the benefit of lint */
687
688 void run_add_arg_p (int *, size_t *, char ***, const char *s);
689 void run_arg_free_p (int, char **);
690 void run_add_arg (const char *s);
691 void run_print (FILE * fp);
692 void run_setup (const char *prog);
693 int run_exec (const char *stin, const char *stout, const char *sterr,
694               int flags);
695 int run_piped (int *, int *);
696
697 /* other similar-minded stuff from run.c.  */
698 FILE *run_popen (const char *, const char *);
699 int piped_child (char *const *, int *, int *, bool);
700 void close_on_exec (int);
701
702 pid_t waitpid (pid_t, int *, int);
703
704 /*
705  * a struct vers_ts contains all the information about a file including the
706  * user and rcs file names, and the version checked out and the head.
707  *
708  * this is usually obtained from a call to Version_TS which takes a
709  * tag argument for the RCS file if desired
710  */
711 struct vers_ts
712 {
713     /* rcs version user file derives from, from CVS/Entries.
714        It can have the following special values:
715
716        NULL = file is not mentioned in Entries (this is also used for a
717               directory).
718        "" = INVALID!  The comment used to say that it meant "no user file"
719             but as far as I know CVS didn't actually use it that way.
720             Note that according to cvs.texinfo, "" is not valid in the
721             Entries file.
722        0 = user file is new
723        -vers = user file to be removed.  */
724     char *vn_user;
725
726     /* Numeric revision number corresponding to ->vn_tag (->vn_tag
727        will often be symbolic).  */
728     char *vn_rcs;
729     /* If ->tag is a simple tag in the RCS file--a tag which really
730        exists which is not a magic revision--and if ->date is NULL,
731        then this is a copy of ->tag.  Otherwise, it is a copy of
732        ->vn_rcs.  */
733     char *vn_tag;
734
735     /* This is the timestamp from stating the file in the working directory.
736        It is NULL if there is no file in the working directory.  It is
737        "Is-modified" if we know the file is modified but don't have its
738        contents.  See also: ts_user_ists.  */
739     char *ts_user;
740     /* Timestamp from CVS/Entries.  For the server, ts_user and ts_rcs
741        are computed in a slightly different way, but the fact remains that
742        if they are equal the file in the working directory is unmodified
743        and if they differ it is modified.  */
744     char *ts_rcs;
745
746     /* Options from CVS/Entries (keyword expansion), malloc'd.  If none,
747        then it is an empty string (never NULL).  */
748     char *options;
749
750     /* If non-NULL, there was a conflict (or merely a merge?  See merge_file)
751        and the time stamp in this field is the time stamp of the working
752        directory file which was created with the conflict markers in it.
753        This is from CVS/Entries.  */
754     char *ts_conflict;
755
756     /* Tag specified on the command line, or if none, tag stored in
757        CVS/Entries.  */
758     char *tag;
759     /* Date specified on the command line, or if none, date stored in
760        CVS/Entries.  */
761     char *date;
762     /* If this is 1, then tag is not a branch tag.  If this is 0, then
763        tag may or may not be a branch tag.  */
764     int nonbranch;
765
766     /* Pointer to entries file node  */
767     Entnode *entdata;
768
769     /* Pointer to parsed src file info */
770     RCSNode *srcfile;
771
772     /* 1 if ts_user is known to be the actual timestamp of a local file */
773     unsigned char ts_user_ists;
774 };
775 typedef struct vers_ts Vers_TS;
776
777 Vers_TS *Version_TS (struct file_info *finfo, char *options, char *tag,
778                             char *date, int force_tag_match,
779                             int set_time);
780 void freevers_ts (Vers_TS ** versp);
781 \f
782 /* Miscellaneous CVS infrastructure which layers on top of the recursion
783    processor (for example, needs struct file_info).  */
784
785 int Checkin (int type, struct file_info *finfo, char *rev,
786              char *tag, char *options, char *message);
787 int No_Difference (struct file_info *finfo, Vers_TS *vers);
788 /* TODO: can the finfo argument to special_file_mismatch be changed? -twp */
789 int special_file_mismatch (struct file_info *finfo,
790                                   char *rev1, char *rev2);
791
792 /* CVSADM_BASEREV stuff, from entries.c.  */
793 char *base_get (struct file_info *);
794 void base_register (struct file_info *, char *);
795 void base_deregister (struct file_info *);
796
797 /*
798  * defines for Classify_File() to determine the current state of a file.
799  * These are also used as types in the data field for the list we make for
800  * Update_Logfile in commit, import, and add.
801  */
802 enum classify_type
803 {
804     T_UNKNOWN = 1,                      /* no old-style analog existed   */
805     T_CONFLICT,                         /* C (conflict) list             */
806     T_NEEDS_MERGE,                      /* G (needs merging) list        */
807     T_MODIFIED,                         /* M (needs checked in) list     */
808     T_CHECKOUT,                         /* O (needs checkout) list       */
809     T_ADDED,                            /* A (added file) list           */
810     T_REMOVED,                          /* R (removed file) list         */
811     T_REMOVE_ENTRY,                     /* W (removed entry) list        */
812     T_UPTODATE,                         /* File is up-to-date            */
813     T_PATCH,                            /* P Like C, but can patch       */
814     T_TITLE                             /* title for node type           */
815 };
816 typedef enum classify_type Ctype;
817
818 Ctype Classify_File (struct file_info *finfo, char *tag, char *date, char *options,
819       int force_tag_match, int aflag, Vers_TS **versp, int pipeout);
820
821 /*
822  * structure used for list nodes passed to Update_Logfile() and
823  * do_editor().
824  */
825 struct logfile_info
826 {
827   enum classify_type type;
828   char *tag;
829   char *rev_old;                /* rev number before a commit/modify,
830                                    NULL for add or import */
831   char *rev_new;                /* rev number after a commit/modify,
832                                    add, or import, NULL for remove */
833 };
834 \f
835 /* Wrappers.  */
836
837 typedef enum { WRAP_MERGE, WRAP_COPY } WrapMergeMethod;
838 typedef enum {
839     /* -t and -f wrapper options.  Treating directories as single files.  */
840     WRAP_TOCVS,
841     WRAP_FROMCVS,
842     /* -k wrapper option.  Default keyword expansion options.  */
843     WRAP_RCSOPTION
844 } WrapMergeHas;
845
846 void  wrap_setup (void);
847 int   wrap_name_has (const char *name,WrapMergeHas has);
848 char *wrap_rcsoption (const char *fileName, int asFlag);
849 char *wrap_tocvs_process_file (const char *fileName);
850 int   wrap_merge_is_copy (const char *fileName);
851 void wrap_fromcvs_process_file (const char *fileName);
852 void wrap_add_file (const char *file,int temp);
853 void wrap_add (char *line,int temp);
854 void wrap_send (void);
855 #if defined(SERVER_SUPPORT) || defined(CLIENT_SUPPORT)
856 void wrap_unparse_rcs_options (char **, int);
857 #endif /* SERVER_SUPPORT || CLIENT_SUPPORT */
858
859 /* Pathname expansion */
860 char *expand_path (const char *name, const char *cvsroot, bool formatsafe,
861                    const char *file, int line);
862
863 /* User variables.  */
864 extern List *variable_list;
865
866 void variable_set (char *nameval);
867
868 int watch (int argc, char **argv);
869 int edit (int argc, char **argv);
870 int unedit (int argc, char **argv);
871 int editors (int argc, char **argv);
872 int watchers (int argc, char **argv);
873 int annotate (int argc, char **argv);
874 int add (int argc, char **argv);
875 int admin (int argc, char **argv);
876 int checkout (int argc, char **argv);
877 int commit (int argc, char **argv);
878 int diff (int argc, char **argv);
879 int history (int argc, char **argv);
880 int import (int argc, char **argv);
881 int cvslog (int argc, char **argv);
882 #ifdef AUTH_CLIENT_SUPPORT
883 /* Some systems (namely Mac OS X) have conflicting definitions for these
884  * functions.  Avoid them.
885  */
886 #ifdef HAVE_LOGIN
887 # define login          cvs_login
888 #endif /* HAVE_LOGIN */
889 #ifdef HAVE_LOGOUT
890 # define logout         cvs_logout
891 #endif /* HAVE_LOGOUT */
892 int login (int argc, char **argv);
893 int logout (int argc, char **argv);
894 #endif /* AUTH_CLIENT_SUPPORT */
895 int patch (int argc, char **argv);
896 int release (int argc, char **argv);
897 int cvsremove (int argc, char **argv);
898 int rtag (int argc, char **argv);
899 int cvsstatus (int argc, char **argv);
900 int cvstag (int argc, char **argv);
901 int version (int argc, char **argv);
902
903 unsigned long int lookup_command_attribute (const char *);
904 \f
905 #if defined(AUTH_CLIENT_SUPPORT) || defined(AUTH_SERVER_SUPPORT)
906 char *scramble (char *str);
907 char *descramble (char *str);
908 #endif /* AUTH_CLIENT_SUPPORT || AUTH_SERVER_SUPPORT */
909
910 #ifdef AUTH_CLIENT_SUPPORT
911 char *get_cvs_password (void);
912 /* get_cvs_port_number() is not pure since the /etc/services file could change
913  * between calls.  */
914 int get_cvs_port_number (const cvsroot_t *root);
915 /* normalize_cvsroot() is not pure since it calls get_cvs_port_number.  */
916 char *normalize_cvsroot (const cvsroot_t *root)
917         __attribute__ ((__malloc__));
918 #endif /* AUTH_CLIENT_SUPPORT */
919
920 void tag_check_valid (const char *, int, char **, int, int, char *, bool);
921
922 #include "server.h"
923
924 /* From server.c and documented there.  */
925 void cvs_output (const char *, size_t);
926 void cvs_output_ex (const char *, size_t, int);
927 void cvs_output_binary (char *, size_t);
928 void cvs_outerr (const char *, size_t);
929 void cvs_flusherr (void);
930 void cvs_flushout (void);
931 void cvs_output_tagged (const char *, const char *);
932 int supported_response (const char *);
933
934 #define CVS_OUTPUT_EX_LOGM      0x80000001
935
936 extern const char *global_session_id;
937
938 /* From find_names.c.  */
939 List *find_files (const char *dir, const char *pat);