aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libssh/misc.h1
-rw-r--r--libssh/misc.c19
2 files changed, 20 insertions, 0 deletions
diff --git a/include/libssh/misc.h b/include/libssh/misc.h
index 3c33d0e1..35089d43 100644
--- a/include/libssh/misc.h
+++ b/include/libssh/misc.h
@@ -47,6 +47,7 @@ struct ssh_list *ssh_list_new(void);
void ssh_list_free(struct ssh_list *list);
struct ssh_iterator *ssh_list_get_iterator(const struct ssh_list *list);
int ssh_list_add(struct ssh_list *list, const void *data);
+int ssh_list_prepend(struct ssh_list *list, const void *data);
void ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator);
const void *_ssh_list_pop_head(struct ssh_list *list);
diff --git a/libssh/misc.c b/libssh/misc.c
index a86a163b..76f72a72 100644
--- a/libssh/misc.c
+++ b/libssh/misc.c
@@ -237,6 +237,25 @@ int ssh_list_add(struct ssh_list *list,const void *data){
return SSH_OK;
}
+int ssh_list_prepend(struct ssh_list *list, const void *data){
+ struct ssh_iterator *it = ssh_iterator_new(data);
+
+ if (it == NULL) {
+ return SSH_ERROR;
+ }
+
+ if (list->end == NULL) {
+ /* list is empty */
+ list->root = list->end = it;
+ } else {
+ /* set as new root */
+ it->next = list->root;
+ list->root = it;
+ }
+
+ return SSH_OK;
+}
+
void ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator){
struct ssh_iterator *ptr,*prev;
prev=NULL;