- Timestamp:
- Mar 4, 2014, 5:09:42 PM (11 years ago)
- Branches:
- master
- Children:
- b7bc432
- Parents:
- 8ef8c4e
- git-author:
- Mike Belopuhov <mike@…> (03/04/14 17:09:08)
- git-committer:
- Mike Belopuhov <mike@…> (03/04/14 17:09:42)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
icb.c
r8ef8c4e r626f420 1 1 /* 2 * Copyright (c) 2009, 2010, 2013 Mike Belopuhov2 * Copyright (c) 2009, 2010, 2013, 2014 Mike Belopuhov 3 3 * 4 4 * Permission to use, copy, modify, and distribute this software for any … … 23 23 #include <syslog.h> 24 24 #include <unistd.h> 25 #include <ctype.h> 25 26 #include <event.h> 26 27 … … 141 142 */ 142 143 void 143 icb_login(struct icb_session *is, char *gr oup, char *nick, char *client)144 icb_login(struct icb_session *is, char *grp, char *nick, char *client) 144 145 { 145 146 char *defgrp = "1"; 146 147 struct icb_group *ig; 147 148 struct icb_session *s; 148 149 if (!nick || strlen(nick) == 0) { 149 char group[ICB_MAXGRPLEN]; 150 151 if (!nick || strlen(nick) == 0 || 152 icb_vis(is->nick, nick, ICB_MAXNICKLEN)) { 150 153 icb_error(is, "Invalid nick"); 151 154 icb_drop(is, NULL); 152 155 return; 153 156 } 154 if (!group || strlen(group) == 0) 155 group = defgrp; 157 if (!grp || strlen(grp) == 0) 158 strlcpy(group, defgrp, ICB_MAXGRPLEN); 159 else 160 icb_vis(group, grp, ICB_MAXNICKLEN); 156 161 LIST_FOREACH(ig, &groups, entry) { 157 162 if (strcmp(ig->name, group) == 0) … … 169 174 } 170 175 icb_log(NULL, LOG_DEBUG, "%s created group %s", 171 nick, group);176 is->nick, group); 172 177 } 173 178 } 174 179 LIST_FOREACH(s, &ig->sess, entry) { 175 if (strcmp(s->nick, nick) == 0) {180 if (strcmp(s->nick, is->nick) == 0) { 176 181 icb_error(is, "Nick is already in use"); 177 182 icb_drop(is, NULL); … … 181 186 182 187 if (client && strlen(client) > 0) 183 strlcpy(is->client, client, sizeof is->client);188 icb_vis(is->client, client, sizeof is->client); 184 189 strlcpy(is->nick, nick, sizeof is->nick); 185 190 is->group = ig; … … 240 245 */ 241 246 void 242 icb_privmsg(struct icb_session *is, char * whom, char *msg)247 icb_privmsg(struct icb_session *is, char *to, char *msg) 243 248 { 244 249 struct icb_group *ig = is->group; 245 250 struct icb_session *s; 251 char whom[ICB_MAXNICKLEN]; 252 253 icb_vis(whom, to, ICB_MAXNICKLEN); 246 254 247 255 LIST_FOREACH(s, &ig->sess, entry) { … … 263 271 { 264 272 void (*handler)(struct icb_session *, char *); 265 266 if ((handler = icb_cmd_lookup(cmd)) == NULL) { 267 icb_error(is, "Unsupported command: %s", cmd); 273 char command[32]; /* XXX */ 274 275 icb_vis(command, cmd, sizeof command); 276 277 if ((handler = icb_cmd_lookup(command)) == NULL) { 278 icb_error(is, "Unsupported command: %s", command); 268 279 return; 269 280 } … … 510 521 * icb_ismod: checks whether group is moderated by "is" 511 522 */ 512 in t523 inline int 513 524 icb_ismod(struct icb_group *ig, struct icb_session *is) 514 525 { 515 if (ig->mod && ig->mod == is) 516 return (1); 517 return (0); 526 return (ig->mod == is); 518 527 } 519 528 … … 600 609 icb_send(is, buf, buflen + 1); 601 610 } 611 612 /* 613 * icb_vis: strnvis-like function that escapes percentages as well 614 */ 615 int 616 icb_vis(char *dst, const char *src, size_t dstsize) 617 { 618 int si = 0, di = 0, td; 619 620 while ((size_t)di < dstsize && src[si] != '\0') { 621 if (src[si] == '%') 622 dst[di++] = '%', dst[di] = '%'; 623 else if (isgraph(src[si])) 624 dst[di] = src[si]; 625 else { 626 td = snprintf(&dst[di], dstsize - di, 627 "\\%03o", (unsigned char)src[si]); 628 di += td - 1; 629 } 630 si++, di++; 631 } 632 dst[MIN((size_t)di, dstsize)] = '\0'; 633 return (0); 634 }
Note:
See TracChangeset
for help on using the changeset viewer.