src/irc_proto.c
author Tero Marttila <terom@fixme.fi>
Wed, 27 May 2009 23:57:48 +0300
branchnew-lib-errors
changeset 217 7728d6ec3abf
parent 149 549913bbe0d2
permissions -rw-r--r--
nexus.c compiles
39
a4891d71aca9 rename irc_nm to irc_proto, and move numerics from irc_cmd.h
Tero Marttila <terom@fixme.fi>
parents: 36
diff changeset
     1
#include "irc_proto.h"
36
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <string.h>
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
75
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
     5
err_t irc_nm_parse_buf (struct irc_nm *nm, char *prefix)
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
     6
{
149
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
     7
    const char *token;
75
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
     8
149
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
     9
    // parse the first token to determine if this is a nickmask or server name
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    10
    token = strsep(&prefix, "!");
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    11
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    12
    // did strsep find that "!"?
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    13
    if (prefix) {
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    14
        // it must be a full nickmask
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    15
        nm->nickname = token;
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    16
        nm->username = strsep(&prefix, "@");
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    17
        nm->hostname = prefix;
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    18
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    19
        if (!prefix)
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    20
            // something silly, didn't have an @token
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    21
            return ERR_INVALID_NM;
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    22
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    23
    } else {
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    24
        // handle as a server name
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    25
        nm->nickname = NULL;
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    26
        nm->username = NULL;
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    27
        nm->hostname = token;
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    28
549913bbe0d2 handle server-name prefixes as documented
Tero Marttila <terom@fixme.fi>
parents: 82
diff changeset
    29
    } 
75
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    30
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    31
    // ok
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    32
    return SUCCESS;
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    33
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    34
}
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    35
45
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    36
err_t irc_nm_parse (struct irc_nm *nm, char *buf, const char *prefix)
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    37
{
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    38
    // too long?
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    39
    if (strlen(prefix) >= IRC_PREFIX_MAX)
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    40
        return ERR_INVALID_NM;
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    41
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    42
    // copy to mutable buffer
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    43
    strcpy(buf, prefix);
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    44
    
75
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    45
    // parse from buf
ff6272398d2e change irc_line.prefix into a
Tero Marttila <terom@fixme.fi>
parents: 72
diff changeset
    46
    return irc_nm_parse_buf(nm, buf);
45
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    47
}
71e65564afd2 remove irc_chan.state, modify irc_chan_callbacks.on_msg to take a irc_nm, improve error handling a bit further (up to irc_net now)
Tero Marttila <terom@fixme.fi>
parents: 39
diff changeset
    48
36
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
/**
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
 * Compare two nicknames
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
 */
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
int irc_cmp_nick (const char *nick1, const char *nick2)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    // XXX: just use strcasecmp for now
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    return strcasecmp(nick1, nick2);
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
}
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
int irc_ncmp_nick (const char *nick1, const char *nick2, size_t n)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    // XXX: just use strncasecmp for now
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    return strncasecmp(nick1, nick2, n);
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
}
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
err_t irc_prefix_parse_nick (const char *prefix, char nick[IRC_NICK_MAX])
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    const char *bang;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    // find the !
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    if ((bang = strchr(prefix, '!')) == NULL)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
        return ERR_INVALID_NM;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    // too long?
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    if (bang - prefix > IRC_NICK_MAX - 1)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        return ERR_INVALID_NICK_LENGTH;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    // copy up to the !
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    memcpy(nick, prefix, bang - prefix);
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    // terminating NUL
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    nick[bang - prefix] = '\0';
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
    // ok
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    return SUCCESS;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
}
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
int irc_prefix_cmp_nick (const char *prefix, const char *nick)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
{
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    const char *bang;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    // find the !
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    if ((bang = strchr(prefix, '!')) == NULL)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        return -ERR_INVALID_NM;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    // compare up to that
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    if (irc_ncmp_nick(prefix, nick, (bang - prefix)) == 0)
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
        // match
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        return 0;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    else
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
        // doesn't match
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        return 1;
791d7a5532e2 add irc_prefix_* functions to parse nicknames (plus sketch out some irc_nickmask stuff)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
}
72
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   103
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   104
const char* irc_nick_chanflags (const char *nick, char chanflags[IRC_CHANFLAGS_MAX])
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   105
{
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   106
    char *cf = chanflags;
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   107
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   108
    // consume the chanflags, using strchr to look for the char in the set of chanflags...
82
bc767e01648d fix a valgrind'd bug with irc_nick_chanflags being given an empty string
Tero Marttila <terom@fixme.fi>
parents: 75
diff changeset
   109
    // XXX: error if nickname is empty...
bc767e01648d fix a valgrind'd bug with irc_nick_chanflags being given an empty string
Tero Marttila <terom@fixme.fi>
parents: 75
diff changeset
   110
    while (*nick && strchr(IRC_CHANFLAGS, *nick) && (cf < chanflags + IRC_CHANFLAGS_MAX - 1))
72
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   111
        *cf++ = *nick++;
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   112
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   113
    // NUL-terminate chanflags
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   114
    *cf = '\0';
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   115
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   116
    // then return the pointer to the first nickname char
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   117
    return nick;
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   118
}
43084f103c2a add irc_user module for irc_chan to track users on a channel
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   119