- Timestamp:
- 2005-12-13T23:05:27Z (17 years ago)
- Branches:
- master
- Children:
- d3307e2
- Parents:
- a301379c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
storage.c
ra301379c rb73ac9c 38 38 } 39 39 40 st orage_t *storage_init(const char *name)40 static storage_t *storage_init_single(const char *name) 41 41 { 42 42 GList *gl; … … 58 58 } 59 59 60 GList *storage_init(const char *primary, char **migrate) 61 { 62 GList *ret = NULL; 63 int i; 64 storage_t *storage; 65 66 storage = storage_init_single(primary); 67 if (storage == NULL) 68 return NULL; 69 70 ret = g_list_append(ret, storage); 71 72 for (i = 0; migrate && migrate[i]; i++) { 73 storage = storage_init_single(migrate[i]); 74 75 if (storage) 76 ret = g_list_append(ret, storage); 77 } 78 79 return ret; 80 } 81 60 82 storage_status_t storage_check_pass (const char *nick, const char *password) 61 83 { 62 return global.storage->check_pass(nick, password); 84 GList *gl; 85 86 /* Loop until we don't get NO_SUCH_USER */ 87 88 for (gl = global.storage; gl; gl = gl->next) { 89 storage_t *st = gl->data; 90 storage_status_t status; 91 92 status = st->check_pass(nick, password); 93 if (status != STORAGE_NO_SUCH_USER) 94 return status; 95 } 96 97 return STORAGE_NO_SUCH_USER; 63 98 } 64 99 65 100 storage_status_t storage_load (const char *nick, const char *password, irc_t * irc) 66 101 { 67 return global.storage->load(nick, password, irc); 102 GList *gl; 103 104 /* Loop until we don't get NO_SUCH_USER */ 105 for (gl = global.storage; gl; gl = gl->next) { 106 storage_t *st = gl->data; 107 storage_status_t status; 108 109 status = st->load(nick, password, irc); 110 if (status == STORAGE_OK) { 111 irc_setpass(irc, password); 112 return status; 113 } 114 115 if (status != STORAGE_NO_SUCH_USER) 116 return status; 117 } 118 119 return STORAGE_NO_SUCH_USER; 68 120 } 69 121 70 122 storage_status_t storage_save (irc_t *irc, int overwrite) 71 123 { 72 return global.storage->save(irc, overwrite);124 return ((storage_t *)global.storage->data)->save(irc, overwrite); 73 125 } 74 126 75 127 storage_status_t storage_remove (const char *nick, const char *password) 76 128 { 77 return global.storage->remove(nick, password); 129 GList *gl; 130 storage_status_t ret = STORAGE_OK; 131 132 /* Remove this account from all storage backends. If this isn't 133 * done, the account will still be usable, it'd just be 134 * loaded from a different backend. */ 135 for (gl = global.storage; gl; gl = gl->next) { 136 storage_t *st = gl->data; 137 storage_status_t status; 138 139 status = st->remove(nick, password); 140 if (status != STORAGE_NO_SUCH_USER && 141 status != STORAGE_OK) 142 ret = status; 143 } 144 145 return ret; 78 146 } 79 147 80 148 storage_status_t storage_rename (const char *onick, const char *nnick, const char *password) 81 149 { 82 return global.storage->rename(onick, nnick, password); 150 storage_status_t status; 151 GList *gl = global.storage; 152 storage_t *primary_storage = gl->data; 153 irc_t *irc; 154 155 /* First, try to rename in the current write backend, assuming onick 156 * is stored there */ 157 status = primary_storage->rename(onick, nnick, password); 158 if (status != STORAGE_NO_SUCH_USER) 159 return status; 160 161 /* Try to load from a migration backend and save to the current backend. 162 * Explicitly remove the account from the migration backend as otherwise 163 * it'd still be usable under the old name */ 164 165 irc = g_new0(irc_t, 1); 166 status = storage_load(onick, password, irc); 167 if (status != STORAGE_OK) { 168 irc_free(irc); 169 return status; 170 } 171 172 g_free(irc->nick); 173 irc->nick = g_strdup(nnick); 174 175 status = storage_save(irc, FALSE); 176 if (status != STORAGE_OK) { 177 irc_free(irc); 178 return status; 179 } 180 irc_free(irc); 181 182 storage_remove(onick, password); 183 184 return STORAGE_OK; 83 185 }
Note: See TracChangeset
for help on using the changeset viewer.