xref: /openbsd-src/usr.bin/cvs/watch.c (revision 4dcde51379711c241d4d9b93f9d4e9eae2d51f3d)
1*4dcde513Sjoris /*	$OpenBSD: watch.c,v 1.23 2017/06/01 08:08:24 joris Exp $	*/
25a31a4e8Sxsa /*
3f4f603e5Sxsa  * Copyright (c) 2005-2007 Xavier Santolaria <xsa@openbsd.org>
45a31a4e8Sxsa  *
55a31a4e8Sxsa  * Permission to use, copy, modify, and distribute this software for any
65a31a4e8Sxsa  * purpose with or without fee is hereby granted, provided that the above
75a31a4e8Sxsa  * copyright notice and this permission notice appear in all copies.
85a31a4e8Sxsa  *
95a31a4e8Sxsa  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
105a31a4e8Sxsa  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
115a31a4e8Sxsa  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
125a31a4e8Sxsa  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
135a31a4e8Sxsa  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
145a31a4e8Sxsa  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
155a31a4e8Sxsa  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
165a31a4e8Sxsa  */
175a31a4e8Sxsa 
181f8531bdSotto #include <string.h>
191f8531bdSotto #include <unistd.h>
205a31a4e8Sxsa 
215a31a4e8Sxsa #include "cvs.h"
225a31a4e8Sxsa #include "remote.h"
235a31a4e8Sxsa 
24f4f603e5Sxsa #define W_COMMIT	0x01
25f4f603e5Sxsa #define W_EDIT		0x02
26f4f603e5Sxsa #define W_UNEDIT	0x04
27f4f603e5Sxsa #define W_ADD		0x08
28f4f603e5Sxsa #define W_REMOVE	0x10
29f4f603e5Sxsa #define W_ON		0x20
30f4f603e5Sxsa #define W_OFF		0x40
31f4f603e5Sxsa #define W_ALL		(W_EDIT|W_COMMIT|W_UNEDIT)
32f4f603e5Sxsa 
33f4f603e5Sxsa static void	cvs_watch_local(struct cvs_file *);
345a31a4e8Sxsa static void	cvs_watchers_local(struct cvs_file *);
355a31a4e8Sxsa 
36f4f603e5Sxsa struct cvs_cmd cvs_cmd_watch = {
37f331ff59Stobias 	CVS_OP_WATCH, CVS_USE_WDIR, "watch",
387eeb4908Sragge 	{ { 0 }, { 0 } },
39f4f603e5Sxsa 	"Set watches",
40f4f603e5Sxsa 	"on | off | add | remove [-lR] [-a action] [file ...]",
41f4f603e5Sxsa 	"a:lR",
42f4f603e5Sxsa 	NULL,
43f4f603e5Sxsa 	cvs_watch
44f4f603e5Sxsa };
45f4f603e5Sxsa 
465a31a4e8Sxsa struct cvs_cmd cvs_cmd_watchers = {
47f331ff59Stobias 	CVS_OP_WATCHERS, CVS_USE_WDIR, "watchers",
487eeb4908Sragge 	{ { 0 }, { 0 } },
495a31a4e8Sxsa 	"See who is watching a file",
505a31a4e8Sxsa 	"[-lR] [file ...]",
515a31a4e8Sxsa 	"lR",
525a31a4e8Sxsa 	NULL,
535a31a4e8Sxsa 	cvs_watchers
545a31a4e8Sxsa };
555a31a4e8Sxsa 
565a31a4e8Sxsa int
cvs_watch(int argc,char ** argv)57f4f603e5Sxsa cvs_watch(int argc, char **argv)
58f4f603e5Sxsa {
59f4f603e5Sxsa 	int ch, flags;
60f4f603e5Sxsa 	struct cvs_recursion cr;
6163c546bcSnicm 	int watch_req = 0;
6263c546bcSnicm 	int watch_aflags = 0;
63f4f603e5Sxsa 
64f4f603e5Sxsa 	if (argc < 2)
65f4f603e5Sxsa 		fatal("%s", cvs_cmd_watch.cmd_synopsis);
66f4f603e5Sxsa 
67f4f603e5Sxsa 	if (strcmp(argv[1], "on") == 0)
68f4f603e5Sxsa 		watch_req |= W_ON;
69f4f603e5Sxsa 	else if (strcmp(argv[1], "off") == 0)
70f4f603e5Sxsa 		watch_req |= W_OFF;
71f4f603e5Sxsa 	else if (strcmp(argv[1], "add") == 0)
72f4f603e5Sxsa 		watch_req |= W_ADD;
73f4f603e5Sxsa 	else if (strcmp(argv[1], "remove") == 0)
74f4f603e5Sxsa 		watch_req |= W_REMOVE;
75f4f603e5Sxsa 	else
76f4f603e5Sxsa 		fatal("%s", cvs_cmd_watch.cmd_synopsis);
77f4f603e5Sxsa 
78f4f603e5Sxsa 	--argc;
79f4f603e5Sxsa 	++argv;
80f4f603e5Sxsa 
81f4f603e5Sxsa 	flags = CR_RECURSE_DIRS;
82f4f603e5Sxsa 
83f4f603e5Sxsa 	while ((ch = getopt(argc, argv, cvs_cmd_watch.cmd_opts)) != -1) {
84f4f603e5Sxsa 		switch (ch) {
85f4f603e5Sxsa 		case 'a':
86f4f603e5Sxsa 			if (!(watch_req & (W_ADD|W_REMOVE)))
87f4f603e5Sxsa 				fatal("%s", cvs_cmd_watch.cmd_synopsis);
88f4f603e5Sxsa 
89f4f603e5Sxsa 			if (strcmp(optarg, "edit") == 0)
90f4f603e5Sxsa 				watch_aflags |= W_EDIT;
91f4f603e5Sxsa 			else if (strcmp(optarg, "unedit") == 0)
92f4f603e5Sxsa 				watch_aflags |= W_UNEDIT;
93f4f603e5Sxsa 			else if (strcmp(optarg, "commit") == 0)
94f4f603e5Sxsa 				watch_aflags |= W_COMMIT;
95f4f603e5Sxsa 			else if (strcmp(optarg, "all") == 0)
96f4f603e5Sxsa 				watch_aflags |= W_ALL;
97f4f603e5Sxsa 			else if (strcmp(optarg, "none") == 0)
98f4f603e5Sxsa 				watch_aflags &= ~W_ALL;
99f4f603e5Sxsa 			else
100f4f603e5Sxsa 				fatal("%s", cvs_cmd_watch.cmd_synopsis);
101528e2d0cStobias 			break;
102f4f603e5Sxsa 		case 'l':
103f4f603e5Sxsa 			flags &= ~CR_RECURSE_DIRS;
104f4f603e5Sxsa 			break;
105f4f603e5Sxsa 		case 'R':
106bcf22459Stobias 			flags |= CR_RECURSE_DIRS;
107f4f603e5Sxsa 			break;
108f4f603e5Sxsa 		default:
109f4f603e5Sxsa 			fatal("%s", cvs_cmd_watch.cmd_synopsis);
110f4f603e5Sxsa 		}
111f4f603e5Sxsa 	}
112f4f603e5Sxsa 
113f4f603e5Sxsa 	argc -= optind;
114f4f603e5Sxsa 	argv += optind;
115f4f603e5Sxsa 
116f4f603e5Sxsa 	if (watch_aflags == 0)
117f4f603e5Sxsa 		watch_aflags |= W_ALL;
118f4f603e5Sxsa 
119f4f603e5Sxsa 	cr.enterdir = NULL;
120f4f603e5Sxsa 	cr.leavedir = NULL;
121f4f603e5Sxsa 
122*4dcde513Sjoris 	if (cvsroot_is_remote()) {
12380f6ca9bSjoris 		cvs_client_connect_to_server();
124f4f603e5Sxsa 		cr.fileproc = cvs_client_sendfile;
125f4f603e5Sxsa 
126f4f603e5Sxsa 		if (watch_req & (W_ADD|W_REMOVE)) {
127f4f603e5Sxsa 			if (watch_aflags & W_EDIT)
128f4f603e5Sxsa 				cvs_client_send_request("Argument -a edit");
129f4f603e5Sxsa 
130f4f603e5Sxsa 			if (watch_aflags & W_UNEDIT)
131f4f603e5Sxsa 				cvs_client_send_request("Argument -a unedit");
132f4f603e5Sxsa 
133f4f603e5Sxsa 			if (watch_aflags & W_COMMIT)
134f4f603e5Sxsa 				cvs_client_send_request("Argument -a commit");
135f4f603e5Sxsa 
136f4f603e5Sxsa 			if (!(watch_aflags & W_ALL))
137f4f603e5Sxsa 				cvs_client_send_request("Argument -a none");
138f4f603e5Sxsa 		}
139f4f603e5Sxsa 
140f4f603e5Sxsa 		if (!(flags & CR_RECURSE_DIRS))
141f4f603e5Sxsa 			cvs_client_send_request("Argument -l");
142f4f603e5Sxsa 	} else {
143f4f603e5Sxsa 		cr.fileproc = cvs_watch_local;
144f4f603e5Sxsa 	}
145f4f603e5Sxsa 
146f4f603e5Sxsa 	cr.flags = flags;
147f4f603e5Sxsa 
148f4f603e5Sxsa 	cvs_file_run(argc, argv, &cr);
149f4f603e5Sxsa 
150*4dcde513Sjoris 	if (cvsroot_is_remote()) {
151f4f603e5Sxsa 		cvs_client_send_files(argv, argc);
152f4f603e5Sxsa 		cvs_client_senddir(".");
153f4f603e5Sxsa 
154f4f603e5Sxsa 		if (watch_req & (W_ADD|W_REMOVE))
155f4f603e5Sxsa 			cvs_client_send_request("watch-%s",
156f4f603e5Sxsa 			    (watch_req & W_ADD) ? "add" : "remove");
157f4f603e5Sxsa 		else
158f4f603e5Sxsa 			cvs_client_send_request("watch-%s",
159f4f603e5Sxsa 			    (watch_req & W_ON) ? "on" : "off");
160f4f603e5Sxsa 
161f4f603e5Sxsa 		cvs_client_get_responses();
162f4f603e5Sxsa 	}
163f4f603e5Sxsa 
164f4f603e5Sxsa 	return (0);
165f4f603e5Sxsa }
166f4f603e5Sxsa 
167f4f603e5Sxsa int
cvs_watchers(int argc,char ** argv)1685a31a4e8Sxsa cvs_watchers(int argc, char **argv)
1695a31a4e8Sxsa {
1705a31a4e8Sxsa 	int ch;
1715a31a4e8Sxsa 	int flags;
1725a31a4e8Sxsa 	struct cvs_recursion cr;
1735a31a4e8Sxsa 
1745a31a4e8Sxsa 	flags = CR_RECURSE_DIRS;
1755a31a4e8Sxsa 
1765a31a4e8Sxsa 	while ((ch = getopt(argc, argv, cvs_cmd_watchers.cmd_opts)) != -1) {
1775a31a4e8Sxsa 		switch (ch) {
1785a31a4e8Sxsa 		case 'l':
1795a31a4e8Sxsa 			flags &= ~CR_RECURSE_DIRS;
1805a31a4e8Sxsa 			break;
1815a31a4e8Sxsa 		case 'R':
182bcf22459Stobias 			flags |= CR_RECURSE_DIRS;
1835a31a4e8Sxsa 			break;
1845a31a4e8Sxsa 		default:
1855a31a4e8Sxsa 			fatal("%s", cvs_cmd_watchers.cmd_synopsis);
1865a31a4e8Sxsa 		}
1875a31a4e8Sxsa 	}
1885a31a4e8Sxsa 
1895a31a4e8Sxsa 	argc -= optind;
1905a31a4e8Sxsa 	argv += optind;
1915a31a4e8Sxsa 
1925a31a4e8Sxsa 	if (argc == 0)
1935a31a4e8Sxsa 		fatal("%s", cvs_cmd_watchers.cmd_synopsis);
1945a31a4e8Sxsa 
1955a31a4e8Sxsa 	cr.enterdir = NULL;
1965a31a4e8Sxsa 	cr.leavedir = NULL;
1975a31a4e8Sxsa 
198*4dcde513Sjoris 	if (cvsroot_is_remote()) {
19980f6ca9bSjoris 		cvs_client_connect_to_server();
2005a31a4e8Sxsa 		cr.fileproc = cvs_client_sendfile;
2015a31a4e8Sxsa 
2025a31a4e8Sxsa 		if (!(flags & CR_RECURSE_DIRS))
2035a31a4e8Sxsa 			cvs_client_send_request("Argument -l");
2045a31a4e8Sxsa 	} else {
2055a31a4e8Sxsa 		cr.fileproc = cvs_watchers_local;
2065a31a4e8Sxsa 	}
2075a31a4e8Sxsa 
2085a31a4e8Sxsa 	cr.flags = flags;
2095a31a4e8Sxsa 
2105a31a4e8Sxsa 	cvs_file_run(argc, argv, &cr);
2115a31a4e8Sxsa 
212*4dcde513Sjoris 	if (cvsroot_is_remote()) {
2135a31a4e8Sxsa 		cvs_client_send_files(argv, argc);
2145a31a4e8Sxsa 		cvs_client_senddir(".");
2155a31a4e8Sxsa 		cvs_client_send_request("watchers");
2165a31a4e8Sxsa 		cvs_client_get_responses();
2175a31a4e8Sxsa 	}
2185a31a4e8Sxsa 
2195a31a4e8Sxsa 	return (0);
2205a31a4e8Sxsa }
2215a31a4e8Sxsa 
2225a31a4e8Sxsa static void
cvs_watch_local(struct cvs_file * cf)223f4f603e5Sxsa cvs_watch_local(struct cvs_file *cf)
224f4f603e5Sxsa {
225f4f603e5Sxsa }
226f4f603e5Sxsa 
227f4f603e5Sxsa static void
cvs_watchers_local(struct cvs_file * cf)2285a31a4e8Sxsa cvs_watchers_local(struct cvs_file *cf)
2295a31a4e8Sxsa {
2305a31a4e8Sxsa }
231