ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtc.C
Revision: 1.18
Committed: Sat Dec 24 11:55:41 2005 UTC (18 years, 5 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-6_2, rel-6_3, rel-6_0, rel-6_1
Changes since 1.17: +2 -0 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 "rxvtdaemon.h"
25 root 1.17 #include "fdpass.h"
26 pcg 1.1
27 pcg 1.9 #include "rxvt.h"
28    
29 pcg 1.1 #include <cstdio>
30     #include <cstdlib>
31 root 1.13 #include <cstring>
32 root 1.14 #include <csignal>
33 pcg 1.1
34     #include <unistd.h>
35     #include <sys/socket.h>
36     #include <sys/un.h>
37    
38     struct client : rxvt_connection {
39     client ();
40     };
41    
42     client::client ()
43     {
44 pcg 1.11 if ((fd = socket (PF_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.18 #if ENABLE_FRILLS && HAVE_UNIX_FDPASS
114 root 1.17 else if (!strcmp (tok, "GETFD") && c.recv (cint))
115     {
116     if (rxvt_send_fd (c.fd, cint) < 0)
117     {
118     fprintf (stderr, "unable to send fd %d: ", cint); perror (0);
119     exit (EXIT_FAILURE);
120     }
121     }
122 root 1.18 #endif
123 pcg 1.8 else if (!strcmp (tok, "END"))
124     {
125     int success;
126     if (c.recv (success))
127     exit (success ? EXIT_SUCCESS : EXIT_FAILURE);
128     }
129     else
130     {
131 root 1.17 fprintf (stderr, "protocol error: received unsupported token '%s'.\n", (const char *)tok);
132 pcg 1.8 break;
133     }
134    
135     return EXIT_FAILURE;
136 pcg 1.1 }
137