1 /* $OpenBSD: watch.c,v 1.22 2011/12/27 13:59:01 nicm Exp $ */ 2 /* 3 * Copyright (c) 2005-2007 Xavier Santolaria <xsa@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <string.h> 19 #include <unistd.h> 20 21 #include "cvs.h" 22 #include "remote.h" 23 24 #define W_COMMIT 0x01 25 #define W_EDIT 0x02 26 #define W_UNEDIT 0x04 27 #define W_ADD 0x08 28 #define W_REMOVE 0x10 29 #define W_ON 0x20 30 #define W_OFF 0x40 31 #define W_ALL (W_EDIT|W_COMMIT|W_UNEDIT) 32 33 static void cvs_watch_local(struct cvs_file *); 34 static void cvs_watchers_local(struct cvs_file *); 35 36 struct cvs_cmd cvs_cmd_watch = { 37 CVS_OP_WATCH, CVS_USE_WDIR, "watch", 38 { { 0 }, { 0 } }, 39 "Set watches", 40 "on | off | add | remove [-lR] [-a action] [file ...]", 41 "a:lR", 42 NULL, 43 cvs_watch 44 }; 45 46 struct cvs_cmd cvs_cmd_watchers = { 47 CVS_OP_WATCHERS, CVS_USE_WDIR, "watchers", 48 { { 0 }, { 0 } }, 49 "See who is watching a file", 50 "[-lR] [file ...]", 51 "lR", 52 NULL, 53 cvs_watchers 54 }; 55 56 int 57 cvs_watch(int argc, char **argv) 58 { 59 int ch, flags; 60 struct cvs_recursion cr; 61 int watch_req = 0; 62 int watch_aflags = 0; 63 64 if (argc < 2) 65 fatal("%s", cvs_cmd_watch.cmd_synopsis); 66 67 if (strcmp(argv[1], "on") == 0) 68 watch_req |= W_ON; 69 else if (strcmp(argv[1], "off") == 0) 70 watch_req |= W_OFF; 71 else if (strcmp(argv[1], "add") == 0) 72 watch_req |= W_ADD; 73 else if (strcmp(argv[1], "remove") == 0) 74 watch_req |= W_REMOVE; 75 else 76 fatal("%s", cvs_cmd_watch.cmd_synopsis); 77 78 --argc; 79 ++argv; 80 81 flags = CR_RECURSE_DIRS; 82 83 while ((ch = getopt(argc, argv, cvs_cmd_watch.cmd_opts)) != -1) { 84 switch (ch) { 85 case 'a': 86 if (!(watch_req & (W_ADD|W_REMOVE))) 87 fatal("%s", cvs_cmd_watch.cmd_synopsis); 88 89 if (strcmp(optarg, "edit") == 0) 90 watch_aflags |= W_EDIT; 91 else if (strcmp(optarg, "unedit") == 0) 92 watch_aflags |= W_UNEDIT; 93 else if (strcmp(optarg, "commit") == 0) 94 watch_aflags |= W_COMMIT; 95 else if (strcmp(optarg, "all") == 0) 96 watch_aflags |= W_ALL; 97 else if (strcmp(optarg, "none") == 0) 98 watch_aflags &= ~W_ALL; 99 else 100 fatal("%s", cvs_cmd_watch.cmd_synopsis); 101 break; 102 case 'l': 103 flags &= ~CR_RECURSE_DIRS; 104 break; 105 case 'R': 106 flags |= CR_RECURSE_DIRS; 107 break; 108 default: 109 fatal("%s", cvs_cmd_watch.cmd_synopsis); 110 } 111 } 112 113 argc -= optind; 114 argv += optind; 115 116 if (watch_aflags == 0) 117 watch_aflags |= W_ALL; 118 119 cr.enterdir = NULL; 120 cr.leavedir = NULL; 121 122 if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) { 123 cvs_client_connect_to_server(); 124 cr.fileproc = cvs_client_sendfile; 125 126 if (watch_req & (W_ADD|W_REMOVE)) { 127 if (watch_aflags & W_EDIT) 128 cvs_client_send_request("Argument -a edit"); 129 130 if (watch_aflags & W_UNEDIT) 131 cvs_client_send_request("Argument -a unedit"); 132 133 if (watch_aflags & W_COMMIT) 134 cvs_client_send_request("Argument -a commit"); 135 136 if (!(watch_aflags & W_ALL)) 137 cvs_client_send_request("Argument -a none"); 138 } 139 140 if (!(flags & CR_RECURSE_DIRS)) 141 cvs_client_send_request("Argument -l"); 142 } else { 143 cr.fileproc = cvs_watch_local; 144 } 145 146 cr.flags = flags; 147 148 cvs_file_run(argc, argv, &cr); 149 150 if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) { 151 cvs_client_send_files(argv, argc); 152 cvs_client_senddir("."); 153 154 if (watch_req & (W_ADD|W_REMOVE)) 155 cvs_client_send_request("watch-%s", 156 (watch_req & W_ADD) ? "add" : "remove"); 157 else 158 cvs_client_send_request("watch-%s", 159 (watch_req & W_ON) ? "on" : "off"); 160 161 cvs_client_get_responses(); 162 } 163 164 return (0); 165 } 166 167 int 168 cvs_watchers(int argc, char **argv) 169 { 170 int ch; 171 int flags; 172 struct cvs_recursion cr; 173 174 flags = CR_RECURSE_DIRS; 175 176 while ((ch = getopt(argc, argv, cvs_cmd_watchers.cmd_opts)) != -1) { 177 switch (ch) { 178 case 'l': 179 flags &= ~CR_RECURSE_DIRS; 180 break; 181 case 'R': 182 flags |= CR_RECURSE_DIRS; 183 break; 184 default: 185 fatal("%s", cvs_cmd_watchers.cmd_synopsis); 186 } 187 } 188 189 argc -= optind; 190 argv += optind; 191 192 if (argc == 0) 193 fatal("%s", cvs_cmd_watchers.cmd_synopsis); 194 195 cr.enterdir = NULL; 196 cr.leavedir = NULL; 197 198 if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) { 199 cvs_client_connect_to_server(); 200 cr.fileproc = cvs_client_sendfile; 201 202 if (!(flags & CR_RECURSE_DIRS)) 203 cvs_client_send_request("Argument -l"); 204 } else { 205 cr.fileproc = cvs_watchers_local; 206 } 207 208 cr.flags = flags; 209 210 cvs_file_run(argc, argv, &cr); 211 212 if (current_cvsroot->cr_method != CVS_METHOD_LOCAL) { 213 cvs_client_send_files(argv, argc); 214 cvs_client_senddir("."); 215 cvs_client_send_request("watchers"); 216 cvs_client_get_responses(); 217 } 218 219 return (0); 220 } 221 222 static void 223 cvs_watch_local(struct cvs_file *cf) 224 { 225 } 226 227 static void 228 cvs_watchers_local(struct cvs_file *cf) 229 { 230 } 231