Merge fix for logging of mode changes by charly.
[jelmer/ctrlproxy.git] / src / nickserv.c
index 14e1ef0e596cc00e408ebd7f29d9bca528a542b3..ff0f8e8fdc2b8fa9cd66fec7bc3b62c3fe974407 100644 (file)
 
 #include "ctrlproxy.h"
 #include <string.h>
-#include <unistd.h>
 #include <sys/stat.h>
+#include <glib/gstdio.h>
 #include <fcntl.h>
 #include <errno.h>
+#include <glib.h>
 #include "keyfile.h"
 #include "irc.h"
 
 #define NICKSERV_FILE_HEADER "# This file contains passwords for NickServ\n" \
-       "# It has the same format as the ppp secrets files.\n" \
        "# It should contain one entry per line, each entry consisting of: \n" \
        "# a nick name, password and network name, separated by tabs.\n" \
        "#\n"
@@ -42,7 +42,7 @@ const char *nickserv_find_nick(struct irc_network *n, const char *nick)
                        continue;
 
                if (!e->network) return e->pass;
-               if (!g_strcasecmp(e->network, n->info.name)) return e->pass;
+               if (!g_strcasecmp(e->network, n->name)) return e->pass;
        }
        
        return NULL;
@@ -60,7 +60,7 @@ void nickserv_identify_me(struct irc_network *network, char *nick)
        /* Don't try to identify if we're already identified */
        /* FIXME: Apparently, +e indicates being registered on Freenode,
         * +R is only used on OFTC */
-       if (network->state->me.modes['R']) 
+       if (network->external_state->me.modes['R']) 
                return;
        
        pass = nickserv_find_nick(network, nick);
@@ -69,11 +69,11 @@ void nickserv_identify_me(struct irc_network *network, char *nick)
                const char *nickserv_n = nickserv_nick(network);
                char *raw;
                raw = g_strdup_printf("IDENTIFY %s", pass);
-               network_log(LOG_INFO, network, "Sending password for %s", nickserv_n);
+               network_log(LOG_INFO, network, "Sending NickServ password for %s", nickserv_n);
                network_send_args(network, "PRIVMSG", nickserv_n, raw, NULL);
                g_free(raw);
        } else {
-               network_log(LOG_INFO, network, "No password known for `%s'", nick);
+               network_log(LOG_TRACE, network, "No NickServ password known for `%s'", nick);
        }
 }
 
@@ -88,12 +88,12 @@ static void cache_nickserv_pass(struct irc_network *n, const char *newpass)
        for (gl = n->global->nickserv_nicks; gl; gl = gl->next) {
                e = gl->data;
 
-               if (e->network && !g_strcasecmp(e->network, n->info.name) && 
-                       !g_strcasecmp(e->nick, n->state->me.nick)) {
+               if (e->network && !g_strcasecmp(e->network, n->name) && 
+                       !g_strcasecmp(e->nick, n->external_state->me.nick)) {
                        break;          
                }
 
-               if (!e->network && !g_strcasecmp(e->nick, n->state->me.nick) &&
+               if (!e->network && !g_strcasecmp(e->nick, n->external_state->me.nick) &&
                        !g_strcasecmp(e->pass, newpass)) {
                        break;
                }
@@ -101,18 +101,18 @@ static void cache_nickserv_pass(struct irc_network *n, const char *newpass)
 
        if (gl == NULL) {
                e = g_new0(struct keyfile_entry, 1);
-               e->nick = g_strdup(n->state->me.nick);
-               e->network = g_strdup(n->info.name);
+               e->nick = g_strdup(n->external_state->me.nick);
+               e->network = g_strdup(n->name);
                n->global->nickserv_nicks = g_list_prepend(n->global->nickserv_nicks, e);
        }
 
        if (e->pass == NULL || strcmp(e->pass, newpass) != 0) {
                e->pass = g_strdup(newpass);
-               network_log(LOG_INFO, n, "Caching password for nick %s", e->nick);
+               network_log(LOG_INFO, n, "Caching NickServ password for nick %s", e->nick);
        } 
 }
 
-static gboolean log_data(struct irc_network *n, const struct line *l, enum data_direction dir, void *userdata) 
+static gboolean log_data(struct irc_network *n, const struct irc_line *l, enum data_direction dir, void *userdata) 
 {
        static char *nickattempt = NULL;
 
@@ -164,9 +164,14 @@ gboolean nickserv_save(struct global *global, const char *dir)
     char *filename = g_build_filename(dir, "nickserv", NULL);
        gboolean ret;
 
-       if (global->nickserv_nicks == NULL)
-               unlink(filename);
-       else 
+       if (global->nickserv_nicks == NULL) {
+               if (g_unlink(filename) == 0)
+                       ret = TRUE;
+               else if (errno == ENOENT)
+                       ret = TRUE;
+               else
+                       ret = FALSE;
+       } else 
                ret = keyfile_write_file(global->nickserv_nicks, NICKSERV_FILE_HEADER, filename);
 
     g_free(filename);