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