1 /* $OpenBSD: cvs.h,v 1.172 2008/06/27 21:14:15 xsa 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 <signal.h> 31 32 #include "config.h" 33 #include "file.h" 34 #include "log.h" 35 #include "worklist.h" 36 #include "repository.h" 37 #include "trigger.h" 38 #include "util.h" 39 #include "xmalloc.h" 40 41 #define CVS_VERSION "OpenCVS 4.4" 42 43 #define CVS_HIST_CACHE 128 44 #define CVS_HIST_NBFLD 6 45 46 #define CVS_CKSUM_LEN MD5_DIGEST_STRING_LENGTH 47 48 #define CVS_REV_BUFSZ 32 49 #define CVS_TIME_BUFSZ 64 50 51 #define CVS_DATE_FMT "%Y.%m.%d.%H.%M.%S" 52 53 /* operations */ 54 #define CVS_OP_UNKNOWN 0 55 #define CVS_OP_ADD 1 56 #define CVS_OP_ADMIN 2 57 #define CVS_OP_ANNOTATE 3 58 #define CVS_OP_CHECKOUT 4 59 #define CVS_OP_COMMIT 5 60 #define CVS_OP_DIFF 6 61 #define CVS_OP_EDIT 7 62 #define CVS_OP_EDITORS 8 63 #define CVS_OP_EXPORT 9 64 #define CVS_OP_HISTORY 10 65 #define CVS_OP_IMPORT 11 66 #define CVS_OP_INIT 12 67 #define CVS_OP_LOG 13 68 #define CVS_OP_RANNOTATE 14 69 #define CVS_OP_RDIFF 15 70 #define CVS_OP_RELEASE 16 71 #define CVS_OP_REMOVE 17 72 #define CVS_OP_RLOG 18 73 #define CVS_OP_RTAG 19 74 #define CVS_OP_SERVER 20 75 #define CVS_OP_STATUS 21 76 #define CVS_OP_TAG 22 77 #define CVS_OP_UNEDIT 23 78 #define CVS_OP_UPDATE 24 79 #define CVS_OP_VERSION 25 80 #define CVS_OP_WATCH 26 81 #define CVS_OP_WATCHERS 27 82 83 #define CVS_OP_ANY 64 /* all operations */ 84 85 /* methods */ 86 #define CVS_METHOD_NONE 0 87 #define CVS_METHOD_LOCAL 1 /* local access */ 88 #define CVS_METHOD_SERVER 2 /* tunnel through CVS_RSH */ 89 #define CVS_METHOD_PSERVER 3 /* cvs pserver */ 90 #define CVS_METHOD_KSERVER 4 /* kerberos */ 91 #define CVS_METHOD_GSERVER 5 /* gssapi server */ 92 #define CVS_METHOD_EXT 6 93 #define CVS_METHOD_FORK 7 /* local but fork */ 94 95 #define CVS_CMD_MAXNAMELEN 16 96 #define CVS_CMD_MAXALIAS 2 97 #define CVS_CMD_MAXDESCRLEN 64 98 99 /* flags */ 100 #define CVS_USE_WDIR 0x01 101 #define CVS_LOCK_REPO 0x02 102 103 /* defaults */ 104 #define CVS_SERVER_DEFAULT "cvs" 105 #define CVS_RSH_DEFAULT "ssh" 106 #define CVS_EDITOR_DEFAULT "vi" 107 #define CVS_TMPDIR_DEFAULT "/tmp" 108 #define CVS_UMASK_DEFAULT 002 109 110 /* extensions */ 111 #define CVS_DESCR_FILE_EXT ",t" 112 113 /* server-side paths */ 114 #define CVS_PATH_DEVNULL "/dev/null" 115 #define CVS_PATH_ROOT "CVSROOT" 116 #define CVS_PATH_EMPTYDIR CVS_PATH_ROOT "/Emptydir" 117 #define CVS_PATH_CHECKOUTLIST CVS_PATH_ROOT "/checkoutlist" 118 #define CVS_PATH_COMMITINFO CVS_PATH_ROOT "/commitinfo" 119 #define CVS_PATH_CONFIG CVS_PATH_ROOT "/config" 120 #define CVS_PATH_CVSIGNORE CVS_PATH_ROOT "/cvsignore" 121 #define CVS_PATH_CVSWRAPPERS CVS_PATH_ROOT "/cvswrappers" 122 #define CVS_PATH_EDITINFO CVS_PATH_ROOT "/editinfo" 123 #define CVS_PATH_HISTORY CVS_PATH_ROOT "/history" 124 #define CVS_PATH_LOGINFO CVS_PATH_ROOT "/loginfo" 125 #define CVS_PATH_MODULES CVS_PATH_ROOT "/modules" 126 #define CVS_PATH_NOTIFY_R CVS_PATH_ROOT "/notify" 127 #define CVS_PATH_RCSINFO CVS_PATH_ROOT "/rcsinfo" 128 #define CVS_PATH_TAGINFO CVS_PATH_ROOT "/taginfo" 129 #define CVS_PATH_VALTAGS CVS_PATH_ROOT "/val-tags" 130 #define CVS_PATH_VERIFYMSG CVS_PATH_ROOT "/verifymsg" 131 132 /* client-side paths */ 133 #define CVS_PATH_RC ".cvsrc" 134 #define CVS_PATH_CVSDIR "CVS" 135 #define CVS_PATH_BASEDIR CVS_PATH_CVSDIR "/Base" 136 #define CVS_PATH_BASEREV CVS_PATH_CVSDIR "/Baserev" 137 #define CVS_PATH_BASEREVTMP CVS_PATH_CVSDIR "/Baserev.tmp" 138 #define CVS_PATH_CHECKINPROG CVS_PATH_CVSDIR "/Checkin.prog" 139 #define CVS_PATH_ENTRIES CVS_PATH_CVSDIR "/Entries" 140 #define CVS_PATH_STATICENTRIES CVS_PATH_CVSDIR "/Entries.Static" 141 #define CVS_PATH_LOGENTRIES CVS_PATH_CVSDIR "/Entries.Log" 142 #define CVS_PATH_BACKUPENTRIES CVS_PATH_CVSDIR "/Entries.Backup" 143 #define CVS_PATH_NOTIFY CVS_PATH_CVSDIR "/Notify" 144 #define CVS_PATH_NOTIFYTMP CVS_PATH_CVSDIR "/Notify.tmp" 145 #define CVS_PATH_ROOTSPEC CVS_PATH_CVSDIR "/Root" 146 #define CVS_PATH_REPOSITORY CVS_PATH_CVSDIR "/Repository" 147 #define CVS_PATH_TAG CVS_PATH_CVSDIR "/Tag" 148 #define CVS_PATH_TEMPLATE CVS_PATH_CVSDIR "/Template" 149 #define CVS_PATH_UPDATEPROG CVS_PATH_CVSDIR "/Update.prog" 150 #define CVS_PATH_ATTIC "Attic" 151 152 /* history stuff */ 153 #define CVS_HISTORY_TAG 0 154 #define CVS_HISTORY_CHECKOUT 1 155 #define CVS_HISTORY_EXPORT 2 156 #define CVS_HISTORY_RELEASE 3 157 #define CVS_HISTORY_UPDATE_REMOVE 4 158 #define CVS_HISTORY_UPDATE_CO 5 159 #define CVS_HISTORY_UPDATE_MERGED 6 160 #define CVS_HISTORY_UPDATE_MERGED_ERR 7 161 #define CVS_HISTORY_COMMIT_MODIFIED 8 162 #define CVS_HISTORY_COMMIT_ADDED 9 163 #define CVS_HISTORY_COMMIT_REMOVED 10 164 165 void cvs_history_add(int, struct cvs_file *, const char *); 166 167 struct cvs_cmd { 168 u_int cmd_op; 169 u_int cmd_flags; 170 char cmd_name[CVS_CMD_MAXNAMELEN]; 171 char cmd_alias[CVS_CMD_MAXALIAS][CVS_CMD_MAXNAMELEN]; 172 char cmd_descr[CVS_CMD_MAXDESCRLEN]; 173 char *cmd_synopsis; 174 char *cmd_opts; 175 char *cmd_defargs; 176 177 int (*cmd)(int, char **); 178 }; 179 180 struct cvsroot; 181 182 struct cvs_recursion { 183 void (*enterdir)(struct cvs_file *); 184 void (*leavedir)(struct cvs_file *); 185 void (*fileproc)(struct cvs_file *); 186 int flags; 187 }; 188 189 #define CR_RECURSE_DIRS 0x01 190 #define CR_ATTIC 0x02 191 #define CR_REPO 0x04 192 193 struct cvs_var { 194 char *cv_name; 195 char *cv_val; 196 TAILQ_ENTRY(cvs_var) cv_link; 197 }; 198 199 TAILQ_HEAD(, cvs_var) cvs_variables; 200 201 #define CVS_ROOT_CONNECTED 0x01 202 203 struct cvsroot { 204 char *cr_str; 205 u_int cr_method; 206 char *cr_buf; 207 char *cr_user; 208 char *cr_pass; 209 char *cr_host; 210 char *cr_dir; 211 u_int cr_port; 212 213 /* connection data */ 214 u_int cr_flags; 215 FILE *cr_srvin; 216 FILE *cr_srvout; 217 FILE *cr_srverr; 218 char *cr_version; /* version of remote server */ 219 u_char cr_vrmask[16]; /* mask of valid requests supported by server */ 220 221 TAILQ_ENTRY(cvsroot) root_cache; 222 }; 223 224 #define CVS_SETVR(rt, rq) ((rt)->cr_vrmask[(rq) / 8] |= (1 << ((rq) % 8))) 225 #define CVS_GETVR(rt, rq) ((rt)->cr_vrmask[(rq) / 8] & (1 << ((rq) % 8))) 226 #define CVS_CLRVR(rt, rq) ((rt)->cr_vrmask[(rq) / 8] &= ~(1 << ((rq) % 8))) 227 #define CVS_RSTVR(rt) memset((rt)->cr_vrmask, 0, sizeof((rt)->cr_vrmask)) 228 229 #define CVS_HIST_ADDED 'A' 230 #define CVS_HIST_EXPORT 'E' 231 #define CVS_HIST_RELEASE 'F' 232 #define CVS_HIST_MODIFIED 'M' 233 #define CVS_HIST_CHECKOUT 'O' 234 #define CVS_HIST_COMMIT 'R' 235 #define CVS_HIST_TAG 'T' 236 237 #define CVS_DATE_DUMMY "dummy timestamp" 238 #define CVS_DATE_DMSEC (time_t)-1 239 240 #define CVS_ENT_NONE 0 241 #define CVS_ENT_FILE 1 242 #define CVS_ENT_DIR 2 243 244 #define CVS_ENT_REG 0 245 #define CVS_ENT_ADDED 1 246 #define CVS_ENT_REMOVED 2 247 #define CVS_ENT_UPTODATE 3 248 249 #define CVS_ENT_MAXLINELEN 1024 250 251 #define ENT_NOSYNC 0 252 #define ENT_SYNC 1 253 254 #define STRIP_SLASH(p) \ 255 do { \ 256 size_t _slen; \ 257 _slen = strlen(p); \ 258 while ((_slen > 0) && (p[_slen - 1] == '/')) \ 259 p[--_slen] = '\0'; \ 260 } while (0) 261 262 struct cvs_ent { 263 char *ce_buf; 264 char *ce_conflict; 265 char *ce_name; 266 char *ce_opts; 267 char *ce_tag; 268 time_t ce_date; 269 time_t ce_mtime; 270 u_int16_t ce_type; 271 u_int16_t ce_status; 272 RCSNUM *ce_rev; 273 }; 274 275 struct cvs_ent_line { 276 char *buf; 277 TAILQ_ENTRY(cvs_ent_line) entries_list; 278 }; 279 280 typedef struct cvs_entries { 281 char *cef_path; 282 char *cef_bpath; 283 char *cef_lpath; 284 285 TAILQ_HEAD(, cvs_ent_line) cef_ent; 286 } CVSENTRIES; 287 288 extern char *checkout_target_dir; 289 extern char *cvs_join_rev1; 290 extern char *cvs_join_rev2; 291 292 extern struct module_checkout *current_module; 293 extern char *module_repo_root; 294 295 extern struct ignore_head checkout_ign_pats; 296 extern struct cvs_wklhead temp_files; 297 extern volatile sig_atomic_t sig_received; 298 extern volatile sig_atomic_t cvs_quit; 299 extern struct cvsroot *current_cvsroot; 300 extern char *cvs_tagname; 301 extern char *cvs_editor; 302 extern char *cvs_homedir; 303 extern char *cvs_msg; 304 extern char *cvs_rsh; 305 extern char *cvs_tmpdir; 306 extern char *import_repository; 307 extern char *cvs_server_path; 308 extern time_t cvs_specified_date; 309 extern time_t cvs_directory_date; 310 extern char *cvs_specified_tag; 311 extern char *cvs_directory_tag; 312 313 extern int cvs_umask; 314 extern int verbosity; 315 extern int cvs_trace; 316 extern int cvs_nolog; 317 extern int cvs_compress; 318 extern int cvs_cmdop; 319 extern int cvs_nocase; 320 extern int cvs_noexec; 321 extern int cvs_readonly; 322 extern int cvs_readonlyfs; 323 extern int cvs_server_active; 324 extern int reset_option; 325 extern int reset_tag; 326 extern int kflag; 327 328 extern struct cvs_cmd *cmdp; 329 extern struct cvs_cmd *cvs_cdt[]; 330 331 extern struct cvs_cmd cvs_cmd_add; 332 extern struct cvs_cmd cvs_cmd_admin; 333 extern struct cvs_cmd cvs_cmd_annotate; 334 extern struct cvs_cmd cvs_cmd_checkout; 335 extern struct cvs_cmd cvs_cmd_commit; 336 extern struct cvs_cmd cvs_cmd_diff; 337 extern struct cvs_cmd cvs_cmd_edit; 338 extern struct cvs_cmd cvs_cmd_editors; 339 extern struct cvs_cmd cvs_cmd_export; 340 extern struct cvs_cmd cvs_cmd_history; 341 extern struct cvs_cmd cvs_cmd_import; 342 extern struct cvs_cmd cvs_cmd_init; 343 extern struct cvs_cmd cvs_cmd_log; 344 extern struct cvs_cmd cvs_cmd_rannotate; 345 extern struct cvs_cmd cvs_cmd_rdiff; 346 extern struct cvs_cmd cvs_cmd_release; 347 extern struct cvs_cmd cvs_cmd_remove; 348 extern struct cvs_cmd cvs_cmd_rlog; 349 extern struct cvs_cmd cvs_cmd_rtag; 350 extern struct cvs_cmd cvs_cmd_status; 351 extern struct cvs_cmd cvs_cmd_tag; 352 extern struct cvs_cmd cvs_cmd_update; 353 extern struct cvs_cmd cvs_cmd_version; 354 extern struct cvs_cmd cvs_cmd_server; 355 extern struct cvs_cmd cvs_cmd_unedit; 356 extern struct cvs_cmd cvs_cmd_watch; 357 extern struct cvs_cmd cvs_cmd_watchers; 358 359 /* add.c */ 360 void cvs_add_tobranch(struct cvs_file *, char *); 361 362 /* cmd.c */ 363 struct cvs_cmd *cvs_findcmd(const char *); 364 365 /* cvs.c */ 366 int cvs_build_cmd(char ***, char **, int); 367 int cvs_var_set(const char *, const char *); 368 int cvs_var_unset(const char *); 369 const char *cvs_var_get(const char *); 370 void cvs_cleanup(void); 371 372 /* date.y */ 373 time_t cvs_date_parse(const char *); 374 375 /* entries.c */ 376 struct cvs_ent *cvs_ent_parse(const char *); 377 struct cvs_ent *cvs_ent_get(CVSENTRIES *, const char *); 378 CVSENTRIES *cvs_ent_open(const char *); 379 void cvs_ent_add(CVSENTRIES *, const char *); 380 void cvs_ent_remove(CVSENTRIES *, const char *); 381 void cvs_ent_close(CVSENTRIES *, int); 382 void cvs_ent_free(struct cvs_ent *); 383 void cvs_ent_line_str(const char *, char *, char *, char *, char *, 384 int, int, char *, size_t); 385 void cvs_parse_tagfile(char *, char **, char **, int *); 386 void cvs_write_tagfile(const char *, char *, char *); 387 388 /* root.c */ 389 struct cvsroot *cvsroot_get(const char *); 390 391 /* logmsg.c */ 392 char *cvs_logmsg_read(const char *); 393 char *cvs_logmsg_create(char *, struct cvs_flisthead *, 394 struct cvs_flisthead *, struct cvs_flisthead *); 395 int cvs_logmsg_verify(char *); 396 397 /* misc stuff */ 398 void cvs_update_local(struct cvs_file *); 399 void cvs_update_enterdir(struct cvs_file *); 400 void cvs_update_leavedir(struct cvs_file *); 401 void cvs_checkout_file(struct cvs_file *, RCSNUM *, char *, int); 402 void cvs_remove_local(struct cvs_file *); 403 void cvs_add_local(struct cvs_file *); 404 int update_has_conflict_markers(struct cvs_file *); 405 406 #define CO_MERGE 0x01 407 #define CO_SETSTICKY 0x02 408 #define CO_DUMP 0x04 409 #define CO_COMMIT 0x08 410 #define CO_REMOVE 0x10 411 412 /* commands */ 413 int cvs_add(int, char **); 414 int cvs_admin(int, char **); 415 int cvs_annotate(int, char **); 416 int cvs_checkout(int, char **); 417 int cvs_commit(int, char **); 418 int cvs_diff(int, char **); 419 int cvs_edit(int, char **); 420 int cvs_editors(int, char **); 421 int cvs_export(int, char **); 422 int cvs_getlog(int, char **); 423 int cvs_history(int, char **); 424 int cvs_import(int, char **); 425 int cvs_init(int, char **); 426 int cvs_release(int, char **); 427 int cvs_remove(int, char **); 428 int cvs_status(int, char **); 429 int cvs_tag(int, char **); 430 int cvs_unedit(int, char **); 431 int cvs_update(int, char **); 432 int cvs_version(int, char **); 433 int cvs_watch(int, char **); 434 int cvs_watchers(int, char **); 435 436 437 #endif 438