diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2012-06-05 20:47:22 +0100 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2012-06-05 20:47:22 +0100 |
commit | d219296cacb644eccbbb8bbd58d02eaa89904c74 (patch) | |
tree | 862fa0eb6a2e6ffea7440595a90be70ba6912dae /storage_xml.c | |
parent | 00f1e936e59e563d7dac295bb7de524354920853 (diff) |
Small cleanup of xml_save().
Diffstat (limited to 'storage_xml.c')
-rw-r--r-- | storage_xml.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/storage_xml.c b/storage_xml.c index 87679422..29d31c25 100644 --- a/storage_xml.c +++ b/storage_xml.c @@ -173,7 +173,6 @@ static storage_status_t xml_load_real( irc_t *irc, const char *my_nick, const ch struct xt_parser *xp; struct xt_node *node; storage_status_t ret = STORAGE_OTHER_ERROR; - char *nick; xd->irc = irc; strncpy( xd->given_nick, my_nick, MAX_NICK_LENGTH ); @@ -245,7 +244,7 @@ static storage_status_t xml_check_pass( const char *my_nick, const char *passwor } -static gboolean xml_save_nick( gpointer key, gpointer value, gpointer data ); +static gboolean xml_generate_nick( gpointer key, gpointer value, gpointer data ); struct xt_node *xml_generate( irc_t *irc ) { @@ -319,7 +318,7 @@ struct xt_node *xml_generate( irc_t *irc ) errors, so instead let's use the _find function and return TRUE on write errors. Which means, if we found something, there was an error. :-) */ - g_hash_table_find( acc->nicks, xml_save_nick, cur ); + g_hash_table_find( acc->nicks, xml_generate_nick, cur ); xt_add_child( root, cur ); } @@ -351,13 +350,15 @@ struct xt_node *xml_generate( irc_t *irc ) static storage_status_t xml_save( irc_t *irc, int overwrite ) { - char path[512], *path2, *xml; - struct xt_node *tree; + storage_status_t ret = STORAGE_OK; + char path[512], *path2 = NULL, *xml = NULL; + struct xt_node *tree = NULL; + size_t len; int fd; path2 = g_strdup( irc->user->nick ); nick_lc( path2 ); - g_snprintf( path, sizeof( path ) - 2, "%s%s%s", global.conf->configdir, path2, ".xml" ); + g_snprintf( path, sizeof( path ) - 20, "%s%s%s", global.conf->configdir, path2, ".xml" ); g_free( path2 ); if( !overwrite && g_access( path, F_OK ) == 0 ) @@ -372,35 +373,36 @@ static storage_status_t xml_save( irc_t *irc, int overwrite ) tree = xml_generate( irc ); xml = xt_to_string( tree ); - write( fd, xml, strlen( xml ) ); - - fsync( fd ); - close( fd ); + len = strlen( xml ); + if( write( fd, xml, len ) != len || + fsync( fd ) != 0 || /* #559 */ + close( fd ) != 0 ) + goto error; path2 = g_strndup( path, strlen( path ) - 7 ); if( rename( path, path2 ) != 0 ) { - irc_rootmsg( irc, "Error while renaming temporary configuration file." ); - g_free( path2 ); - unlink( path ); - - return STORAGE_OTHER_ERROR; + goto error; } - g_free( path2 ); - return STORAGE_OK; + goto finish; -write_error: - +error: irc_rootmsg( irc, "Write error. Disk full?" ); + ret = STORAGE_OTHER_ERROR; + +finish: close( fd ); + unlink( path ); + g_free( xml ); + xt_free_node( tree ); - return STORAGE_OTHER_ERROR; + return ret; } -static gboolean xml_save_nick( gpointer key, gpointer value, gpointer data ) +static gboolean xml_generate_nick( gpointer key, gpointer value, gpointer data ) { struct xt_node *node = xt_new_node( "buddy", NULL, NULL ); xt_add_attr( node, "handle", key ); @@ -410,6 +412,7 @@ static gboolean xml_save_nick( gpointer key, gpointer value, gpointer data ) return FALSE; } + static storage_status_t xml_remove( const char *nick, const char *password ) { char s[512], *lc; |