1 /* $OpenBSD: cvs.h,v 1.29 2004/08/27 15:40:44 jfb Exp $ */ 2 /* 3 * Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org> 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. The name of the author may not be used to endorse or promote products 13 * derived from this software without specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 16 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 17 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 18 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 24 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef CVS_H 28 #define CVS_H 29 30 #include <sys/param.h> 31 #include <stdio.h> 32 #include <dirent.h> 33 34 #include "rcs.h" 35 #include "file.h" 36 37 #define CVS_VERSION_MAJOR 0 38 #define CVS_VERSION_MINOR 2 39 #define CVS_VERSION "OpenCVS 0.2" 40 41 42 #define CVS_HIST_CACHE 128 43 #define CVS_HIST_NBFLD 6 44 45 46 #define CVS_CKSUM_LEN 33 /* length of a CVS checksum string */ 47 48 49 /* operations */ 50 #define CVS_OP_UNKNOWN 0 51 #define CVS_OP_ADD 1 52 #define CVS_OP_ANNOTATE 2 53 #define CVS_OP_CHECKOUT 3 54 #define CVS_OP_COMMIT 4 55 #define CVS_OP_DIFF 5 56 #define CVS_OP_HISTORY 6 57 #define CVS_OP_IMPORT 7 58 #define CVS_OP_INIT 8 59 #define CVS_OP_LOG 9 60 #define CVS_OP_REMOVE 10 61 #define CVS_OP_SERVER 11 62 #define CVS_OP_STATUS 12 63 #define CVS_OP_TAG 13 64 #define CVS_OP_UPDATE 14 65 #define CVS_OP_VERSION 15 66 67 #define CVS_OP_ANY 64 /* all operations */ 68 69 70 71 /* methods */ 72 #define CVS_METHOD_NONE 0 73 #define CVS_METHOD_LOCAL 1 /* local access */ 74 #define CVS_METHOD_SERVER 2 /* tunnel through CVS_RSH */ 75 #define CVS_METHOD_PSERVER 3 /* cvs pserver */ 76 #define CVS_METHOD_KSERVER 4 /* kerberos */ 77 #define CVS_METHOD_GSERVER 5 /* gssapi server */ 78 #define CVS_METHOD_EXT 6 79 #define CVS_METHOD_FORK 7 /* local but fork */ 80 81 #define CVS_CMD_MAXNAMELEN 16 82 #define CVS_CMD_MAXALIAS 2 83 #define CVS_CMD_MAXDESCRLEN 64 84 85 86 /* defaults */ 87 #define CVS_SERVER_DEFAULT "cvs" 88 #define CVS_RSH_DEFAULT "ssh" 89 #define CVS_EDITOR_DEFAULT "vi" 90 91 92 /* server-side paths */ 93 #define CVS_PATH_ROOT "CVSROOT" 94 #define CVS_PATH_COMMITINFO CVS_PATH_ROOT "/commitinfo" 95 #define CVS_PATH_CONFIG CVS_PATH_ROOT "/config" 96 #define CVS_PATH_CVSIGNORE CVS_PATH_ROOT "/cvsignore" 97 #define CVS_PATH_CVSWRAPPERS CVS_PATH_ROOT "/cvswrappers" 98 #define CVS_PATH_EDITINFO CVS_PATH_ROOT "/editinfo" 99 #define CVS_PATH_HISTORY CVS_PATH_ROOT "/history" 100 #define CVS_PATH_LOGINFO CVS_PATH_ROOT "/loginfo" 101 #define CVS_PATH_MODULES CVS_PATH_ROOT "/modules" 102 #define CVS_PATH_NOTIFY CVS_PATH_ROOT "/notify" 103 #define CVS_PATH_RCSINFO CVS_PATH_ROOT "/rcsinfo" 104 #define CVS_PATH_TAGINFO CVS_PATH_ROOT "/taginfo" 105 #define CVS_PATH_VERIFYMSG CVS_PATH_ROOT "/verifymsg" 106 107 108 /* client-side paths */ 109 #define CVS_PATH_RC ".cvsrc" 110 #define CVS_PATH_CVSDIR "CVS" 111 #define CVS_PATH_ENTRIES CVS_PATH_CVSDIR "/Entries" 112 #define CVS_PATH_STATICENTRIES CVS_PATH_CVSDIR "/Entries.Static" 113 #define CVS_PATH_LOGENTRIES CVS_PATH_CVSDIR "/Entries.Log" 114 #define CVS_PATH_ROOTSPEC CVS_PATH_CVSDIR "/Root" 115 #define CVS_PATH_REPOSITORY CVS_PATH_CVSDIR "/Repository" 116 117 118 struct cvs_file; 119 struct cvs_dir; 120 struct cvs_flist; 121 122 struct cvs_op { 123 u_int co_op; 124 uid_t co_uid; /* user performing the operation */ 125 char *co_tag; /* tag or branch, NULL if HEAD */ 126 char *co_msg; /* message string (on commit or add) */ 127 struct cvs_flist co_files; 128 }; 129 130 131 132 struct cvsroot { 133 char *cr_str; 134 u_int cr_method; 135 char *cr_buf; 136 char *cr_user; 137 char *cr_pass; 138 char *cr_host; 139 char *cr_dir; 140 u_int cr_port; 141 u_int cr_ref; 142 143 /* connection data */ 144 FILE *cr_srvin; 145 FILE *cr_srvout; 146 FILE *cr_srverr; 147 char *cr_version; /* version of remote server */ 148 u_char cr_vrmask[16]; /* mask of valid requests supported by server */ 149 }; 150 151 #define CVS_SETVR(rt, rq) ((rt)->cr_vrmask[(rq) / 8] |= (1 << ((rq) % 8))) 152 #define CVS_GETVR(rt, rq) ((rt)->cr_vrmask[(rq) / 8] & (1 << ((rq) % 8))) 153 #define CVS_CLRVR(rt, rq) ((rt)->cr_vrmask[(rq) / 8] &= ~(1 << ((rq) % 8))) 154 #define CVS_RSTVR(rt) memset((rt)->cr_vrmask, 0, sizeof((rt)->cr_vrmask)) 155 156 157 #define CVS_HIST_ADDED 'A' 158 #define CVS_HIST_EXPORT 'E' 159 #define CVS_HIST_RELEASE 'F' 160 #define CVS_HIST_MODIFIED 'M' 161 #define CVS_HIST_CHECKOUT 'O' 162 #define CVS_HIST_COMMIT 'R' 163 #define CVS_HIST_TAG 'T' 164 165 166 #define CVS_DATE_DUMMY "dummy timestamp" 167 #define CVS_DATE_DMSEC (time_t)-1 168 169 #define CVS_ENT_NONE 0 170 #define CVS_ENT_FILE 1 171 #define CVS_ENT_DIR 2 172 173 174 #define CVS_ENTF_SYNC 0x01 /* contents of disk and memory match */ 175 #define CVS_ENTF_WR 0x02 /* file is opened for writing too */ 176 177 178 struct cvs_ent { 179 char *ce_line; 180 char *ce_buf; 181 u_int ce_type; 182 char *ce_name; 183 RCSNUM *ce_rev; 184 time_t ce_mtime; 185 char *ce_opts; 186 char *ce_tag; 187 TAILQ_ENTRY(cvs_ent) ce_list; 188 }; 189 190 typedef struct cvs_entries { 191 char *cef_path; 192 FILE *cef_file; 193 u_int cef_flags; 194 195 TAILQ_HEAD(, cvs_ent) cef_ent; 196 struct cvs_ent *cef_cur; 197 } CVSENTRIES; 198 199 200 201 struct cvs_hent { 202 char ch_event; 203 time_t ch_date; 204 uid_t ch_uid; 205 char *ch_user; 206 char *ch_curdir; 207 char *ch_repo; 208 RCSNUM *ch_rev; 209 char *ch_arg; 210 }; 211 212 213 typedef struct cvs_histfile { 214 int chf_fd; 215 char *chf_buf; /* read buffer */ 216 size_t chf_blen; /* buffer size */ 217 size_t chf_bused; /* bytes used in buffer */ 218 219 off_t chf_off; /* next read */ 220 u_int chf_sindex; /* history entry index of first in array */ 221 u_int chf_cindex; /* current index (for getnext()) */ 222 u_int chf_nbhent; /* number of valid entries in the array */ 223 224 struct cvs_hent chf_hent[CVS_HIST_CACHE]; 225 226 } CVSHIST; 227 228 229 #ifdef CVS 230 extern char *cvs_command; 231 extern char *cvs_editor; 232 233 extern int cvs_cmdop; 234 extern int cvs_nocase; 235 236 extern CVSFILE *cvs_files; 237 238 #endif 239 240 241 242 /* client command handlers */ 243 int cvs_add (int, char **); 244 int cvs_checkout (int, char **); 245 int cvs_commit (int, char **); 246 int cvs_diff (int, char **); 247 int cvs_getlog (int, char **); 248 int cvs_history (int, char **); 249 int cvs_init (int, char **); 250 int cvs_server (int, char **); 251 int cvs_status (int, char **); 252 int cvs_update (int, char **); 253 int cvs_version (int, char **); 254 255 256 /* from root.c */ 257 struct cvsroot* cvsroot_parse (const char *); 258 void cvsroot_free (struct cvsroot *); 259 struct cvsroot* cvsroot_get (const char *); 260 261 262 /* Entries API */ 263 CVSENTRIES* cvs_ent_open (const char *, int); 264 struct cvs_ent* cvs_ent_get (CVSENTRIES *, const char *); 265 struct cvs_ent* cvs_ent_next (CVSENTRIES *); 266 int cvs_ent_add (CVSENTRIES *, struct cvs_ent *); 267 int cvs_ent_addln (CVSENTRIES *, const char *); 268 int cvs_ent_remove (CVSENTRIES *, const char *); 269 int cvs_ent_write (CVSENTRIES *); 270 struct cvs_ent* cvs_ent_parse (const char *); 271 void cvs_ent_close (CVSENTRIES *); 272 void cvs_ent_free (struct cvs_ent *); 273 struct cvs_ent* cvs_ent_getent (const char *); 274 275 /* history API */ 276 CVSHIST* cvs_hist_open (const char *); 277 void cvs_hist_close (CVSHIST *); 278 int cvs_hist_parse (CVSHIST *); 279 struct cvs_hent* cvs_hist_getnext (CVSHIST *); 280 int cvs_hist_append (CVSHIST *, struct cvs_hent *); 281 282 283 /* from util.c */ 284 285 #define CVS_DATE_CTIME 0 286 #define CVS_DATE_RFC822 1 287 288 int cvs_readrepo (const char *, char *, size_t); 289 time_t cvs_datesec (const char *, int, int); 290 int cvs_modetostr (mode_t, char *, size_t); 291 int cvs_strtomode (const char *, mode_t *); 292 int cvs_splitpath (const char *, char *, size_t, char **); 293 int cvs_mkadmin (struct cvs_file *, mode_t); 294 int cvs_cksum (const char *, char *, size_t); 295 int cvs_exec (int, char **, int []); 296 int cvs_getargv (const char *, char **, int); 297 void cvs_freeargv (char **, int); 298 299 300 #endif /* CVS_H */ 301