Author: vlendec Date: 2006-07-04 13:59:52 +0000 (Tue, 04 Jul 2006) New Revision: 16798
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=16798 Log: A couple of fixes Modified: branches/tmp/vl-messaging/source/lib/dbwrap_file.c Changeset: Modified: branches/tmp/vl-messaging/source/lib/dbwrap_file.c =================================================================== --- branches/tmp/vl-messaging/source/lib/dbwrap_file.c 2006-07-04 13:49:17 UTC (rev 16797) +++ branches/tmp/vl-messaging/source/lib/dbwrap_file.c 2006-07-04 13:59:52 UTC (rev 16798) @@ -53,7 +53,9 @@ struct db_locked_file *data = talloc_get_type_abort(p, struct db_locked_file); - data->parent->locked_record = NULL; + if (data->parent != NULL) { + data->parent->locked_record = NULL; + } if (close(data->fd) != 0) { DEBUG(3, ("close failed: %s\n", strerror(errno))); @@ -82,22 +84,21 @@ SMB_ASSERT(ctx->locked_record == NULL); again: - result = TALLOC_P(mem_ctx, struct db_record); - if (result == NULL) { + if (!(result = TALLOC_P(mem_ctx, struct db_record))) { DEBUG(0, ("talloc failed\n")); return NULL; } - result->private_data = file = TALLOC_P(result, struct db_locked_file); - result->store = db_file_store; - result->delete_rec = db_file_delete; - - if (file == NULL) { + if (!(file = TALLOC_P(result, struct db_locked_file))) { DEBUG(0, ("talloc failed\n")); TALLOC_FREE(result); return NULL; } + result->private_data = file; + result->store = db_file_store; + result->delete_rec = db_file_delete; + result->key.dsize = key.dsize; result->key.dptr = (char *)talloc_memdup(result, key.dptr, key.dsize); if (result->key.dptr == NULL) { @@ -194,23 +195,19 @@ return result; } -static int db_file_store(struct db_record *rec, TDB_DATA data, int flag) +static int db_file_store_root(int fd, TDB_DATA data) { - struct db_locked_file *file = - talloc_get_type_abort(rec->private_data, - struct db_locked_file); - - if (sys_lseek(file->fd, 0, SEEK_SET) != 0) { + if (sys_lseek(fd, 0, SEEK_SET) != 0) { DEBUG(0, ("sys_lseek failed: %s\n", strerror(errno))); return -1; } - if (write_data(file->fd, data.dptr, data.dsize) != data.dsize) { + if (write_data(fd, data.dptr, data.dsize) != data.dsize) { DEBUG(3, ("write_data failed: %s\n", strerror(errno))); return -1; } - if (sys_ftruncate(file->fd, data.dsize) != 0) { + if (sys_ftruncate(fd, data.dsize) != 0) { DEBUG(3, ("sys_ftruncate failed: %s\n", strerror(errno))); return -1; } @@ -218,6 +215,20 @@ return 0; } +static int db_file_store(struct db_record *rec, TDB_DATA data, int flag) +{ + struct db_locked_file *file = + talloc_get_type_abort(rec->private_data, + struct db_locked_file); + int ret; + + become_root(); + ret = db_file_store_root(file->fd, data); + unbecome_root(); + + return ret; +} + static int db_file_delete(struct db_record *rec) { struct db_locked_file *file = @@ -348,26 +359,26 @@ struct db_context *result = NULL; struct db_file_ctx *ctx; - result = TALLOC_P(mem_ctx, struct db_context); - if (result == NULL) { + if (!(result = TALLOC_P(mem_ctx, struct db_context))) { DEBUG(0, ("talloc failed\n")); - goto fail; + return NULL; } + if (!(ctx = TALLOC_P(result, struct db_file_ctx))) { + DEBUG(0, ("talloc failed\n")); + TALLOC_FREE(result); + return NULL; + } + + result->private_data = ctx; result->fetch_locked = db_file_fetch_locked; result->traverse = db_file_traverse; - result->private_data = ctx = TALLOC_P(result, struct db_file_ctx); - if (ctx == NULL) { - DEBUG(0, ("talloc failed\n")); - goto fail; - } - ctx->locked_record = NULL; - ctx->dirname = talloc_strdup(ctx, name); - if (ctx->dirname == NULL) { + if (!(ctx->dirname = talloc_strdup(ctx, name))) { DEBUG(0, ("talloc failed\n")); - goto fail; + TALLOC_FREE(result); + return NULL; } if (open_flags & O_CREAT) { @@ -381,7 +392,8 @@ if ((ret != 0) && (errno != EEXIST)) { DEBUG(5, ("mkdir(%s,%o) failed: %s\n", name, mode, strerror(errno))); - goto fail; + TALLOC_FREE(result); + return NULL; } for (i=0; i<256; i++) { @@ -389,23 +401,19 @@ path = talloc_asprintf(result, "%s/%2.2X", name, i); if (path == NULL) { DEBUG(0, ("asprintf failed\n")); - goto fail; + TALLOC_FREE(result); + return NULL; } ret = mkdir(path, mode); if ((ret != 0) && (errno != EEXIST)) { DEBUG(5, ("mkdir(%s,%o) failed: %s\n", path, mode, strerror(errno))); - goto fail; + TALLOC_FREE(result); + return NULL; } TALLOC_FREE(path); } } return result; - - fail: - if (result != NULL) { - TALLOC_FREE(result); - } - return NULL; }