sync from MirBSD
[alioth/cvs.git] / src / server.h
1 /* $MirOS: src/gnu/usr.bin/cvs/src/server.h,v 1.2 2017/11/18 23:04:57 tg Exp $ */
2
3 /*
4  * Copyright (C) 1986-2005 The Free Software Foundation, Inc.
5  *
6  * Portions Copyright (C) 1998-2005 Derek Price, Ximbiot <http://ximbiot.com>,
7  *                                  and others.
8  *
9  * You may distribute under the terms of the GNU General Public License as
10  * specified in the README file that comes with the CVS kit.
11  *
12  *
13  *
14  * This file contains the interface between the server and the rest of CVS.
15  */
16
17 /* Miscellaneous stuff which isn't actually particularly server-specific.  */
18 #ifndef STDIN_FILENO
19 #define STDIN_FILENO 0
20 #define STDOUT_FILENO 1
21 #define STDERR_FILENO 2
22 #endif
23
24
25 /*
26  * Nonzero if we are using the server.  Used by various places to call
27  * server-specific functions.
28  */
29 extern int server_active;
30
31 /*
32  * Expand to `S', ` ', or the empty string.  Used in `%s-> ...' trace printfs.
33  */
34 #ifdef SERVER_SUPPORT
35 # define CLIENT_SERVER_STR ((server_active) ? "S" : " ")
36 #else
37 # define CLIENT_SERVER_STR ""
38 #endif
39
40 #ifdef SERVER_SUPPORT
41
42 /* Server functions exported to the rest of CVS.  */
43
44 /* pre-parse the server options.  */
45 void parseServerOptions (int argc, char **argv);
46
47 /* Run the server.  */
48 int server (int argc, char **argv);
49
50 /* kserver user authentication.  */
51 # ifdef HAVE_KERBEROS
52 void kserver_authenticate_connection (void);
53 # endif
54
55 /* pserver user authentication.  */
56 # if defined (AUTH_SERVER_SUPPORT) || defined (HAVE_GSSAPI)
57 void pserver_authenticate_connection (void);
58 # endif
59
60 /* See server.c for description.  */
61 void server_pathname_check (char *);
62
63 /* We have a new Entries line for a file.  TAG or DATE can be NULL.  */
64 void server_register (const char *name, const char *version,
65                       const char *timestamp, const char *options,
66                       const char *tag, const char *date, const char *conflict);
67
68 /* Set the modification time of the next file sent.  This must be
69    followed by a call to server_updated on the same file.  */
70 void server_modtime (struct file_info *finfo, Vers_TS *vers_ts);
71
72 /*
73  * We want to nuke the Entries line for a file, and (unless
74  * server_scratch_entry_only is subsequently called) the file itself.
75  */
76 void server_scratch (const char *name);
77
78 /*
79  * The file which just had server_scratch called on it needs to have only
80  * the Entries line removed, not the file itself.
81  */
82 void server_scratch_entry_only (void);
83
84 /*
85  * We just successfully checked in FILE (which is just the bare
86  * filename, with no directory).  REPOSITORY is the directory for the
87  * repository.
88  */
89 void server_checked_in (const char *file, const char *update_dir,
90                         const char *repository);
91
92 void server_copy_file (const char *file, const char *update_dir,
93                        const char *repository, const char *newfile);
94
95 /* Send the appropriate responses for a file described by FINFO and
96    VERS.  This is called after server_register or server_scratch.  In
97    the latter case the file is to be removed (and VERS can be NULL).
98    In the former case, VERS must be non-NULL, and UPDATED indicates
99    whether the file is now up to date (SERVER_UPDATED, yes,
100    SERVER_MERGED, no, SERVER_PATCHED, yes, but file is a diff from
101    user version to repository version, SERVER_RCS_DIFF, yes, like
102    SERVER_PATCHED but with an RCS style diff).  MODE is the mode the
103    file should get, or (mode_t) -1 if this should be obtained from the
104    file itself.  CHECKSUM is the MD5 checksum of the file, or NULL if
105    this need not be sent.  If FILEBUF is not NULL, it holds the
106    contents of the file, in which case the file itself may not exist.
107    If FILEBUF is not NULL, server_updated will free it.  */
108 enum server_updated_arg4
109 {
110     SERVER_UPDATED,
111     SERVER_MERGED,
112     SERVER_PATCHED,
113     SERVER_RCS_DIFF
114 };
115
116 struct buffer;
117
118 void server_updated (struct file_info *finfo, Vers_TS *vers,
119                      enum server_updated_arg4 updated, mode_t mode,
120                      unsigned char *checksum, struct buffer *filebuf);
121
122 /* Whether we should send RCS format patches.  */
123 int server_use_rcs_diff (void);
124
125 /* Set the Entries.Static flag.  */
126 void server_set_entstat (const char *update_dir, const char *repository);
127 /* Clear it.  */
128 void server_clear_entstat (const char *update_dir, const char *repository);
129
130 /* Set or clear a per-directory sticky tag or date.  */
131 void server_set_sticky (const char *update_dir, const char *repository,
132                         const char *tag, const char *date, int nonbranch);
133
134 /* Send Clear-template response.  */
135 void server_clear_template (const char *update_dir, const char *repository);
136
137 /* Send Template response.  */
138 void server_template (const char *update_dir, const char *repository);
139
140 void server_update_entries (const char *file, const char *update_dir,
141                             const char *repository,
142                             enum server_updated_arg4 updated);
143
144 /* Pointer to a malloc'd string which is the directory which
145    the server should prepend to the pathnames which it sends
146    to the client.  */
147 extern char *server_dir;
148
149 void server_cleanup (void);
150
151 #ifdef SERVER_FLOWCONTROL
152 /* Pause if it's convenient to avoid memory blowout */
153 void server_pause_check (void);
154 #endif /* SERVER_FLOWCONTROL */
155
156 #ifdef AUTH_SERVER_SUPPORT
157 extern char *CVS_Username;
158 #endif /* AUTH_SERVER_SUPPORT */
159
160 #endif /* SERVER_SUPPORT */
161 \f
162 /* Stuff shared with the client.  */
163 struct request
164 {
165   /* Name of the request.  */
166   const char *name;
167
168 #ifdef SERVER_SUPPORT
169   /*
170    * Function to carry out the request.  ARGS is the text of the command
171    * after name and, if present, a single space, have been stripped off.
172    */
173   void (*func) (char *args);
174 #endif
175
176   /* One or more of the RQ_* flags described below.  */
177   int flags;
178
179   /* If set, failure to implement this request can imply a fatal
180      error.  This should be set only for commands which were in the
181      original version of the protocol; it should not be set for new
182      commands.  */
183 #define RQ_ESSENTIAL 1
184
185   /* Set by the client if the server we are talking to supports it.  */
186 #define RQ_SUPPORTED 2
187
188   /* If set, and client and server both support the request, the
189      client should tell the server by making the request.  */
190 #define RQ_ENABLEME 4
191
192   /* The server may accept this request before "Root".  */
193 #define RQ_ROOTLESS 8
194 };
195
196 /* Table of requests ending with an entry with a NULL name.  */
197 extern struct request requests[];
198
199 /* Gzip library, see zlib.c.  */
200 int gunzip_and_write (int, const char *, unsigned char *, size_t);
201 int read_and_gzip (int, const char *, unsigned char **, size_t *, size_t *,
202                    int);
203 void server_edit_file (struct file_info *finfo);
204
205 /* The TRACE macro */
206 void cvs_trace (int level, const char *fmt, ...)
207   __attribute__ ((__format__ (__printf__, 2, 3)));
208 #define TRACE cvs_trace
209 /* Trace levels:
210  *
211  * TRACE_FUNCTION       Trace function calls, often including function
212  *                      arguments.  This is the trace level that, historically,
213  *                      applied to all trace calls.
214  * TRACE_FLOW           Include the flow control functions, such as
215  *                      start_recursion, do_recursion, and walklist in the
216  *                      function traces.
217  * TRACE_DATA           Trace important internal function data.
218  */ 
219 #define TRACE_FUNCTION          1
220 #define TRACE_FLOW              2
221 #define TRACE_DATA              3
222
223 extern cvsroot_t *referrer;