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