Mercurial > ~mikael > mcabber > hg
annotate mcabber/src/main.c @ 1307:6c116207ab2e
Work around segfault in otrl_userstate_free()
It only occurs when SSL is enabled and mcabber is linked to libgnutls.
Seems to be a problem in libgcrypt when both libotr and libgnutls use it.
author  Mikael Berthe <mikael@lilotux.net> 

date  Sun, 09 Sep 2007 17:44:34 +0200 
parents  3b338a5c01fc 
children  0dda8238af21 
rev  line source 

307  1 /* 
2 * main.c  
393  3 * 
1205  4 * Copyright (C) 20052007 Mikael Berthe <mikael@lilotux.net> 
307  5 * Parts of this file come from Cabber <cabber@ajmacias.com> 
6 *  
7 * This program is free software; you can redistribute it and/or modify  
8 * it under the terms of the GNU General Public License as published by  
9 * the Free Software Foundation; either version 2 of the License, or (at  
10 * your option) any later version.  
11 *  
12 * This program is distributed in the hope that it will be useful, but  
13 * WITHOUT ANY WARRANTY; without even the implied warranty of  
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  
15 * General Public License for more details.  
16 *  
17 * You should have received a copy of the GNU General Public License  
18 * along with this program; if not, write to the Free Software  
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 021111307  
20 * USA  
21 */  
22  
24  23 #include <stdio.h> 
24 #include <stdlib.h>  
25 #include <unistd.h>  
26 #include <string.h>  
27 #include <signal.h>  
28 #include <termios.h>  
28  29 #include <getopt.h> 
163  30 #include <sys/types.h> 
31 #include <sys/wait.h>  
169  32 #include <glib.h> 
404  33 #include <config.h> 
24  34 
81  35 #include "jabglue.h" 
24  36 #include "screen.h" 
279
f5dd437c057b
Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents:
272
diff
changeset

37 #include "settings.h" 
102  38 #include "roster.h" 
96  39 #include "commands.h" 
113  40 #include "histolog.h" 
163  41 #include "hooks.h" 
81  42 #include "utils.h" 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

43 #include "pgp.h" 
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

44 #include "otr.h" 
781
d3af6877a7df
Add enablehgcset to configure script
Mikael Berthe <mikael@lilotux.net>
parents:
779
diff
changeset

45 
d3af6877a7df
Add enablehgcset to configure script
Mikael Berthe <mikael@lilotux.net>
parents:
779
diff
changeset

46 #ifdef ENABLE_HGCSET 
d3af6877a7df
Add enablehgcset to configure script
Mikael Berthe <mikael@lilotux.net>
parents:
779
diff
changeset

47 # include "hgcset.h" 
d3af6877a7df
Add enablehgcset to configure script
Mikael Berthe <mikael@lilotux.net>
parents:
779
diff
changeset

48 #endif 
24  49 
801
d8e0a1ce3e8a
Define WAIT_ANY if needed.
Soren Andersen <somian@pobox.com>
parents:
789
diff
changeset

50 #ifndef WAIT_ANY 
1053  51 # define WAIT_ANY 1 
801
d8e0a1ce3e8a
Define WAIT_ANY if needed.
Soren Andersen <somian@pobox.com>
parents:
789
diff
changeset

52 #endif 
24  53 
789
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

54 static struct termios *backup_termios; 
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

55 
777
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

56 char *mcabber_version(void) 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

57 { 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

58 char *ver; 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

59 #ifdef HGCSET 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

60 ver = g_strdup_printf("%s (%s)", PACKAGE_VERSION, HGCSET); 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

61 #else 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

62 ver = g_strdup(PACKAGE_VERSION); 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

63 #endif 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

64 return ver; 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

65 } 
e6d42f239541
"/version" shows Mercurial changeset (if there's one)
Mikael Berthe <mikael@lilotux.net>
parents:
774
diff
changeset

66 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

67 void mcabber_connect(void) 
35  68 { 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

69 const char *username, *password, *resource, *servername; 
429  70 const char *proxy_host; 
1058  71 char *bjid; 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

72 int ssl; 
938
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

73 int sslverify = 1; 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

74 const char *sslvopt = NULL, *cafile = NULL, *capath = NULL, *ciphers = NULL; 
1222
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

75 static char *cafile_xp, *capath_xp; 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

76 unsigned int port; 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

77 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

78 servername = settings_opt_get("server"); 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

79 username = settings_opt_get("username"); 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

80 password = settings_opt_get("password"); 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

81 resource = settings_opt_get("resource"); 
429  82 proxy_host = settings_opt_get("proxy_host"); 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

83 
1222
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

84 // Free the ca*_xp strings if they've already been set. 
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

85 g_free(cafile_xp); 
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

86 g_free(capath_xp); 
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

87 cafile_xp = capath_xp = NULL; 
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

88 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

89 if (!servername) { 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

90 scr_LogPrint(LPRINT_NORMAL, "Server name has not been specified!"); 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

91 return; 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

92 } 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

93 if (!username) { 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

94 scr_LogPrint(LPRINT_NORMAL, "User name has not been specified!"); 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

95 return; 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

96 } 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

97 if (!password) { 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

98 scr_LogPrint(LPRINT_NORMAL, "Password has not been specified!"); 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

99 return; 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

100 } 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

101 if (!resource) 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

102 resource = "mcabber"; 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

103 
938
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

104 port = (unsigned int) settings_opt_get_int("port"); 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

105 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

106 ssl = settings_opt_get_int("ssl"); 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

107 sslvopt = settings_opt_get("ssl_verify"); 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

108 if (sslvopt) 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

109 sslverify = settings_opt_get_int("ssl_verify"); 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

110 cafile = settings_opt_get("ssl_cafile"); 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

111 capath = settings_opt_get("ssl_capath"); 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

112 ciphers = settings_opt_get("ssl_ciphers"); 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

113 
815
04edcb6d7ee3
Warn when ssl is request but not compiled in
Mikael Berthe <mikael@lilotux.net>
parents:
801
diff
changeset

114 #if !defined(HAVE_OPENSSL) && !defined(HAVE_GNUTLS) 
938
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

115 if (ssl  sslvopt  cafile  capath  ciphers) { 
815
04edcb6d7ee3
Warn when ssl is request but not compiled in
Mikael Berthe <mikael@lilotux.net>
parents:
801
diff
changeset

116 scr_LogPrint(LPRINT_LOGNORM, 
955
6be62425dc38
Use current ssl_verify value in /connect
Mikael Berthe <mikael@lilotux.net>
parents:
940
diff
changeset

117 "** Warning: SSL is NOT available, ignoring sslrelated setting"); 
938
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

118 ssl = sslverify = 0; 
40175f3dcef7
SSL server certificate verification
Jefferson Ogata <ogata@antibozo.net>
parents:
895
diff
changeset

119 cafile = capath = ciphers = NULL; 
815
04edcb6d7ee3
Warn when ssl is request but not compiled in
Mikael Berthe <mikael@lilotux.net>
parents:
801
diff
changeset

120 } 
1253  121 #elif defined HAVE_GNUTLS 
122 if (sslverify >= 0) {  
123 scr_LogPrint(LPRINT_LOGNORM, "Warning: SSL certificate checking "  
124 "is not supported yet with GnuTLS");  
125 }  
815
04edcb6d7ee3
Warn when ssl is request but not compiled in
Mikael Berthe <mikael@lilotux.net>
parents:
801
diff
changeset

126 #endif 
1222
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

127 cafile_xp = expand_filename(cafile); 
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

128 capath_xp = expand_filename(capath); 
1167
9726c78a91f3
Allow '~' (HOME directory) in config options
Mikael Berthe <mikael@lilotux.net>
parents:
1123
diff
changeset

129 cw_set_ssl_options(sslverify, cafile_xp, capath_xp, ciphers, servername); 
1222
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

130 // We can't free the ca*_xp variables now, because they're not duplicated 
75aee46d3aee
Fix a problem with the ssl_ca{file,path} variables expansion
Mikael Berthe <mikael@lilotux.net>
parents:
1205
diff
changeset

131 // in cw_set_ssl_options(). 
815
04edcb6d7ee3
Warn when ssl is request but not compiled in
Mikael Berthe <mikael@lilotux.net>
parents:
801
diff
changeset

132 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

133 /* Connect to server */ 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

134 scr_LogPrint(LPRINT_NORMALLPRINT_DEBUG, "Connecting to server: %s", 
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

135 servername); 
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

136 if (port) 
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

137 scr_LogPrint(LPRINT_NORMALLPRINT_DEBUG, " using port %d", port); 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

138 
429  139 if (proxy_host) { 
140 int proxy_port = settings_opt_get_int("proxy_port");  
141 if (proxy_port <= 0  proxy_port > 65535) {  
142 scr_LogPrint(LPRINT_LOGNORM, "Invalid proxy port: %d", proxy_port);  
143 } else {  
144 const char *proxy_user, *proxy_pass;  
145 proxy_user = settings_opt_get("proxy_user");  
146 proxy_pass = settings_opt_get("proxy_pass");  
147 // Proxy initialization  
148 cw_setproxy(proxy_host, proxy_port, proxy_user, proxy_pass);  
149 scr_LogPrint(LPRINT_NORMALLPRINT_DEBUG, " using proxy %s:%d",  
150 proxy_host, proxy_port);  
151 }  
152 }  
153  
1058  154 bjid = compose_jid(username, servername, resource); 
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

155 #if defined(HAVE_LIBOTR) 
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

156 otr_init(bjid); 
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

157 #endif 
1058  158 jc = jb_connect(bjid, servername, port, ssl, password); 
159 g_free(bjid);  
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

160 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

161 if (!jc) 
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

162 scr_LogPrint(LPRINT_LOGNORM, "Error connecting to (%s)", servername); 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

163 
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

164 jb_reset_keepalive(); 
35  165 } 
166  
962
e79af58cd0be
mcabber_disconnect() > static mcabber_terminate()
Mikael Berthe <mikael@lilotux.net>
parents:
961
diff
changeset

167 static void mcabber_terminate(const char *msg) 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

168 { 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

169 jb_disconnect(); 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

170 scr_TerminateCurses(); 
789
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

171 
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

172 // Restore term settings, if needed. 
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

173 if (backup_termios) 
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

174 tcsetattr(fileno(stdin), TCSAFLUSH, backup_termios); 
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

175 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

176 if (msg) 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

177 fprintf(stderr, "%s\n", msg); 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

178 printf("Bye!\n"); 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

179 exit(EXIT_SUCCESS); 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

180 } 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

181 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

182 void sig_handler(int signum) 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

183 { 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

184 if (signum == SIGCHLD) { 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

185 int status; 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

186 pid_t pid; 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

187 do { 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

188 pid = waitpid (WAIT_ANY, &status, WNOHANG); 
676
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

189 // Check the exit status value if 'eventcmd_checkstatus' is set 
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

190 if (settings_opt_get_int("eventcmd_checkstatus")) { 
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

191 if (pid > 0) { 
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

192 // exit status 2 > beep 
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

193 if (WIFEXITED(status) && WEXITSTATUS(status) == 2) { 
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

194 scr_Beep(); 
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

195 } 
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

196 } 
80d4959422ca
New "eventcmd_checkstatus" option
Mikael Berthe <mikael@lilotux.net>
parents:
580
diff
changeset

197 } 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

198 } while (pid > 0); 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

199 signal(SIGCHLD, sig_handler); 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

200 } else if (signum == SIGTERM) { 
962
e79af58cd0be
mcabber_disconnect() > static mcabber_terminate()
Mikael Berthe <mikael@lilotux.net>
parents:
961
diff
changeset

201 mcabber_terminate("Killed by SIGTERM"); 
389
6e895f397474
Ncurses changes + CtrlC does not send a signal anylore
Mikael Berthe <mikael@lilotux.net>
parents:
374
diff
changeset

202 } else if (signum == SIGINT) { 
962
e79af58cd0be
mcabber_disconnect() > static mcabber_terminate()
Mikael Berthe <mikael@lilotux.net>
parents:
961
diff
changeset

203 mcabber_terminate("Killed by SIGINT"); 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

204 } else { 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

205 scr_LogPrint(LPRINT_LOGNORM, "Caught signal: %d", signum); 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

206 } 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

207 } 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

208 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

209 // ask_password(what) 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

210 // Return the password, or NULL. 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

211 // The string must be freed after use. 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

212 static char *ask_password(const char *what) 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

213 { 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

214 char *password, *p; 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

215 size_t passsize = 128; 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

216 struct termios orig, new; 
482
2ea7591584ab
Use fgets() instead of getline()
Mikael Berthe <mikael@lilotux.net>
parents:
429
diff
changeset

217 
2ea7591584ab
Use fgets() instead of getline()
Mikael Berthe <mikael@lilotux.net>
parents:
429
diff
changeset

218 password = g_new0(char, passsize); 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

219 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

220 /* Turn echoing off and fail if we can't. */ 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

221 if (tcgetattr(fileno(stdin), &orig) != 0) return NULL; 
789
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

222 backup_termios = &orig; 
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

223 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

224 new = orig; 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

225 new.c_lflag &= ~ECHO; 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

226 if (tcsetattr(fileno(stdin), TCSAFLUSH, &new) != 0) return NULL; 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

227 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

228 /* Read the password. */ 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

229 printf("Please enter %s: ", what); 
482
2ea7591584ab
Use fgets() instead of getline()
Mikael Berthe <mikael@lilotux.net>
parents:
429
diff
changeset

230 fgets(password, passsize, stdin); 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

231 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

232 /* Restore terminal. */ 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

233 tcsetattr(fileno(stdin), TCSAFLUSH, &orig); 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

234 printf("\n"); 
789
1fa93cc6f5e3
Correctly restore term settings when interrupting the password query
Mikael Berthe <mikael@lilotux.net>
parents:
784
diff
changeset

235 backup_termios = NULL; 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

236 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

237 for (p = (char*)password; *p; p++) 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

238 ; 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

239 for ( ; p > (char*)password ; p) 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

240 if (*p == '\n'  *p == '\r') *p = 0; 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

241 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

242 return password; 
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

243 } 
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

244 
784
d7f3b58db522
Display hgcset (if defined) at startup
Mikael Berthe <mikael@lilotux.net>
parents:
781
diff
changeset

245 static void credits(void) 
24  246 { 
895  247 const char *v_fmt = "MCabber %s  Email: mcabber [at] lilotux [dot] net\n"; 
784
d7f3b58db522
Display hgcset (if defined) at startup
Mikael Berthe <mikael@lilotux.net>
parents:
781
diff
changeset

248 char *v = mcabber_version(); 
851
da03534e46c7
Add startup log messages to the status buffer
Mikael Berthe <mikael@lilotux.net>
parents:
848
diff
changeset

249 printf(v_fmt, v); 
da03534e46c7
Add startup log messages to the status buffer
Mikael Berthe <mikael@lilotux.net>
parents:
848
diff
changeset

250 scr_LogPrint(LPRINT_LOGNORMLPRINT_NOTUTF8, v_fmt, v); 
784
d7f3b58db522
Display hgcset (if defined) at startup
Mikael Berthe <mikael@lilotux.net>
parents:
781
diff
changeset

251 g_free(v); 
24  252 } 
253  
1257
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

254 static void compile_options(void) 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

255 { 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

256 puts("Installation data directory: " DATA_DIR "\n"); 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

257 #ifdef HAVE_UNICODE 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

258 puts("Compiled with unicode support."); 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

259 #endif 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

260 #ifdef HAVE_OPENSSL 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

261 puts("Compiled with OpenSSL support."); 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

262 #elif defined HAVE_GNUTLS 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

263 puts("Compiled with GnuTLS support."); 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

264 #endif 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

265 #ifdef HAVE_GPGME 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

266 puts("Compiled with GPG support."); 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

267 #endif 
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

268 #ifdef HAVE_LIBOTR 
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

269 puts("Compiled with OTR support."); 
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

270 #endif 
1257
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

271 #ifdef WITH_ASPELL 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

272 puts("Compiled with Aspell support."); 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

273 #endif 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

274 #ifdef DEBUG_ENABLE 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

275 puts("Compiled with debugging support."); 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

276 #endif 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

277 } 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

278 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

279 static void main_init_pgp(void) 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

280 { 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

281 #ifdef HAVE_GPGME 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

282 const char *pk, *pp; 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

283 char *typed_passwd = NULL; 
1238
80008fe2a4f2
Reenable gpgagent (revert 591d8b35c881)
Mikael Berthe <mikael@lilotux.net>
parents:
1223
diff
changeset

284 char *p; 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

285 bool pgp_invalid = FALSE; 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

286 bool pgp_agent; 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

287 
1238
80008fe2a4f2
Reenable gpgagent (revert 591d8b35c881)
Mikael Berthe <mikael@lilotux.net>
parents:
1223
diff
changeset

288 p = getenv("GPG_AGENT_INFO"); 
80008fe2a4f2
Reenable gpgagent (revert 591d8b35c881)
Mikael Berthe <mikael@lilotux.net>
parents:
1223
diff
changeset

289 pgp_agent = (p && strchr(p, ':')); 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

290 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

291 pk = settings_opt_get("pgp_private_key"); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

292 pp = settings_opt_get("pgp_passphrase"); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

293 if (!pk) { 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

294 scr_LogPrint(LPRINT_LOGNORM, "WARNING: unkown PGP private key"); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

295 pgp_invalid = TRUE; 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

296 } else if (!(pp  pgp_agent)) { 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

297 // Request PGP passphrase 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

298 pp = typed_passwd = ask_password("PGP passphrase"); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

299 } 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

300 gpg_init(pk, pp); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

301 // Erase password from the settings array 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

302 if (pp) { 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

303 memset((char*)pp, 0, strlen(pp)); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

304 if (typed_passwd) 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

305 g_free(typed_passwd); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

306 else 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

307 settings_set(SETTINGS_TYPE_OPTION, "pgp_passphrase", NULL); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

308 } 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

309 if (!pgp_agent && pk && pp && gpg_test_passphrase()) { 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

310 // Let's check the pasphrase 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

311 int i; 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

312 for (i = 0; i < 2; i++) { 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

313 typed_passwd = ask_password("PGP passphrase"); // Ask again... 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

314 if (typed_passwd) { 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

315 gpg_set_passphrase(typed_passwd); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

316 memset(typed_passwd, 0, strlen(typed_passwd)); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

317 g_free(typed_passwd); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

318 } 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

319 if (!gpg_test_passphrase()) 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

320 break; // Ok 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

321 } 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

322 if (i == 2) 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

323 pgp_invalid = TRUE; 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

324 } 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

325 if (pgp_invalid) 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

326 scr_LogPrint(LPRINT_LOGNORM, "WARNING: PGP key/pass invalid"); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

327 #else /* not HAVE_GPGME */ 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

328 scr_LogPrint(LPRINT_LOGNORM, "WARNING: not compiled with PGP support"); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

329 #endif /* HAVE_GPGME */ 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

330 } 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

331 
24  332 int main(int argc, char **argv) 
333 {  
169  334 char *configFile = NULL; 
281
f562b9af2de7
Add "const" specifier in prototypes
Mikael Berthe <mikael@lilotux.net>
parents:
279
diff
changeset

335 const char *optstring; 
177  336 int optval, optval2; 
24  337 unsigned int ping; 
333
db5bebe96c89
New config. file parsing
Mikael Berthe <mikael@lilotux.net>
parents:
322
diff
changeset

338 int ret; 
761
4532a9fe0e8c
Handle some keyboard escape sequences
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset

339 keycode kcode; 
24  340 
341 credits();  
342  
343 signal(SIGTERM, sig_handler);  
312
f0b7ff2df7e8
CtrlC does not terminate mcabber
Mikael Berthe <mikael@lilotux.net>
parents:
307
diff
changeset

344 signal(SIGINT, sig_handler); 
163  345 signal(SIGCHLD, sig_handler); 
413  346 signal(SIGPIPE, SIG_IGN); 
24  347 
77  348 /* Parse command line options */ 
24  349 while (1) { 
1259
c5c09f8f60b0
Change command line option v to V
Mikael Berthe <mikael@lilotux.net>
parents:
1257
diff
changeset

350 int c = getopt(argc, argv, "hVf:"); 
24  351 if (c == 1) { 
352 break;  
353 } else  
354 switch (c) {  
355 case 'h':  
1256
ea679e3598a9
Don't start when command line options are wrong
Mikael Berthe <mikael@lilotux.net>
parents:
1253
diff
changeset

356 case '?': 
1259
c5c09f8f60b0
Change command line option v to V
Mikael Berthe <mikael@lilotux.net>
parents:
1257
diff
changeset

357 printf("Usage: %s [hVf mcabberrc_file]\n\n", argv[0]); 
1256
ea679e3598a9
Don't start when command line options are wrong
Mikael Berthe <mikael@lilotux.net>
parents:
1253
diff
changeset

358 return (c == 'h' ? 0 : 1); 
1259
c5c09f8f60b0
Change command line option v to V
Mikael Berthe <mikael@lilotux.net>
parents:
1257
diff
changeset

359 case 'V': 
1257
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

360 compile_options(); 
05dc45e7c7bb
Add command line option v
Mikael Berthe <mikael@lilotux.net>
parents:
1256
diff
changeset

361 return 0; 
24  362 case 'f': 
1241  363 configFile = g_strdup(optarg); 
364 break;  
24  365 } 
366 }  
367  
1256
ea679e3598a9
Don't start when command line options are wrong
Mikael Berthe <mikael@lilotux.net>
parents:
1253
diff
changeset

368 if (optind < argc) { 
1259
c5c09f8f60b0
Change command line option v to V
Mikael Berthe <mikael@lilotux.net>
parents:
1257
diff
changeset

369 fprintf(stderr, "Usage: %s [hVf mcabberrc_file]\n\n", argv[0]); 
1256
ea679e3598a9
Don't start when command line options are wrong
Mikael Berthe <mikael@lilotux.net>
parents:
1253
diff
changeset

370 return 1; 
ea679e3598a9
Don't start when command line options are wrong
Mikael Berthe <mikael@lilotux.net>
parents:
1253
diff
changeset

371 } 
ea679e3598a9
Don't start when command line options are wrong
Mikael Berthe <mikael@lilotux.net>
parents:
1253
diff
changeset

372 
1176
547a8ca7c1a8
Move init_bindings() to screen.c, with a few updates
Mikael Berthe <mikael@lilotux.net>
parents:
1173
diff
changeset

373 /* Initialize command system, roster and default key bindings */ 
333
db5bebe96c89
New config. file parsing
Mikael Berthe <mikael@lilotux.net>
parents:
322
diff
changeset

374 cmd_init(); 
848
a9161d2dc414
Introduce special buffer stuff
Mikael Berthe <mikael@lilotux.net>
parents:
815
diff
changeset

375 roster_init(); 
1065
230dca34dbea
Extand pgp_data structure
Mikael Berthe <mikael@lilotux.net>
parents:
1058
diff
changeset

376 settings_init(); 
1176
547a8ca7c1a8
Move init_bindings() to screen.c, with a few updates
Mikael Berthe <mikael@lilotux.net>
parents:
1173
diff
changeset

377 scr_init_bindings(); 
779
057ffe7c43dc
Initialize locale charset earlier
Mikael Berthe <mikael@lilotux.net>
parents:
777
diff
changeset

378 /* Initialize charset */ 
057ffe7c43dc
Initialize locale charset earlier
Mikael Berthe <mikael@lilotux.net>
parents:
777
diff
changeset

379 scr_InitLocaleCharSet(); 
333
db5bebe96c89
New config. file parsing
Mikael Berthe <mikael@lilotux.net>
parents:
322
diff
changeset

380 
24  381 /* Parsing config file... */ 
1192  382 ret = cfg_read_file(configFile, TRUE); 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

383 /* free() configFile if it has been allocated during options parsing */ 
774
46304b773a44
Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents:
772
diff
changeset

384 g_free(configFile); 
333
db5bebe96c89
New config. file parsing
Mikael Berthe <mikael@lilotux.net>
parents:
322
diff
changeset

385 /* Leave if there was an error in the config. file */ 
872
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

386 if (ret == 2) 
333
db5bebe96c89
New config. file parsing
Mikael Berthe <mikael@lilotux.net>
parents:
322
diff
changeset

387 exit(EXIT_FAILURE); 
24  388 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

389 optstring = settings_opt_get("tracelog_file"); 
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

390 if (optstring) 
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

391 ut_InitDebug(settings_opt_get_int("tracelog_level"), optstring); 
138  392 
306
b2d11b11675f
Fix interactive password prompt
Mikael Berthe <mikael@lilotux.net>
parents:
300
diff
changeset

393 /* If no password is stored, we ask for it before entering 
872
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

394 ncurses mode  unless the username is unknown. */ 
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

395 if (settings_opt_get("username") && !settings_opt_get("password")) { 
855
cbeedd730b1b
Display username before asking for password
Mikael Berthe <mikael@lilotux.net>
parents:
851
diff
changeset

396 const char *p; 
1123  397 char *pwd; 
855
cbeedd730b1b
Display username before asking for password
Mikael Berthe <mikael@lilotux.net>
parents:
851
diff
changeset

398 p = settings_opt_get("server"); 
cbeedd730b1b
Display username before asking for password
Mikael Berthe <mikael@lilotux.net>
parents:
851
diff
changeset

399 if (p) 
cbeedd730b1b
Display username before asking for password
Mikael Berthe <mikael@lilotux.net>
parents:
851
diff
changeset

400 printf("Server: %s\n", p); 
cbeedd730b1b
Display username before asking for password
Mikael Berthe <mikael@lilotux.net>
parents:
851
diff
changeset

401 p = settings_opt_get("username"); 
cbeedd730b1b
Display username before asking for password
Mikael Berthe <mikael@lilotux.net>
parents:
851
diff
changeset

402 if (p) 
cbeedd730b1b
Display username before asking for password
Mikael Berthe <mikael@lilotux.net>
parents:
851
diff
changeset

403 printf("Username: %s\n", p); 
1123  404 
405 pwd = ask_password("Jabber password");  
406 settings_set(SETTINGS_TYPE_OPTION, "password", pwd);  
407 g_free(pwd);  
415
5692c3a13202
Display the server name/IP before asking for password
Mikael Berthe <mikael@lilotux.net>
parents:
413
diff
changeset

408 } 
24  409 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

410 /* Initialize PGP system 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

411 We do it before ncurses initialization because we may need to request 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

412 a passphrase. */ 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

413 if (settings_opt_get_int("pgp")) 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

414 main_init_pgp(); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

415 
24  416 /* Initialize NCurses */ 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

417 scr_LogPrint(LPRINT_DEBUG, "Initializing NCurses..."); 
24  418 scr_InitCurses(); 
151  419 scr_DrawMainWindow(TRUE); 
29  420 
279
f5dd437c057b
Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents:
272
diff
changeset

421 optval = (settings_opt_get_int("logging") > 0); 
f5dd437c057b
Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents:
272
diff
changeset

422 optval2 = (settings_opt_get_int("load_logs") > 0); 
177  423 if (optval  optval2) 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

424 hlog_enable(optval, settings_opt_get("logging_dir"), optval2); 
113  425 
1179  426 #ifdef HAVE_ASPELL_H 
427 /* Initialize aspell */  
428 if (settings_opt_get_int("aspell_enable")) {  
429 spellcheck_init();  
430 }  
431 #endif  
432  
279
f5dd437c057b
Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents:
272
diff
changeset

433 optstring = settings_opt_get("events_command"); 
f5dd437c057b
Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents:
272
diff
changeset

434 if (optstring) 
160  435 hk_ext_cmd_init(optstring); 
436  
112  437 ping = 40; 
279
f5dd437c057b
Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents:
272
diff
changeset

438 if (settings_opt_get("pinginterval")) 
f5dd437c057b
Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents:
272
diff
changeset

439 ping = (unsigned int) settings_opt_get_int("pinginterval"); 
112  440 jb_set_keepalive_delay(ping); 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

441 scr_LogPrint(LPRINT_DEBUG, "Ping interval established: %d secs", ping); 
24  442 
279
f5dd437c057b
Rewrite the settings system
Mikael Berthe <mikael@lilotux.net>
parents:
272
diff
changeset

443 if (settings_opt_get_int("hide_offline_buddies") > 0) 
120  444 buddylist_set_hide_offline_buddies(TRUE); 
87  445 
993
0759f4c7da68
Add option 'disable_chatstates'
Mikael Berthe <mikael@lilotux.net>
parents:
962
diff
changeset

446 chatstates_disabled = settings_opt_get_int("disable_chatstates"); 
0759f4c7da68
Add option 'disable_chatstates'
Mikael Berthe <mikael@lilotux.net>
parents:
962
diff
changeset

447 
872
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

448 if (ret < 0) { 
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

449 scr_LogPrint(LPRINT_NORMAL, "No configuration file has been found."); 
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

450 scr_ShowBuddyWindow(); 
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

451 } else { 
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

452 /* Connection */ 
306
b2d11b11675f
Fix interactive password prompt
Mikael Berthe <mikael@lilotux.net>
parents:
300
diff
changeset

453 mcabber_connect(); 
872
a0ddc43b421e
Don't stop when there is no configuration file
Mikael Berthe <mikael@lilotux.net>
parents:
855
diff
changeset

454 } 
298
35cda94e570d
Add /connect and /disconnect commands
Mikael Berthe <mikael@lilotux.net>
parents:
281
diff
changeset

455 
374
bd5638c21834
Improve logging system (traces)
Mikael Berthe <mikael@lilotux.net>
parents:
364
diff
changeset

456 scr_LogPrint(LPRINT_DEBUG, "Entering into main loop..."); 
112  457 
333
db5bebe96c89
New config. file parsing
Mikael Berthe <mikael@lilotux.net>
parents:
322
diff
changeset

458 for (ret = 0 ; ret != 255 ; ) { 
939
12fa2ae6445d
Get rid of "busywaiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents:
938
diff
changeset

459 scr_DoUpdate(); 
761
4532a9fe0e8c
Handle some keyboard escape sequences
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset

460 scr_Getch(&kcode); 
151  461 
939
12fa2ae6445d
Get rid of "busywaiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents:
938
diff
changeset

462 if (kcode.value != ERR) { 
761
4532a9fe0e8c
Handle some keyboard escape sequences
Mikael Berthe <mikael@lilotux.net>
parents:
699
diff
changeset

463 ret = process_key(kcode); 
939
12fa2ae6445d
Get rid of "busywaiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents:
938
diff
changeset

464 } else { 
322
da138cdebf04
Implement autoaway mode
Mikael Berthe <mikael@lilotux.net>
parents:
314
diff
changeset

465 scr_CheckAutoAway(FALSE); 
939
12fa2ae6445d
Get rid of "busywaiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents:
938
diff
changeset

466 
12fa2ae6445d
Get rid of "busywaiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents:
938
diff
changeset

467 if (update_roster) 
1241  468 scr_DrawRoster(); 
939
12fa2ae6445d
Get rid of "busywaiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents:
938
diff
changeset

469 
12fa2ae6445d
Get rid of "busywaiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents:
938
diff
changeset

470 jb_main(); 
152  471 } 
24  472 } 
473  
1307
6c116207ab2e
Work around segfault in otrl_userstate_free()
Mikael Berthe <mikael@lilotux.net>
parents:
1299
diff
changeset

474 scr_TerminateCurses(); 
1299
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

475 #ifdef HAVE_LIBOTR 
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

476 otr_terminate(); 
3b338a5c01fc
OTR support
Frank Zschockelt <mcabber_otr[at]freakysoft.de>
parents:
1259
diff
changeset

477 #endif 
35  478 jb_disconnect(); 
1042
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

479 #ifdef HAVE_GPGME 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

480 gpg_terminate(); 
8a395c2cafc4
Initial PGP support (decrypt)
Mikael Berthe <mikael@lilotux.net>
parents:
993
diff
changeset

481 #endif 
1179  482 #ifdef HAVE_ASPELL_H 
483 /* Deinitialize aspell */  
484 if (settings_opt_get_int("aspell_enable")) {  
485 spellcheck_deinit();  
486 }  
487 #endif  
24  488 
961
95659cf9ea1a
Display mcabber version in the status window
Mikael Berthe <mikael@lilotux.net>
parents:
955
diff
changeset

489 printf("\n\nThanks for using mcabber!\n"); 
24  490 
491 return 0;  
492 }  
576  493 
580  494 /* vim: set expandtab cindent cinoptions=>2\:2(0: For Vim users... */ 