/**
* A wrapper for lseek(2).
*
- * \param fd The filedescriptor whose offset is to be to repositioned.
+ * \param fd The file descriptor whose offset is to be to repositioned.
* \param offset A value-result parameter.
* \param whence Usual repositioning directive.
*
* \param buf The buffer to write.
* \param size The length of \a buf in bytes.
*
- * This function writes out the given bufffer and retries if an interrupt
- * occured during the write.
+ * This function writes out the given buffer and retries if an interrupt
+ * occurred during the write.
*
* \return On success, the number of bytes written is returned, otherwise, the
* function returns \p -E_WRITE.
* \param func The function to call for each entry.
* \param private_data Pointer to an arbitrary data structure.
*
- * For each regular file in \a dirname, the supplied function \a func is
+ * For each regular file under \a dirname, the supplied function \a func is
* called. The full path of the regular file and the \a private_data pointer
- * are passed to \a func.
+ * are passed to \a func. Directories for which the calling process has no
+ * permissions to change to are silently ignored.
*
* \return On success, 1 is returned. Otherwise, this function returns a
* negative value which indicates the kind of the error.
int cwd_fd, ret2, ret = para_opendir(dirname, &dir, &cwd_fd);
if (ret < 0)
- return ret;
+ return ret == -E_CHDIR_PERM? 1 : ret;
/* scan cwd recursively */
while ((entry = readdir(dir))) {
mode_t m;
* \param flags Options for what should be cleaned up.
*
* If osl_open_table() succeeds, the resulting table pointer must later be
- * passed to this function in order to flush all changes to the filesystem and
+ * passed to this function in order to flush all changes to the file system and
* to free the resources that were allocated by osl_open_table().
*
* \return Positive on success, negative on errors. Possible errors: \p E_BAD_TABLE,
* Lookup \a obj in \a t and return the row containing \a obj. The column
* specified by \a col_num must have an associated rbtree.
*
- * \return Positive on success, negative on errors. If an error occured, \a
+ * \return Positive on success, negative on errors. If an error occurred, \a
* result is set to \p NULL. Possible errors include: \p E_BAD_TABLE, \p
* E_BAD_STORAGE_FLAGS, errors returned by get_mapped_object(), \p
* E_RB_KEY_NOT_FOUND.
static int rbtree_loop(struct osl_column *col, void *private_data,
osl_rbtree_loop_func *func)
{
- struct rb_node *n;
+ struct rb_node *n, *tmp;
- for (n = rb_first(&col->rbtree); n; n = rb_next(n)) {
+ /* this for-loop is safe against removal of an entry */
+ for (n = rb_first(&col->rbtree), tmp = n? rb_next(n) : NULL;
+ n;
+ n = tmp, tmp = tmp? rb_next(tmp) : NULL) {
struct osl_row *r = get_row_pointer(n, col->rbtree_num);
int ret = func(r, private_data);
if (ret < 0)
static int rbtree_loop_reverse(struct osl_column *col, void *private_data,
osl_rbtree_loop_func *func)
{
- struct rb_node *n;
+ struct rb_node *n, *tmp;
- for (n = rb_last(&col->rbtree); n; n = rb_prev(n)) {
+ /* safe against removal of an entry */
+ for (n = rb_last(&col->rbtree), tmp = n? rb_prev(n) : NULL;
+ n;
+ n = tmp, tmp = tmp? rb_prev(tmp) : NULL) {
struct osl_row *r = get_row_pointer(n, col->rbtree_num);
int ret = func(r, private_data);
if (ret < 0)
* This function does an in-order walk of the rbtree associated with \a
* col_num. It is an error if the \p OSL_RBTREE flag is not set for this
* column. For each node in the rbtree, the given function \a func is called
- * with two \p void* pointers as arguments: The first argument points to the
+ * with two pointers as arguments: The first osl_row* argument points to the
* row that contains the object corresponding to the rbtree node currently
- * traversed, and the \a private_data pointer is passed to \a func as the
+ * traversed, and the \a private_data pointer is passed verbatim to \a func as the
* second argument. The loop terminates either if \a func returns a negative
* value, or if all nodes of the tree have been visited.
*
*
* This function gets rid of all references to the old object. This includes
* removal of the rbtree node in case there is an rbtree associated with \a
- * col_num. It then inserts \a obj into the table and the rbtree if neccessary.
+ * col_num. It then inserts \a obj into the table and the rbtree if necessary.
*
* If the \p OSL_RBTREE flag is set for \a col_num, you \b MUST call this
* function in order to change the contents of an object, even for volatile or