diff options
Diffstat (limited to 'user.c')
| -rw-r--r-- | user.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/user.c b/user.c index f856f6c..8131c84 100644 --- a/user.c +++ b/user.c @@ -16,7 +16,9 @@ #include "ircd.h" +#include <errno.h> #include <stddef.h> +#include <stdlib.h> #include <string.h> #include <err.h> @@ -28,15 +30,47 @@ getnick(const struct Peer *peer) return *peer->nick ? peer->nick : "*"; } +enum PeerMode +user_mode(char m) +{ + switch (m) + { + case 'a': return AWAY; + case 'i': return INVISIBLE; + case 'w': return WALLOPS; + case 'r': return RESTRICTED; + case 'o': return OPER; + case 'O': return LOCALOPER; + case 's': return SNOTICE; + default: return 0; + } +} + void -user_reg(struct Peer *peer, const char *nick, const char *user, const char *real) +user_reg(struct Peer *peer, const char *nick, const char *user, const char *real, const char *mode) { + unsigned long m; + const char *p; + if (nick) strlcpy(peer->nick, nick, sizeof(peer->nick)); if (user) strlcpy(peer->user, user, sizeof(peer->user)); if (real) strlcpy(peer->real, real, sizeof(peer->real)); + if (mode) + { + errno = 0; + m = strtoul(mode, &p, 10); + if (errno || *p) + goto skip; + + if (m & 8) + peer->modes |= INVISIBLE; + if (m & 4) + peer->modes |= WALLOPS; + } +skip: if (*peer->nick && *peer->user && *peer->real) { peer->type = CLIENT; |