server: Use the lookup_name operation when creating a named object.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e2ccc978a3
commit
0458a7d0e3
|
@ -254,36 +254,7 @@ struct object *find_object_dir( struct directory *root, const struct unicode_str
|
||||||
void *create_named_object_dir( struct directory *root, const struct unicode_str *name,
|
void *create_named_object_dir( struct directory *root, const struct unicode_str *name,
|
||||||
unsigned int attributes, const struct object_ops *ops )
|
unsigned int attributes, const struct object_ops *ops )
|
||||||
{
|
{
|
||||||
struct object *obj, *new_obj = NULL;
|
return create_named_object( &root->obj, ops, name, attributes );
|
||||||
struct unicode_str new_name;
|
|
||||||
|
|
||||||
if (!name || !name->len)
|
|
||||||
{
|
|
||||||
if ((new_obj = alloc_object( ops ))) clear_error();
|
|
||||||
return new_obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(obj = find_object_dir( root, name, attributes, &new_name ))) return NULL;
|
|
||||||
if (!new_name.len)
|
|
||||||
{
|
|
||||||
if (attributes & OBJ_OPENIF && obj->ops == ops)
|
|
||||||
set_error( STATUS_OBJECT_NAME_EXISTS );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
release_object( obj );
|
|
||||||
obj = NULL;
|
|
||||||
if (attributes & OBJ_OPENIF)
|
|
||||||
set_error( STATUS_OBJECT_TYPE_MISMATCH );
|
|
||||||
else
|
|
||||||
set_error( STATUS_OBJECT_NAME_COLLISION );
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((new_obj = create_object( obj, ops, &new_name ))) clear_error();
|
|
||||||
|
|
||||||
release_object( obj );
|
|
||||||
return new_obj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* open a new handle to an existing object */
|
/* open a new handle to an existing object */
|
||||||
|
|
|
@ -282,18 +282,20 @@ void *create_object( struct object *parent, const struct object_ops *ops, const
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *create_named_object( struct object *parent, struct namespace *namespace, const struct object_ops *ops,
|
/* create an object as named child under the specified parent */
|
||||||
|
void *create_named_object( struct object *parent, const struct object_ops *ops,
|
||||||
const struct unicode_str *name, unsigned int attributes )
|
const struct unicode_str *name, unsigned int attributes )
|
||||||
{
|
{
|
||||||
struct object *obj;
|
struct object *obj, *new_obj;
|
||||||
|
struct unicode_str new_name;
|
||||||
|
|
||||||
if (!name || !name->len)
|
clear_error();
|
||||||
{
|
|
||||||
if ((obj = alloc_object( ops ))) clear_error();
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((obj = find_object( namespace, name, attributes )))
|
if (!name || !name->len) return alloc_object( ops );
|
||||||
|
|
||||||
|
if (!(obj = lookup_named_object( parent, name, attributes, &new_name ))) return NULL;
|
||||||
|
|
||||||
|
if (!new_name.len)
|
||||||
{
|
{
|
||||||
if (attributes & OBJ_OPENIF && obj->ops == ops)
|
if (attributes & OBJ_OPENIF && obj->ops == ops)
|
||||||
set_error( STATUS_OBJECT_NAME_EXISTS );
|
set_error( STATUS_OBJECT_NAME_EXISTS );
|
||||||
|
@ -308,8 +310,10 @@ void *create_named_object( struct object *parent, struct namespace *namespace, c
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
if ((obj = create_object( parent, ops, name ))) clear_error();
|
|
||||||
return obj;
|
new_obj = create_object( obj, ops, &new_name );
|
||||||
|
release_object( obj );
|
||||||
|
return new_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* recursive helper for dump_object_name */
|
/* recursive helper for dump_object_name */
|
||||||
|
|
|
@ -136,7 +136,7 @@ extern struct object *lookup_named_object( struct object *root, const struct uni
|
||||||
unsigned int attr, struct unicode_str *name_left );
|
unsigned int attr, struct unicode_str *name_left );
|
||||||
extern void *create_object( struct object *parent, const struct object_ops *ops,
|
extern void *create_object( struct object *parent, const struct object_ops *ops,
|
||||||
const struct unicode_str *name );
|
const struct unicode_str *name );
|
||||||
extern void *create_named_object( struct object *parent, struct namespace *namespace, const struct object_ops *ops,
|
extern void *create_named_object( struct object *parent, const struct object_ops *ops,
|
||||||
const struct unicode_str *name, unsigned int attributes );
|
const struct unicode_str *name, unsigned int attributes );
|
||||||
extern void unlink_named_object( struct object *obj );
|
extern void unlink_named_object( struct object *obj );
|
||||||
extern void make_object_static( struct object *obj );
|
extern void make_object_static( struct object *obj );
|
||||||
|
|
|
@ -217,7 +217,7 @@ static struct desktop *create_desktop( const struct unicode_str *name, unsigned
|
||||||
{
|
{
|
||||||
struct desktop *desktop;
|
struct desktop *desktop;
|
||||||
|
|
||||||
if ((desktop = create_named_object( &winstation->obj, winstation->desktop_names, &desktop_ops, name, attr )))
|
if ((desktop = create_named_object( &winstation->obj, &desktop_ops, name, attr )))
|
||||||
{
|
{
|
||||||
if (get_error() != STATUS_OBJECT_NAME_EXISTS)
|
if (get_error() != STATUS_OBJECT_NAME_EXISTS)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue