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