Mercurial > hg
comparison mcabber/main.c @ 0:b3b2332715fb
Tailorization of /trunk
Import of the upstream sources from
Repository: file:///tmp/svn-mcabber
Module: /trunk
Revision: 15
author | tailor@frmp8452 |
---|---|
date | Thu, 30 Jun 2005 21:39:31 +0000 |
parents | |
children | da1fb510081e |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:b3b2332715fb |
---|---|
1 #include <stdio.h> | |
2 #include <stdlib.h> | |
3 #include <unistd.h> | |
4 #include <string.h> | |
5 #include <signal.h> | |
6 #include <termios.h> | |
7 | |
8 #include "utils.h" | |
9 #include "screen.h" | |
10 #include "buddies.h" | |
11 #include "parsecfg.h" | |
12 #include "lang.h" | |
13 #include "server.h" | |
14 #include "harddefines.h" | |
15 #include "socket.h" | |
16 | |
17 int sock; | |
18 | |
19 void sig_handler(int signum) | |
20 { | |
21 switch (signum) { | |
22 case SIGALRM: | |
23 sk_send(sock, " "); | |
24 break; | |
25 | |
26 case SIGTERM: | |
27 bud_TerminateBuddies(); | |
28 scr_TerminateCurses(); | |
29 srv_setpresence(sock, "unavailable"); | |
30 close(sock); | |
31 printf("Killed by SIGTERM\nBye!\n"); | |
32 exit(EXIT_SUCCESS); | |
33 break; | |
34 | |
35 } | |
36 signal(SIGALRM, sig_handler); | |
37 } | |
38 | |
39 ssize_t my_getpass (char **passstr, size_t *n) | |
40 { | |
41 struct termios orig, new; | |
42 int nread; | |
43 | |
44 /* Turn echoing off and fail if we can't. */ | |
45 if (tcgetattr(fileno (stdin), &orig) != 0) | |
46 return -1; | |
47 new = orig; | |
48 new.c_lflag &= ~ECHO; | |
49 if (tcsetattr(fileno (stdin), TCSAFLUSH, &new) != 0) | |
50 return -1; | |
51 | |
52 /* Read the password. */ | |
53 nread = getline(passstr, n, stdin); | |
54 | |
55 /* Restore terminal. */ | |
56 (void) tcsetattr(fileno (stdin), TCSAFLUSH, &orig); | |
57 | |
58 return nread; | |
59 } | |
60 | |
61 void credits(void) | |
62 { | |
63 printf(VERSION "\n"); | |
64 printf(EMAIL "\n"); | |
65 } | |
66 | |
67 int main(int argc, char **argv) | |
68 { | |
69 int i; | |
70 char configFile[4096]; | |
71 char *buffer; | |
72 char *secbuffer; | |
73 char *username, *password, *resource; | |
74 char *servername; | |
75 char *idsession; | |
76 char *portstring; | |
77 int key; | |
78 unsigned int port; | |
79 unsigned int ping; | |
80 | |
81 | |
82 credits(); | |
83 | |
84 /* SET THIS >0 TO ENABLE LOG */ | |
85 ut_InitDebug(1); | |
86 | |
87 lng_InitLanguage(); | |
88 | |
89 ut_WriteLog("Setting signals handlers...\n"); | |
90 signal(SIGTERM, sig_handler); | |
91 signal(SIGALRM, sig_handler); | |
92 | |
93 | |
94 sprintf(configFile, "%s/.mcabberrc", getenv("HOME")); | |
95 | |
96 /* Proceso opciones de usuario */ | |
97 while (1) { | |
98 int c = getopt(argc, argv, "hf:"); | |
99 if (c == -1) { | |
100 break; | |
101 } else | |
102 switch (c) { | |
103 case 'h': | |
104 printf("Usage: %s [-f mcabberrc_file]\n\n", argv[0]); | |
105 printf("Thanks to AjMacias for cabber!\n\n"); | |
106 return 0; | |
107 case 'f': | |
108 strncpy(configFile, optarg, 1024); | |
109 break; | |
110 } | |
111 } | |
112 | |
113 ut_WriteLog("Setting config file: %s\n", configFile); | |
114 | |
115 | |
116 /* Parsing config file... */ | |
117 ut_WriteLog("Parsing config file...\n"); | |
118 cfg_file(configFile); | |
119 | |
120 servername = cfg_read("server"); | |
121 username = cfg_read("username"); | |
122 password = cfg_read("password"); | |
123 resource = cfg_read("resource"); | |
124 | |
125 if (!servername) { | |
126 printf("Server name has not been specified in the config file!\n"); | |
127 return -1; | |
128 } | |
129 if (!username) { | |
130 printf("User name has not been specified in the config file!\n"); | |
131 return -1; | |
132 } | |
133 if (!password) { | |
134 char *p; | |
135 size_t passsize = 64; | |
136 printf("Please enter password: "); | |
137 my_getpass(&password, &passsize); | |
138 printf("\n"); | |
139 for (p = password; *p; p++); | |
140 for ( ; p > password ; p--) | |
141 if (*p == '\n' || *p == '\r') *p = 0; | |
142 } | |
143 | |
144 /* Initialize N-Curses */ | |
145 ut_WriteLog("Initializing N-Curses...\n"); | |
146 scr_InitCurses(); | |
147 | |
148 /* Connect to server */ | |
149 portstring = cfg_read("port"); | |
150 port = (portstring != NULL) ? atoi(portstring) : -1; | |
151 | |
152 ut_WriteLog("Connecting to server: %s:%d\n", servername, port); | |
153 if ((sock = srv_connect(servername, port)) < 0) { | |
154 ut_WriteLog("\terror!!!\n"); | |
155 fprintf(stderr, "Error connecting to (%s)\n", servername); | |
156 scr_TerminateCurses(); | |
157 return -2; | |
158 } | |
159 | |
160 ut_WriteLog("Sending login string...\n"); | |
161 if ((idsession = srv_login(sock, servername, username, password, | |
162 resource)) == NULL) { | |
163 | |
164 ut_WriteLog("\terror!!!\n"); | |
165 fprintf(stderr, "Error sending login string...\n"); | |
166 scr_TerminateCurses(); | |
167 return -3; | |
168 } | |
169 ut_WriteLog("Connected to %s: %s\n", servername, idsession); | |
170 free(idsession); | |
171 | |
172 ut_WriteLog("Requesting roster...\n"); | |
173 bud_InitBuddies(sock); | |
174 | |
175 ut_WriteLog("Sending presence...\n"); | |
176 srv_setpresence(sock, "Online!"); | |
177 | |
178 | |
179 ut_WriteLog("Drawing main window...\n"); | |
180 scr_DrawMainWindow(); | |
181 | |
182 ping = 15; | |
183 if (cfg_read("pinginterval")) | |
184 ping = atoi(cfg_read("pinginterval")); | |
185 | |
186 ut_WriteLog("Ping interval stablished: %d secs\n", ping); | |
187 | |
188 ut_WriteLog("Entering into main loop...\n\n"); | |
189 ut_WriteLog("Ready to send/receive messages...\n"); | |
190 key = 0; | |
191 while (key != 'x') { | |
192 int x; | |
193 alarm(ping); | |
194 x = check_io(sock, 0); | |
195 if ((x & 1) == 1) { | |
196 srv_msg *incoming = readserver(sock); | |
197 | |
198 switch (incoming->m) { | |
199 case SM_PRESENCE: | |
200 bud_SetBuddyStatus(incoming->from, incoming->connected); | |
201 break; | |
202 | |
203 case SM_MESSAGE: | |
204 scr_WriteIncomingMessage(incoming->from, incoming->body); | |
205 free(incoming->body); | |
206 free(incoming->from); | |
207 break; | |
208 | |
209 case SM_UNHANDLED: | |
210 break; | |
211 } | |
212 free(incoming); | |
213 } | |
214 if ((x & 2) == 2) { | |
215 keypad(scr_GetRosterWindow(), TRUE); | |
216 key = scr_Getch(); | |
217 switch (key) { | |
218 case KEY_IC: | |
219 bud_AddBuddy(sock); | |
220 break; | |
221 case KEY_DC: | |
222 bud_DeleteBuddy(sock); | |
223 break; | |
224 case KEY_DOWN: | |
225 bud_RosterDown(); | |
226 break; | |
227 case KEY_UP: | |
228 bud_RosterUp(); | |
229 break; | |
230 | |
231 case 0x19a: | |
232 endwin(); | |
233 printf("\nRedimensionado no implementado\n"); | |
234 printf("Reinicie Cabber.\n\n\n"); | |
235 exit(EXIT_FAILURE); | |
236 break; | |
237 | |
238 case KEY_NPAGE: | |
239 for (i = 0; i < 10; i++) | |
240 bud_RosterDown(); | |
241 break; | |
242 | |
243 case KEY_PPAGE: | |
244 for (i = 0; i < 10; i++) | |
245 bud_RosterUp(); | |
246 break; | |
247 | |
248 case 'z': | |
249 case KEY_F(1): | |
250 buffer = (char *) calloc(1, 4096); | |
251 secbuffer = (char *) calloc(1, 4096); | |
252 | |
253 sprintf(secbuffer, "INS = %s ", i18n("Add contact")); | |
254 i = strlen(secbuffer); | |
255 strcpy(buffer, secbuffer); | |
256 sprintf(secbuffer, "DEL = %s ", i18n("Delete contact")); | |
257 strcat(buffer, secbuffer); | |
258 sprintf(secbuffer, "SPACE = %s ", i18n("View buddy window")); | |
259 strcat(buffer, secbuffer); | |
260 sprintf(secbuffer, "INTRO = %s ", i18n("Send message")); | |
261 strcat(buffer, secbuffer); | |
262 sprintf(secbuffer, "ESC = %s ", i18n("Exit")); | |
263 strcat(buffer, secbuffer); | |
264 | |
265 scr_CreatePopup(i18n("help"), buffer, i, 0, NULL); | |
266 free(buffer); | |
267 free(secbuffer); | |
268 break; | |
269 | |
270 case '\n': | |
271 scr_WriteMessage(sock); | |
272 break; | |
273 | |
274 case ' ': | |
275 scr_ShowBuddyWindow(); | |
276 break; | |
277 } | |
278 } | |
279 } | |
280 | |
281 bud_TerminateBuddies(); | |
282 scr_TerminateCurses(); | |
283 | |
284 srv_setpresence(sock, "unavailable"); | |
285 | |
286 close(sock); | |
287 | |
288 printf("\n\nHave a nice day!\nBye!\n"); | |
289 | |
290 return 0; | |
291 } |