diff options
| author | erdgeist <> | 2010-08-27 13:16:42 +0000 |
|---|---|---|
| committer | erdgeist <> | 2010-08-27 13:16:42 +0000 |
| commit | 6eb716f8db302dcf51113a7f8c99c18ebcb6b07e (patch) | |
| tree | 2d00d190b2d8c5c483e70842d4ea88f91f454b39 | |
| parent | 6dac4efa6181e2696ea112c3f1826f529160ceef (diff) | |
Make config file parser more efficient, also don't force unencrypted connections to port 2323
| -rwxr-xr-x | vchat-client.c | 95 |
1 files changed, 29 insertions, 66 deletions
diff --git a/vchat-client.c b/vchat-client.c index b7f993c..d4caf31 100755 --- a/vchat-client.c +++ b/vchat-client.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * without even the implied warranty of merchantability or fitness for a | 10 | * without even the implied warranty of merchantability or fitness for a |
| 11 | * particular purpose. In no event shall the copyright holder be liable for | 11 | * particular purpose. In no event shall the copyright holder be liable for |
| 12 | * any direct, indirect, incidental or special damages arising in any way out | 12 | * any direct, indirect, incidental or special damages arising in any way out |
| 13 | * of the use of this software. | 13 | * of the use of this software. |
| 14 | * | 14 | * |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include <stdio.h> | 24 | #include <stdio.h> |
| 25 | #include <stdlib.h> | 25 | #include <stdlib.h> |
| 26 | #include <errno.h> | 26 | #include <errno.h> |
| 27 | #include <fcntl.h> | ||
| 28 | #include <signal.h> | 27 | #include <signal.h> |
| 29 | #include <readline/readline.h> | 28 | #include <readline/readline.h> |
| 30 | #ifndef NO_LOCALE | 29 | #ifndef NO_LOCALE |
| @@ -66,13 +65,13 @@ static void parsecfg(char *line) { | |||
| 66 | int bytes; | 65 | int bytes; |
| 67 | char *param=line; | 66 | char *param=line; |
| 68 | char *value=NULL; | 67 | char *value=NULL; |
| 69 | 68 | ||
| 70 | /* handle quotes value is empty, so we can use it */ | 69 | /* handle quotes value is empty, so we can use it */ |
| 71 | value = strchr(line,'#'); | 70 | value = strchr(line,'#'); |
| 72 | if (value) { /* the line contains a cute little quote */ | 71 | if (value) { /* the line contains a cute little quote */ |
| 73 | value[0]='\0'; /* ignore the rest of the line */ | 72 | value[0]='\0'; /* ignore the rest of the line */ |
| 74 | } | 73 | } |
| 75 | 74 | ||
| 76 | /* now split the line into two parts */ | 75 | /* now split the line into two parts */ |
| 77 | value = strchr(line,'='); | 76 | value = strchr(line,'='); |
| 78 | if (!value) return; /* exit if strchr fails */ | 77 | if (!value) return; /* exit if strchr fails */ |
| @@ -86,11 +85,11 @@ static void parsecfg(char *line) { | |||
| 86 | while ((value[bytes-1] == ' ')||(value[bytes-1] == '\t')) { | 85 | while ((value[bytes-1] == ' ')||(value[bytes-1] == '\t')) { |
| 87 | value[bytes-1] = '\0'; | 86 | value[bytes-1] = '\0'; |
| 88 | bytes=strlen(value); | 87 | bytes=strlen(value); |
| 89 | } | 88 | } |
| 90 | /* bytes should be strlen(value) */ | 89 | /* bytes should be strlen(value) */ |
| 91 | if ( value[bytes-1] == '"' ) value[bytes-1] = '\0'; | 90 | if ( value[bytes-1] == '"' ) value[bytes-1] = '\0'; |
| 92 | if ( value[0] == '"' ) value++; | 91 | if ( value[0] == '"' ) value++; |
| 93 | 92 | ||
| 94 | /* "trim" param */ | 93 | /* "trim" param */ |
| 95 | while ((param[0] == ' ')||(param[0] == '\t')) | 94 | while ((param[0] == ' ')||(param[0] == '\t')) |
| 96 | param++; | 95 | param++; |
| @@ -102,9 +101,9 @@ static void parsecfg(char *line) { | |||
| 102 | /* bytes should be strlen(param) */ | 101 | /* bytes should be strlen(param) */ |
| 103 | if ( param[bytes-1] == '\"' ) param[bytes-1] = '\0'; | 102 | if ( param[bytes-1] == '\"' ) param[bytes-1] = '\0'; |
| 104 | if ( param[0] == '\"' ) param++; | 103 | if ( param[0] == '\"' ) param++; |
| 105 | 104 | ||
| 106 | if ((!param)||(!value)) return; /* failsave */ | 105 | if ((!param)||(!value)) return; /* failsave */ |
| 107 | 106 | ||
| 108 | //fprintf(stderr,"\"%s\" -> \"%s\"\n",param,value); | 107 | //fprintf(stderr,"\"%s\" -> \"%s\"\n",param,value); |
| 109 | setnoption(param,value); | 108 | setnoption(param,value); |
| 110 | } | 109 | } |
| @@ -174,63 +173,30 @@ static void parseknownhosts(char *line) { | |||
| 174 | void | 173 | void |
| 175 | loadcfg (char *file,void (*lineparser) (char *)) | 174 | loadcfg (char *file,void (*lineparser) (char *)) |
| 176 | { | 175 | { |
| 177 | int fd; | 176 | FILE *fh; |
| 178 | int bytes,bufoff=0; | ||
| 179 | char *tmp = NULL; | ||
| 180 | #define BUFSIZE 4096 | 177 | #define BUFSIZE 4096 |
| 181 | char buf[BUFSIZE]; /* data buffer */ | 178 | char buf[BUFSIZE]; /* data buffer */ |
| 182 | char *ltmp = buf; | 179 | char *tildex = NULL, *t; |
| 183 | char *tildex = NULL; | 180 | |
| 184 | buf[BUFSIZE-1] = '\0'; /* sanity stop */ | 181 | /* Check and expand filename then open file */ |
| 185 | |||
| 186 | if (!file) return; | 182 | if (!file) return; |
| 187 | if (!file[0]) return; | 183 | tildex = tilde_expand( file ); |
| 188 | if (file[0] == '~') | 184 | if (!tildex) return; |
| 189 | tildex = tilde_expand(file); | 185 | fh = fopen( tildex, "r" ); |
| 190 | else | 186 | free( tildex ); |
| 191 | tildex = file; | 187 | |
| 192 | fd = open(tildex,O_RDONLY); | 188 | if (!fh) { |
| 193 | if (fd == -1) { | 189 | snprintf (errstr, TMPSTRSIZE, "Can't open config-file \"%s\": %s.", file, strerror(errno)); |
| 194 | snprintf (errstr, TMPSTRSIZE, "Can't open config-file \"%s\": %s.", tildex, strerror(errno)); | 190 | return; |
| 195 | } else { | ||
| 196 | while ((bytes = read(fd,&buf[bufoff],BUFSIZE-bufoff-1))) { | ||
| 197 | if (bytes < 0) { | ||
| 198 | close(fd); | ||
| 199 | return; | ||
| 200 | } else { | ||
| 201 | /* terminate string */ | ||
| 202 | buf[bytes + bufoff] = '\0'; | ||
| 203 | /* as long as there are lines .. */ | ||
| 204 | while ((tmp = strchr (ltmp, '\n')) != NULL) { | ||
| 205 | /* did the server send CR+LF instead of LF with the last line? */ | ||
| 206 | if (tmp[-1] == '\r') | ||
| 207 | tmp[-1] = '\0'; | ||
| 208 | |||
| 209 | /* remove newline from previous message, advance pointer of next | ||
| 210 | * message */ | ||
| 211 | tmp[0] = '\0'; | ||
| 212 | tmp++; | ||
| 213 | |||
| 214 | /* we have a last message? give away to line handler! */ | ||
| 215 | if (ltmp[0]) | ||
| 216 | { | ||
| 217 | lineparser(ltmp); | ||
| 218 | } | ||
| 219 | |||
| 220 | /* move line along .. */ | ||
| 221 | ltmp = tmp; | ||
| 222 | } | ||
| 223 | /* buffer exhausted, move partial line to start of buffer and go | ||
| 224 | * on .. */ | ||
| 225 | bufoff = (bytes+bufoff) - (ltmp-buf); | ||
| 226 | if (bufoff > 0) | ||
| 227 | memmove (buf, ltmp, bufoff); | ||
| 228 | else | ||
| 229 | bufoff = 0; | ||
| 230 | } | ||
| 231 | } | ||
| 232 | close(fd); | ||
| 233 | } | 191 | } |
| 192 | |||
| 193 | while ( fgets( buf, sizeof(buf), fh ) ) { | ||
| 194 | if( ( t = strchr( buf, '\n' ) ) ) | ||
| 195 | *t = 0; | ||
| 196 | lineparser(buf); | ||
| 197 | } | ||
| 198 | |||
| 199 | fclose(fh); | ||
| 234 | } | 200 | } |
| 235 | 201 | ||
| 236 | void | 202 | void |
| @@ -463,7 +429,7 @@ void usage( char *name) { | |||
| 463 | printf ("usage: %s [-C config-file] [-F formats] [-l] [-z] [-s host] [-p port] [-c channel] [-n nickname]\n",name); | 429 | printf ("usage: %s [-C config-file] [-F formats] [-l] [-z] [-s host] [-p port] [-c channel] [-n nickname]\n",name); |
| 464 | puts (" -C load a second config-file, overriding the first one"); | 430 | puts (" -C load a second config-file, overriding the first one"); |
| 465 | puts (" -F load format strings (skins) from this file"); | 431 | puts (" -F load format strings (skins) from this file"); |
| 466 | puts (" -l local connect (no SSL + connects localhost:2323)"); | 432 | puts (" -l local connect (no SSL)"); |
| 467 | puts (" -z don't use certificate files"); | 433 | puts (" -z don't use certificate files"); |
| 468 | printf (" -s set server (default \"%s\")\n",getstroption(CF_SERVERHOST)); | 434 | printf (" -s set server (default \"%s\")\n",getstroption(CF_SERVERHOST)); |
| 469 | printf (" -p set port (default %s)\n",getstroption(CF_SERVERPORT)); | 435 | printf (" -p set port (default %s)\n",getstroption(CF_SERVERPORT)); |
| @@ -518,9 +484,6 @@ main (int argc, char **argv) | |||
| 518 | loadformats(GLOBAL_FORMAT_FILE); | 484 | loadformats(GLOBAL_FORMAT_FILE); |
| 519 | loadformats(getstroption (CF_FORMFILE)); | 485 | loadformats(getstroption (CF_FORMFILE)); |
| 520 | 486 | ||
| 521 | if ( !getintoption(CF_USESSL) && !strcmp(getstroption(CF_SERVERPORT),"2325")) | ||
| 522 | setstroption(CF_SERVERPORT,"2323"); | ||
| 523 | |||
| 524 | /* install signal handler */ | 487 | /* install signal handler */ |
| 525 | signal (SIGINT, cleanup); | 488 | signal (SIGINT, cleanup); |
| 526 | signal (SIGHUP, cleanup); | 489 | signal (SIGHUP, cleanup); |
