about summary refs log tree commit diff
path: root/user.c
diff options
context:
space:
mode:
Diffstat (limited to 'user.c')
-rw-r--r--user.c36
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;