File: test13.daemon.c

package info (click to toggle)
daemon 0.8.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,072 kB
  • sloc: ansic: 30,432; sh: 4,310; perl: 592; makefile: 307
file content (115 lines) | stat: -rw-r--r-- 2,271 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <slack/lib.h>
#include <sys/time.h>

extern char **environ;

/* Test --pty=noecho */

int main(int ac, char **av)
{
	pid_t pid;
	int in, out, err;
	char *client_name;
	char *daemon_path;
	char *config_path;
	char *client_path;
	char buf[BUFSIZ];
	ssize_t bytes;
	char *argv[] = { "daemon", "-C", null, "-n", null, null, null };

	fd_set save_readfds[1];
	fd_set readfds[1];
	int maxfd;

	prog_init();
	prog_set_name("test13.daemon");
	prog_set_syntax("name \"`pwd`\" client");

	if (ac != 4)
		prog_usage_msg("Invalid arguments");

	daemon_path = "../daemon";

	client_name = av[1];
	config_path = av[2];
	client_path = av[3];

	argv[2] = config_path;
	argv[4] = client_name;
	argv[5] = client_path;

	if ((pid = coproc_open(&in, &out, &err, daemon_path, argv, environ, null, null)) == -1)
		fatalsys("coproc_open failed");

	FD_ZERO(save_readfds);
	FD_SET(STDIN_FILENO, save_readfds);
	FD_SET(out, save_readfds);
	FD_SET(err, save_readfds);
	maxfd = (err > out) ? err : out;

	for (*readfds = *save_readfds; (FD_ISSET(STDIN_FILENO, readfds) || FD_ISSET(out, readfds) || FD_ISSET(err, readfds)) && select(maxfd + 1, readfds, null, null, null) != -1; *readfds = *save_readfds)
	{
		if (FD_ISSET(STDIN_FILENO, readfds))
		{
			switch (bytes = read(STDIN_FILENO, buf, BUFSIZ))
			{
				case -1:
					errorsys("read(STDIN_FILENO) failed");
					FD_CLR(STDIN_FILENO, save_readfds);
					break;

				case 0:
					close(in);
					FD_CLR(STDIN_FILENO, save_readfds);
					break;

				default:
					write(in, buf, bytes);
					break;
			}
		}

		if (FD_ISSET(out, readfds))
		{
			switch (bytes = read(out, buf, BUFSIZ))
			{
				case -1:
					errorsys("read(out) failed");
					FD_CLR(out, save_readfds);
					break;

				case 0:
					FD_CLR(out, save_readfds);
					break;

				default:
					write(STDOUT_FILENO, buf, bytes);
					break;
			}
		}

		if (FD_ISSET(err, readfds))
		{
			switch (bytes = read(err, buf, BUFSIZ))
			{
				case -1:
					errorsys("read(err) = %d", bytes);
					FD_CLR(err, save_readfds);
					break;

				case 0:
					FD_CLR(err, save_readfds);
					break;

				default:
					write(STDERR_FILENO, buf, bytes);
					break;
			}
		}
	}

	if (coproc_close(pid, &in, &out, &err) == -1)
		fatalsys("coproc_close failed");

	return EXIT_SUCCESS;
}