FEATURES: Fix a typo and use uniform capitalization for list items.
[paraslash.git] / osl.c
diff --git a/osl.c b/osl.c
index 6294fbbe3f8900f3bf9830a30ccb8bfed150383a..2519228890bc2c25f1b82da6887585afe42840ae 100644 (file)
--- a/osl.c
+++ b/osl.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -179,7 +179,7 @@ int for_each_file_in_dir(const char *dirname,
        int cwd_fd, ret2, ret = para_opendir(dirname, &dir, &cwd_fd);
 
        if (ret < 0)
-               return ret == -E_CHDIR_PERM? 1 : ret;
+               return ret == -ERRNO_TO_PARA_ERROR(EACCES)? 1 : ret;
        /* scan cwd recursively */
        while ((entry = readdir(dir))) {
                mode_t m;
@@ -305,7 +305,7 @@ static int disk_storage_name_of_row(const struct osl_table *t,
 
 static void column_name_hash(const char *col_name, HASH_TYPE *hash)
 {
-       return hash_function(col_name, strlen(col_name), hash);
+       hash_function(col_name, strlen(col_name), hash);
 }
 
 static int init_column_descriptions(struct osl_table *t)
@@ -994,8 +994,14 @@ static void free_volatile_objects(const struct osl_table *t,
        for (n = rb_first(&rb_col->rbtree); n; n = rb_next(n)) {
                struct osl_row *r = get_row_pointer(n, rb_col->rbtree_num);
                if (flags & OSL_FREE_VOLATILE)
-                       for (j = 0; j < t->num_volatile_columns; j++)
-                               free(r->volatile_objects[j].data);
+                       FOR_EACH_VOLATILE_COLUMN(j, t, cd) {
+                               if (cd->storage_flags & OSL_DONT_FREE)
+                                       continue;
+                               free(r->volatile_objects[
+                                       t->columns[j].volatile_num].data);
+                       }
+//                     for (j = 0; j < t->num_volatile_columns; j++)
+//                             free(r->volatile_objects[j].data);
                free(r->volatile_objects);
        }
 }
@@ -1569,7 +1575,7 @@ int osl_del_row(struct osl_table *t, struct osl_row *row)
                        mark_mapped_object_invalid(t, r->num, i);
                        continue;
                }
-               if (st == OSL_NO_STORAGE)
+               if (st == OSL_NO_STORAGE && !(cd->storage_flags & OSL_DONT_FREE))
                        free(r->volatile_objects[col->volatile_num].data);
        }
        if (t->num_mapped_columns) {
@@ -2007,8 +2013,17 @@ int osl_get_nth_row(const struct osl_table *t, unsigned col_num,
 {
        struct osl_column *col;
        struct rb_node *node;
-       int ret = check_rbtree_col(t, col_num, &col);
+       unsigned num_rows;
+       int ret;
 
+       if (n == 0)
+               return -E_RB_KEY_NOT_FOUND;
+       ret = osl_get_num_rows(t, &num_rows);
+       if (ret < 0)
+               return ret;
+       if (n > num_rows)
+               return -E_RB_KEY_NOT_FOUND;
+       ret = check_rbtree_col(t, col_num, &col);
        if (ret < 0)
                return ret;
        node = rb_nth(col->rbtree.rb_node, n);