1128266Speter/*
2175261Sobrien * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
3128266Speter *
4175261Sobrien * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
5175261Sobrien *                                  and others.
6128266Speter *
7128266Speter * You may distribute under the terms of the GNU General Public License as
8128266Speter * specified in the README file that comes with the CVS kit.
9128266Speter *
10128266Speter *
11128266Speter *
12128266Speter * This file contains the interface between the server and the rest of CVS.
13128266Speter */
1417721Speter
1517721Speter/* Miscellaneous stuff which isn't actually particularly server-specific.  */
1617721Speter#ifndef STDIN_FILENO
1717721Speter#define STDIN_FILENO 0
1817721Speter#define STDOUT_FILENO 1
1917721Speter#define STDERR_FILENO 2
2017721Speter#endif
2154427Speter
22128266Speter
2354427Speter/*
24175261Sobrien * Nonzero if we are using the server.  Used by various places to call
25175261Sobrien * server-specific functions.
26175261Sobrien */
27175261Sobrienextern int server_active;
28175261Sobrien
29175261Sobrien/*
3054427Speter * Expand to `S', ` ', or the empty string.  Used in `%s-> ...' trace printfs.
3154427Speter */
3217721Speter#ifdef SERVER_SUPPORT
3354427Speter# define CLIENT_SERVER_STR ((server_active) ? "S" : " ")
3454427Speter#else
3554427Speter# define CLIENT_SERVER_STR ""
3654427Speter#endif
3717721Speter
3854427Speter#ifdef SERVER_SUPPORT
3954427Speter
4017721Speter/* Server functions exported to the rest of CVS.  */
4117721Speter
4217721Speter/* Run the server.  */
4317721Speterextern int server PROTO((int argc, char **argv));
4417721Speter
45128266Speter/* kserver user authentication.  */
46128266Speter# ifdef HAVE_KERBEROS
47128266Speterextern void kserver_authenticate_connection PROTO ((void));
48128266Speter# endif
49128266Speter
50128266Speter/* pserver user authentication.  */
51128266Speter# if defined (AUTH_SERVER_SUPPORT) || defined (HAVE_GSSAPI)
52128266Speterextern void pserver_authenticate_connection PROTO ((void));
53128266Speter# endif
54128266Speter
5525839Speter/* See server.c for description.  */
5625839Speterextern void server_pathname_check PROTO ((char *));
5725839Speter
5817721Speter/* We have a new Entries line for a file.  TAG or DATE can be NULL.  */
5917721Speterextern void server_register
60128266Speter    PROTO((const char *name, const char *version, const char *timestamp,
61128266Speter           const char *options, const char *tag, const char *date,
62128266Speter           const char *conflict));
6317721Speter
6426801Speter/* Set the modification time of the next file sent.  This must be
6526801Speter   followed by a call to server_updated on the same file.  */
6626801Speterextern void server_modtime PROTO ((struct file_info *finfo,
6726801Speter				   Vers_TS *vers_ts));
6826801Speter
6917721Speter/*
7017721Speter * We want to nuke the Entries line for a file, and (unless
7117721Speter * server_scratch_entry_only is subsequently called) the file itself.
7217721Speter */
73128266Speterextern void server_scratch PROTO((const char *name));
7417721Speter
7517721Speter/*
7617721Speter * The file which just had server_scratch called on it needs to have only
7717721Speter * the Entries line removed, not the file itself.
7817721Speter */
7917721Speterextern void server_scratch_entry_only PROTO((void));
8017721Speter
8117721Speter/*
8217721Speter * We just successfully checked in FILE (which is just the bare
8317721Speter * filename, with no directory).  REPOSITORY is the directory for the
8417721Speter * repository.
8517721Speter */
8617721Speterextern void server_checked_in
87128266Speter    PROTO((const char *file, const char *update_dir, const char *repository));
8817721Speter
8917721Speterextern void server_copy_file
90128266Speter    PROTO((const char *file, const char *update_dir, const char *repository,
91128266Speter           const char *newfile));
9217721Speter
9334461Speter/* Send the appropriate responses for a file described by FINFO and
9434461Speter   VERS.  This is called after server_register or server_scratch.  In
9534461Speter   the latter case the file is to be removed (and VERS can be NULL).
9634461Speter   In the former case, VERS must be non-NULL, and UPDATED indicates
9734461Speter   whether the file is now up to date (SERVER_UPDATED, yes,
9834461Speter   SERVER_MERGED, no, SERVER_PATCHED, yes, but file is a diff from
9934461Speter   user version to repository version, SERVER_RCS_DIFF, yes, like
10034461Speter   SERVER_PATCHED but with an RCS style diff).  MODE is the mode the
10134461Speter   file should get, or (mode_t) -1 if this should be obtained from the
10234461Speter   file itself.  CHECKSUM is the MD5 checksum of the file, or NULL if
10334461Speter   this need not be sent.  If FILEBUF is not NULL, it holds the
10434461Speter   contents of the file, in which case the file itself may not exist.
10534461Speter   If FILEBUF is not NULL, server_updated will free it.  */
10625839Speterenum server_updated_arg4
10725839Speter{
10825839Speter    SERVER_UPDATED,
10925839Speter    SERVER_MERGED,
11025839Speter    SERVER_PATCHED,
11125839Speter    SERVER_RCS_DIFF
11225839Speter};
11334461Speter#ifdef __STDC__
11434461Speterstruct buffer;
11534461Speter#endif
11634461Speter
11717721Speterextern void server_updated
11825839Speter    PROTO((struct file_info *finfo, Vers_TS *vers,
11934461Speter	   enum server_updated_arg4 updated, mode_t mode,
12034461Speter	   unsigned char *checksum, struct buffer *filebuf));
12117721Speter
12225839Speter/* Whether we should send RCS format patches.  */
12325839Speterextern int server_use_rcs_diff PROTO((void));
12425839Speter
12517721Speter/* Set the Entries.Static flag.  */
126128266Speterextern void server_set_entstat PROTO((const char *update_dir,
127128266Speter                                      const char *repository));
12817721Speter/* Clear it.  */
129128266Speterextern void server_clear_entstat PROTO((const char *update_dir,
130128266Speter                                        const char *repository));
13117721Speter
13217721Speter/* Set or clear a per-directory sticky tag or date.  */
133128266Speterextern void server_set_sticky PROTO((const char *update_dir,
134128266Speter                                     const char *repository, const char *tag,
135128266Speter                                     const char *date, int nonbranch));
13617721Speter/* Send Template response.  */
137128266Speterextern void server_template PROTO ((const char *, const char *));
13817721Speter
13917721Speterextern void server_update_entries
140128266Speter    PROTO((const char *file, const char *update_dir, const char *repository,
14125839Speter	   enum server_updated_arg4 updated));
14217721Speter
14325839Speter/* Pointer to a malloc'd string which is the directory which
14425839Speter   the server should prepend to the pathnames which it sends
14525839Speter   to the client.  */
14625839Speterextern char *server_dir;
14725839Speter
14817721Speterextern void server_cleanup PROTO((int sig));
14917721Speter
15017721Speter#ifdef SERVER_FLOWCONTROL
15117721Speter/* Pause if it's convenient to avoid memory blowout */
15217721Speterextern void server_pause_check PROTO((void));
15317721Speter#endif /* SERVER_FLOWCONTROL */
15417721Speter
15526801Speter#ifdef AUTH_SERVER_SUPPORT
15626801Speterextern char *CVS_Username;
15732785Speterextern int system_auth;
15826801Speter#endif /* AUTH_SERVER_SUPPORT */
15926801Speter
16017721Speter#endif /* SERVER_SUPPORT */
16117721Speter
16217721Speter/* Stuff shared with the client.  */
16317721Speterstruct request
16417721Speter{
16517721Speter  /* Name of the request.  */
16617721Speter  char *name;
16717721Speter
16817721Speter#ifdef SERVER_SUPPORT
16917721Speter  /*
17017721Speter   * Function to carry out the request.  ARGS is the text of the command
17117721Speter   * after name and, if present, a single space, have been stripped off.
17217721Speter   */
17317721Speter  void (*func) PROTO((char *args));
17417721Speter#endif
17517721Speter
17654427Speter  /* One or more of the RQ_* flags described below.  */
17754427Speter  int flags;
17817721Speter
17954427Speter  /* If set, failure to implement this request can imply a fatal
18054427Speter     error.  This should be set only for commands which were in the
18154427Speter     original version of the protocol; it should not be set for new
18254427Speter     commands.  */
18354427Speter#define RQ_ESSENTIAL 1
18417721Speter
18554427Speter  /* Set by the client if the server we are talking to supports it.  */
18654427Speter#define RQ_SUPPORTED 2
18717721Speter
18854427Speter  /* If set, and client and server both support the request, the
18954427Speter     client should tell the server by making the request.  */
19054427Speter#define RQ_ENABLEME 4
19154427Speter
19254427Speter  /* The server may accept this request before "Root".  */
19354427Speter#define RQ_ROOTLESS 8
19417721Speter};
19517721Speter
19617721Speter/* Table of requests ending with an entry with a NULL name.  */
19717721Speterextern struct request requests[];
19832785Speter
19932785Speter/* Gzip library, see zlib.c.  */
20054427Speterextern int gunzip_and_write PROTO ((int, char *, unsigned char *, size_t));
201128266Speterextern int read_and_gzip PROTO ((int, const char *, unsigned char **, size_t *,
202128266Speter                                 size_t *, int));
203