- Timestamp:
- 2005-12-13T23:21:21Z (18 years ago)
- Branches:
- master
- Children:
- 22bf64e
- Parents:
- ab4afba (diff), d3307e2 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
storage.c
rab4afba r6aaa221 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; … … 57 57 return st; 58 58 } 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 82 storage_status_t storage_check_pass (const char *nick, const char *password) 83 { 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; 98 } 99 100 storage_status_t storage_load (const char *nick, const char *password, irc_t * irc) 101 { 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; 120 } 121 122 storage_status_t storage_save (irc_t *irc, int overwrite) 123 { 124 return ((storage_t *)global.storage->data)->save(irc, overwrite); 125 } 126 127 storage_status_t storage_remove (const char *nick, const char *password) 128 { 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; 146 } 147 148 storage_status_t storage_rename (const char *onick, const char *nnick, const char *password) 149 { 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; 185 }
Note: See TracChangeset
for help on using the changeset viewer.