Hi Vitaliy,
This patch looks pretty good, but needs some finishing touches. Are you planning to continue the directory work to get objects to start supporting it?
Vitaliy Margolen wrote:
diff --git a/server/object.h b/server/object.h index 0c2ee1a..1154e0a 100644 --- a/server/object.h +++ b/server/object.h @@ -193,6 +193,11 @@ extern obj_handle_t open_object_dir( str extern void init_directories(void); extern void close_directories(void);
+/* sybmolic link functions */
+extern void init_syboliclinks(void); +extern void close_syboliclinks(void);
Multiple spelling mistakes.
/* global variables */
/* command-line options */
diff --git a/server/symlink.c b/server/symlink.c new file mode 100644 index 0000000..5a07df3 --- /dev/null +++ b/server/symlink.c @@ -0,0 +1,225 @@ +/*
- Server-side symbolic link object management
- Copyright (C) 2005 Vitaliy Margolen
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+#include "config.h" +#include "wine/port.h"
+#include <assert.h> +#include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h>
+#include "ntstatus.h" +#define WIN32_NO_STATUS +#include "winternl.h" +#include "ddk/wdm.h"
+#include "handle.h" +#include "request.h" +#include "object.h" +#include "unicode.h"
+struct syboliclink +{
- struct object obj; /* object header */
- struct unicode_str target; /* target of the symlink */
+};
Spelling mistake. In the server the name of the object struct typically mirrors the name of the file. So in this case it would be "struct symlink"
+static void syboliclink_dump( struct object *obj, int verbose ); +static struct object *symlink_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr );
+static void syboliclink_destroy( struct object *obj );
Spelling mistakes and lack of consistency with the naming. They should have the name of the object as a prefix: symlink_dump, symlink_lookup_name, symlink_destroy.
+struct syboliclink *create_syboliclink( struct directory *root, const struct unicode_str *name,
unsigned int attr, const struct unicode_str *target )
Spelling mistake again. Also, should match whatever name is decided for the name of the object.
+/* Global initialization */
+static struct syboliclink *link_dosdev, *link_global1, *link_global2, *link_local;
+void init_syboliclinks(void) +{
- static const WCHAR dir_globalW[] = {'\','?','?'};
- static const WCHAR dir_basenamedW[] = {'\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s'};
- static const struct unicode_str dir_global_str = {dir_globalW, sizeof(dir_globalW)};
- static const struct unicode_str dir_basenamed_str = {dir_basenamedW, sizeof(dir_basenamedW)};
- static const WCHAR link_dosdevW[] = {'\','D','o','s','D','e','v','i','c','e','s'};
- static const WCHAR link_global1W[] = {'\','?','?','\','G','l','o','b','a','l'};
- static const WCHAR link_global2W[] = {'\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\','G','l','o','b','a','l'};
- static const WCHAR link_localW[] = {'\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\','L','o','c','a','l'};
- static const struct unicode_str link_dosdev_str = {link_dosdevW, sizeof(link_dosdevW)};
- static const struct unicode_str link_global1_str = {link_global1W, sizeof(link_global1W)};
- static const struct unicode_str link_global2_str = {link_global2W, sizeof(link_global2W)};
- static const struct unicode_str link_local_str = {link_localW, sizeof(link_localW)};
- link_dosdev = create_syboliclink( NULL, &link_dosdev_str, 0, &dir_global_str );
- link_global1 = create_syboliclink( NULL, &link_global1_str, 0, &dir_global_str );
- link_global2 = create_syboliclink( NULL, &link_global2_str, 0, &dir_basenamed_str );
- link_local = create_syboliclink( NULL, &link_local_str, 0, &dir_basenamed_str );
+}
+void close_syboliclinks(void) +{
- release_object( link_dosdev );
- release_object( link_global1 );
- release_object( link_global2 );
- release_object( link_local );
+}
It would probably be nicer to have all of the namespace initialisation done in one place, e.g. directory.c That would mean exporting the create_symlink function, but then init_symboliclinks and close_symboliclinks would no longer have to be exported.
+/* create a symbolic link object */ +DECL_HANDLER(create_symlink) +{
- struct syboliclink *symlink;
- struct unicode_str name, target;
- struct directory *root = NULL;
- get_req_unicode_str( &name );
- target.str = name.str + req->symlink_name_len / sizeof(WCHAR);
- target.len = name.len - req->symlink_name_len;
- name.len = req->symlink_name_len;
- if (req->rootdir && !(root = get_directory_obj( current->process, req->rootdir, 0 )))
return;
Does NT really allow you to open a directory without having any specific access rights?
Tuesday, November 29, 2005, 4:47:47 PM, Robert Shearman wrote:
Hi Vitaliy,
This patch looks pretty good, but needs some finishing touches. Are you planning to continue the directory work to get objects to start supporting it?
Yes I do. It should be a straight forward for events, sections, mutants, semaphores and timers. But named pipes, mail slots and winstations with desktops will have to wait a bit. I'm not sure yet how to properly separate name spaces (you should not be able to create an event in the named pipe name space. And wise-versa).
Vitaliy Margolen wrote:
+struct syboliclink *create_syboliclink( struct directory *root, const struct unicode_str *name,
unsigned int attr, const struct unicode_str *target )
Spelling mistake again. Also, should match whatever name is decided for the name of the object.
Damn. How in the world did gcc compiled this then? With so many errors?! I don't know why didn't I see this before. Of course I will change it to "symlink".
+/* Global initialization */ +void init_syboliclinks(void) +{ +}
+void close_syboliclinks(void) +{ +}
It would probably be nicer to have all of the namespace initialisation done in one place, e.g. directory.c That would mean exporting the create_symlink function, but then init_symboliclinks and close_symboliclinks would no longer have to be exported.
Yup are you right. Done.
- if (req->rootdir && !(root = get_directory_obj(
current->process, req->rootdir, 0 )))
return;
Does NT really allow you to open a directory without having any specific access rights?
Yup. In the tests I'm opening directory with "directory query" rights only. And it works when I'm using it as the RootDirectory. Even when creating new objects in it.
Vitaliy