ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtc.C
Revision: 1.22
Committed: Sun Jan 22 16:36:40 2006 UTC (18 years, 4 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-7_3a, rel-7_3, rel-7_2, rel-7_5, rel-7_4
Changes since 1.21: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.11 /*--------------------------------*-C-*---------------------------------*
2     * File: rxvtc.C
3     *----------------------------------------------------------------------*
4     *
5     * All portions of code are copyright by their respective author/s.
6     * Copyright (c) 2003-2004 Marc Lehmann <pcg@goof.com>
7     *
8     * This program is free software; you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation; either version 2 of the License, or
11     * (at your option) any later version.
12     *
13     * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17     *
18     * You should have received a copy of the GNU General Public License
19     * along with this program; if not, write to the Free Software
20     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21     *----------------------------------------------------------------------*/
22    
23 pcg 1.8 #include "../config.h"
24 pcg 1.1 #include <cstdio>
25     #include <cstdlib>
26 root 1.13 #include <cstring>
27 root 1.14 #include <csignal>
28 pcg 1.1
29     #include <unistd.h>
30     #include <sys/socket.h>
31     #include <sys/un.h>
32    
33 root 1.21 #include "rxvtdaemon.h"
34     #include "libptytty.h"
35    
36     #include "rxvt.h"
37    
38 pcg 1.1 struct client : rxvt_connection {
39     client ();
40     };
41    
42     client::client ()
43     {
44 root 1.20 if ((fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
45 pcg 1.1 {
46 pcg 1.5 perror ("unable to create communications socket");
47 pcg 1.1 exit (EXIT_FAILURE);
48     }
49    
50 pcg 1.4 char *sockname = rxvt_connection::unix_sockname ();
51 pcg 1.1 sockaddr_un sa;
52     sa.sun_family = AF_UNIX;
53 pcg 1.4 strcpy (sa.sun_path, sockname);
54     free (sockname);
55 pcg 1.1
56     if (connect (fd, (sockaddr *)&sa, sizeof (sa)))
57     {
58 root 1.13 perror ("unable to connect to the rxvt-unicode daemon");
59 pcg 1.1 exit (EXIT_FAILURE);
60     }
61     }
62    
63 pcg 1.3 extern char **environ;
64    
65 pcg 1.1 int
66 pcg 1.7 main (int argc, const char *const *argv)
67 pcg 1.1 {
68     client c;
69 pcg 1.3 {
70     sigset_t ss;
71    
72 pcg 1.6 sigemptyset (&ss);
73 pcg 1.3 sigaddset (&ss, SIGHUP);
74     sigprocmask (SIG_BLOCK, &ss, 0);
75     }
76    
77 pcg 1.1 c.send ("NEW");
78 root 1.15
79 pcg 1.7 // instead of getcwd we could opendir (".") and pass the fd for fchdir *g*
80 root 1.15 char cwd[PATH_MAX];
81    
82     if (!getcwd (cwd, sizeof (cwd)))
83     {
84     perror ("unable to determine current working directory");
85     exit (EXIT_FAILURE);
86     }
87    
88     c.send ("CWD"), c.send (cwd);
89 pcg 1.3
90 root 1.16 for (char **var = environ; *var; var++)
91     c.send ("ENV"), c.send (*var);
92 pcg 1.1
93 root 1.13 const char *base = strrchr (argv[0], '/');
94     base = base ? base + 1 : argv[0];
95     c.send ("ARG"), c.send (strcmp (base, RXVTNAME "c") ? base : RXVTNAME);
96    
97     for (int i = 1; i < argc; i++)
98 pcg 1.2 c.send ("ARG"), c.send (argv[i]);
99    
100 pcg 1.1 c.send ("END");
101 pcg 1.8
102     auto_str tok;
103 root 1.17 int cint;
104 pcg 1.8
105     for (;;)
106     if (!c.recv (tok))
107     {
108     fprintf (stderr, "protocol error: unexpected eof from server.\n");
109     break;
110     }
111     else if (!strcmp (tok, "MSG") && c.recv (tok))
112     fprintf (stderr, "%s", (const char *)tok);
113 root 1.17 else if (!strcmp (tok, "GETFD") && c.recv (cint))
114     {
115 root 1.22 if (!ptytty::send_fd (c.fd, cint))
116 root 1.17 {
117     fprintf (stderr, "unable to send fd %d: ", cint); perror (0);
118     exit (EXIT_FAILURE);
119     }
120     }
121 pcg 1.8 else if (!strcmp (tok, "END"))
122     {
123     int success;
124 root 1.19
125 pcg 1.8 if (c.recv (success))
126     exit (success ? EXIT_SUCCESS : EXIT_FAILURE);
127     }
128     else
129     {
130 root 1.17 fprintf (stderr, "protocol error: received unsupported token '%s'.\n", (const char *)tok);
131 pcg 1.8 break;
132     }
133    
134     return EXIT_FAILURE;
135 pcg 1.1 }
136