blob = data_blob_const(data->dptr, data->dsize);
ndr_err = ndr_pull_struct_blob(
- &blob, result, result,
+ &blob, result, NULL, result,
(ndr_pull_flags_fn_t)ndr_pull_tdb_xattrs);
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
enum ndr_err_code ndr_err;
ndr_err = ndr_push_struct_blob(
- &blob, mem_ctx, attribs,
+ &blob, mem_ctx, NULL, attribs,
(ndr_push_flags_fn_t)ndr_push_tdb_xattrs);
if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
NTSTATUS status;
TDB_DATA data;
+ /* For backwards compatibility only store the dev/inode. */
push_file_id_16((char *)id_buf, id);
if (db_ctx->fetch(db_ctx, mem_ctx,
const struct file_id *id)
{
uint8 id_buf[16];
+
+ /* For backwards compatibility only store the dev/inode. */
push_file_id_16((char *)id_buf, id);
return db_ctx->fetch_locked(db_ctx, mem_ctx,
make_tdb_data(id_buf, sizeof(id_buf)));
return -1;
}
- for (i=0; i<attribs->num_xattrs; i++) {
- if (strcmp(attribs->xattrs[i].name, name) == 0) {
+ for (i=0; i<attribs->num_eas; i++) {
+ if (strcmp(attribs->eas[i].name, name) == 0) {
break;
}
}
- if (i == attribs->num_xattrs) {
+ if (i == attribs->num_eas) {
errno = ENOATTR;
goto fail;
}
- if (attribs->xattrs[i].value.length > size) {
+ if (attribs->eas[i].value.length > size) {
errno = ERANGE;
goto fail;
}
- memcpy(value, attribs->xattrs[i].value.data,
- attribs->xattrs[i].value.length);
- result = attribs->xattrs[i].value.length;
+ memcpy(value, attribs->eas[i].value.data,
+ attribs->eas[i].value.length);
+ result = attribs->eas[i].value.length;
fail:
TALLOC_FREE(attribs);
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
return xattr_tdb_getattr(db, &id, name, value, size);
}
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
return xattr_tdb_getattr(db, &id, name, value, size);
}
return -1;
}
- for (i=0; i<attribs->num_xattrs; i++) {
- if (strcmp(attribs->xattrs[i].name, name) == 0) {
+ for (i=0; i<attribs->num_eas; i++) {
+ if (strcmp(attribs->eas[i].name, name) == 0) {
if (flags & XATTR_CREATE) {
TALLOC_FREE(rec);
errno = EEXIST;
}
}
- if (i == attribs->num_xattrs) {
- struct tdb_xattr *tmp;
+ if (i == attribs->num_eas) {
+ struct xattr_EA *tmp;
if (flags & XATTR_REPLACE) {
TALLOC_FREE(rec);
}
tmp = TALLOC_REALLOC_ARRAY(
- attribs, attribs->xattrs, struct tdb_xattr,
- attribs->num_xattrs + 1);
+ attribs, attribs->eas, struct xattr_EA,
+ attribs->num_eas+ 1);
if (tmp == NULL) {
DEBUG(0, ("TALLOC_REALLOC_ARRAY failed\n"));
return -1;
}
- attribs->xattrs = tmp;
- attribs->num_xattrs += 1;
+ attribs->eas = tmp;
+ attribs->num_eas += 1;
}
- attribs->xattrs[i].name = name;
- attribs->xattrs[i].value.data = CONST_DISCARD(uint8 *, value);
- attribs->xattrs[i].value.length = size;
+ attribs->eas[i].name = name;
+ attribs->eas[i].value.data = CONST_DISCARD(uint8 *, value);
+ attribs->eas[i].value.length = size;
status = xattr_tdb_save_attrs(rec, attribs);
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
return xattr_tdb_setattr(db, &id, name, value, size, flags);
}
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
return xattr_tdb_setattr(db, &id, name, value, size, flags);
}
}
DEBUG(10, ("xattr_tdb_listattr: Found %d xattrs\n",
- attribs->num_xattrs));
+ attribs->num_eas));
- for (i=0; i<attribs->num_xattrs; i++) {
+ for (i=0; i<attribs->num_eas; i++) {
size_t tmp;
DEBUG(10, ("xattr_tdb_listattr: xattrs[i].name: %s\n",
- attribs->xattrs[i].name));
+ attribs->eas[i].name));
- tmp = strlen(attribs->xattrs[i].name);
+ tmp = strlen(attribs->eas[i].name);
/*
* Try to protect against overflow
len = 0;
- for (i=0; i<attribs->num_xattrs; i++) {
- strlcpy(list+len, attribs->xattrs[i].name,
+ for (i=0; i<attribs->num_eas; i++) {
+ strlcpy(list+len, attribs->eas[i].name,
size-len);
- len += (strlen(attribs->xattrs[i].name) + 1);
+ len += (strlen(attribs->eas[i].name) + 1);
}
TALLOC_FREE(attribs);
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
return xattr_tdb_listattr(db, &id, list, size);
}
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
return xattr_tdb_listattr(db, &id, list, size);
}
return -1;
}
- for (i=0; i<attribs->num_xattrs; i++) {
- if (strcmp(attribs->xattrs[i].name, name) == 0) {
+ for (i=0; i<attribs->num_eas; i++) {
+ if (strcmp(attribs->eas[i].name, name) == 0) {
break;
}
}
- if (i == attribs->num_xattrs) {
+ if (i == attribs->num_eas) {
TALLOC_FREE(rec);
errno = ENOATTR;
return -1;
}
- attribs->xattrs[i] =
- attribs->xattrs[attribs->num_xattrs-1];
- attribs->num_xattrs -= 1;
+ attribs->eas[i] =
+ attribs->eas[attribs->num_eas-1];
+ attribs->num_eas -= 1;
- if (attribs->num_xattrs == 0) {
+ if (attribs->num_eas == 0) {
rec->delete_rec(rec);
TALLOC_FREE(rec);
return 0;
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
return xattr_tdb_removeattr(db, &id, name);
}
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
return xattr_tdb_removeattr(db, &id, name);
}
{
struct db_context *db;
const char *dbname;
+ char *def_dbname;
- dbname = lp_parm_const_string(snum, "xattr", "tdb",
- lock_path("xattr.tdb"));
-
- if (dbname == NULL) {
+ def_dbname = state_path("xattr.tdb");
+ if (def_dbname == NULL) {
errno = ENOSYS;
return false;
}
+ dbname = lp_parm_const_string(snum, "xattr_tdb", "file", def_dbname);
+
+ /* now we know dbname is not NULL */
+
become_root();
db = db_open(NULL, dbname, 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
unbecome_root();
if (db == NULL) {
+#if defined(ENOTSUP)
errno = ENOTSUP;
+#else
+ errno = ENOSYS;
+#endif
+ TALLOC_FREE(def_dbname);
return false;
}
*p_db = db;
+ TALLOC_FREE(def_dbname);
return true;
}
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
rec = xattr_tdb_lock_attrs(talloc_tos(), db, &id);
return -1;
}
- id = SMB_VFS_FILE_ID_CREATE(handle->conn, sbuf.st_dev, sbuf.st_ino);
+ id = SMB_VFS_FILE_ID_CREATE(handle->conn, &sbuf);
rec = xattr_tdb_lock_attrs(talloc_tos(), db, &id);