ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtd.C
(Generate patch)

Comparing rxvt-unicode/src/rxvtd.C (file contents):
Revision 1.1 by pcg, Mon Nov 24 17:28:08 2003 UTC vs.
Revision 1.4 by pcg, Tue Nov 25 17:34:47 2003 UTC

2#include "rxvtdaemon.h" 2#include "rxvtdaemon.h"
3#include "iom.h" 3#include "iom.h"
4 4
5#include <cstdio> 5#include <cstdio>
6#include <cstdlib> 6#include <cstdlib>
7#include <cstdarg>
8#include <cstring>
7 9
8#include <unistd.h> 10#include <unistd.h>
9#include <sys/socket.h> 11#include <sys/socket.h>
10#include <sys/un.h> 12#include <sys/un.h>
13
14#include <cerrno>
15
16extern char **environ;
11 17
12struct server : rxvt_connection { 18struct server : rxvt_connection {
13 void read_cb (io_watcher &w, short revents); io_watcher read_ev; 19 void read_cb (io_watcher &w, short revents); io_watcher read_ev;
14 20
15 server (int fd) 21 server (int fd)
17 { 23 {
18 this->fd = fd; 24 this->fd = fd;
19 read_ev.start (fd, EVENT_READ); 25 read_ev.start (fd, EVENT_READ);
20 } 26 }
21 27
22 void err (); 28 void err (const char *format = 0, ...);
23}; 29};
24 30
25struct listener { 31struct listener {
26 int fd; 32 int fd;
27 33
67 73
68 if (fd2 >= 0) 74 if (fd2 >= 0)
69 new server (fd2); 75 new server (fd2);
70} 76}
71 77
72void server::err () 78void server::err (const char *format, ...)
73{ 79{
80 if (format)
81 {
82 char err[1024];
83
84 va_list ap;
85 va_start (ap, format);
86 vsnprintf (err, 1024, format, ap);
87 va_end (ap);
88
89 send ("ERR"), send (err);
90 }
91
74 close (fd); 92 close (fd);
75 delete this; 93 delete this;
76} 94}
77 95
78void server::read_cb (io_watcher &w, short revents) 96void server::read_cb (io_watcher &w, short revents)
79{ 97{
80 token cmd; 98 auto_str tok;
81 99
82 if (recv (cmd)) 100 if (recv (tok))
83 { 101 {
84 if (!strcmp (cmd, "NEW")) 102 if (!strcmp (tok, "NEW"))
85 { 103 {
104 stringvec argv;
105 stringvec envv;
106
107 for (;;)
108 {
109 if (!recv (tok))
110 return err ();
111
112 if (!strcmp (tok, "END"))
113 break;
114 else if (!strcmp (tok, "ENV") && recv (tok))
115 envv.push_back (tok.get ());
116 else if (!strcmp (tok, "CWD") && recv (tok))
117 {
118 if (chdir (tok))
119 err ("unable to change to working directory to '%s': %s",
120 (char *)tok, strerror (errno));
121 }
122 else if (!strcmp (tok, "ARG") && recv (tok))
123 argv.push_back (tok.get ());
124 else
125 return err ("protocol error: unexpected NEW token");
126 }
127
128 envv.push_back (0);
129
130 {
131 char **old_environ = environ;
132 environ = envv.begin ();
133
134 rxvt_init (argv.size (), argv.begin ());
135
136 environ = old_environ;
137 envv.clear (); // can't yet save the env 'cause rxvt modifies it :(
138 }
86 } 139 }
87 else 140 else
88 err (); 141 return err ("protocol error: request '%s' unsupported.", (char *)tok);
89 } 142 }
90 else 143 else
91 err (); 144 return err ();
92} 145}
93 146
94int 147int
95main(int argc, const char *const *argv) 148main(int argc, const char *const *argv)
96{ 149{
97 listener l; 150 listener l;
151
152 {
153 sigset_t ss;
154
155 sigaddset (&ss, SIGHUP);
156 sigprocmask (SIG_BLOCK, &ss, 0);
157 }
158
159 printf ("rxvtd running.\n");
98 iom.loop (); 160 iom.loop ();
99 161
100#if 0 162#if 0
101 if (rxvt_init(argc, argv) == NULL) 163 if (rxvt_init(argc, argv) == NULL)
102 return EXIT_FAILURE; 164 return EXIT_FAILURE;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines