Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • storage_xml.c

    r5ebff60 r098a75b  
    103103        if (protocol) {
    104104                prpl = find_protocol(protocol);
     105                if (!prpl) {
     106                        irc_rootmsg(xd->irc, "Error loading user config: Protocol not found: `%s'", protocol);
     107                        return XT_ABORT;
     108                }
    105109                local = protocol_account_islocal(protocol);
    106110        }
     
    124128                }
    125129        } else {
     130                g_free(pass_cr);
     131                g_free(password);
    126132                return XT_ABORT;
    127133        }
     
    197203        fn = g_strconcat(global.conf->configdir, xd->given_nick, ".xml", NULL);
    198204        if ((fd = open(fn, O_RDONLY)) < 0) {
    199                 ret = STORAGE_NO_SUCH_USER;
     205                if (errno == ENOENT) {
     206                        ret = STORAGE_NO_SUCH_USER;
     207                } else {
     208                        irc_rootmsg(irc, "Error loading user config: %s", g_strerror(errno));
     209                }
    200210                goto error;
    201211        }
     
    259269
    260270
    261 static gboolean xml_generate_nick(gpointer key, gpointer value, gpointer data);
    262271static void xml_generate_settings(struct xt_node *cur, set_t **head);
    263272
     
    292301
    293302        for (acc = irc->b->accounts; acc; acc = acc->next) {
     303                GHashTableIter iter;
     304                gpointer key, value;
    294305                unsigned char *pass_cr;
    295306                char *pass_b64;
     
    312323                g_free(pass_b64);
    313324
    314                 /* This probably looks pretty strange. g_hash_table_foreach
    315                    is quite a PITA already (but it can't get much better in
    316                    C without using #define, I'm afraid), and it
    317                    doesn't seem to be possible to abort the foreach on write
    318                    errors, so instead let's use the _find function and
    319                    return TRUE on write errors. Which means, if we found
    320                    something, there was an error. :-) */
    321                 g_hash_table_find(acc->nicks, xml_generate_nick, cur);
     325                g_hash_table_iter_init(&iter, acc->nicks);
     326                while (g_hash_table_iter_next(&iter, &key, &value)) {
     327                        struct xt_node *node = xt_new_node("buddy", NULL, NULL);
     328                        xt_add_attr(node, "handle", key);
     329                        xt_add_attr(node, "nick", value);
     330                        xt_add_child(cur, node);
     331                }
    322332
    323333                xml_generate_settings(cur, &acc->set);
     
    343353
    344354        return root;
    345 }
    346 
    347 static gboolean xml_generate_nick(gpointer key, gpointer value, gpointer data)
    348 {
    349         struct xt_node *node = xt_new_node("buddy", NULL, NULL);
    350 
    351         xt_add_attr(node, "handle", key);
    352         xt_add_attr(node, "nick", value);
    353         xt_add_child((struct xt_node *) data, node);
    354 
    355         return FALSE;
    356355}
    357356
     
    388387        strcat(path, ".XXXXXX");
    389388        if ((fd = mkstemp(path)) < 0) {
    390                 irc_rootmsg(irc, "Error while opening configuration file.");
    391                 return STORAGE_OTHER_ERROR;
     389                goto error;
    392390        }
    393391
     
    411409
    412410error:
    413         irc_rootmsg(irc, "Write error. Disk full?");
     411        irc_rootmsg(irc, "Write error: %s", g_strerror(errno));
    414412        ret = STORAGE_OTHER_ERROR;
    415413
Note: See TracChangeset for help on using the changeset viewer.