Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_netdrive.cc')
-rw-r--r--winsup/cygwin/fhandler_netdrive.cc271
1 files changed, 0 insertions, 271 deletions
diff --git a/winsup/cygwin/fhandler_netdrive.cc b/winsup/cygwin/fhandler_netdrive.cc
deleted file mode 100644
index 4665d2893..000000000
--- a/winsup/cygwin/fhandler_netdrive.cc
+++ /dev/null
@@ -1,271 +0,0 @@
-/* fhandler_netdrive.cc: fhandler for // and //MACHINE handling
-
- Copyright 2005 Red Hat, Inc.
-
-This file is part of Cygwin.
-
-This software is a copyrighted work licensed under the terms of the
-Cygwin license. Please consult the file "CYGWIN_LICENSE" for
-details. */
-
-#include "winsup.h"
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/cygwin.h>
-#include "cygerrno.h"
-#include "security.h"
-#include "path.h"
-#include "fhandler.h"
-#include "dtable.h"
-#include "cygheap.h"
-#include "sigproc.h"
-#include "cygthread.h"
-#include <assert.h>
-#include <winnetwk.h>
-
-#include <dirent.h>
-
-enum
- {
- GET_RESOURCE_INFO = 0,
- GET_RESOURCE_OPENENUM = 1,
- GET_RESOURCE_OPENENUMTOP = 2,
- GET_RESOURCE_ENUM = 3
- };
-
-struct netdriveinf
- {
- int what;
- int ret;
- PVOID in;
- PVOID out;
- DWORD outsize;
- HANDLE sem;
- };
-
-static DWORD WINAPI
-thread_netdrive (void *arg)
-{
- netdriveinf *ndi = (netdriveinf *) arg;
- LPTSTR dummy = NULL;
- LPNETRESOURCE nro, nro2;
- DWORD size;
- HANDLE enumhdl;
-
- ReleaseSemaphore (ndi->sem, 1, NULL);
- switch (ndi->what)
- {
- case GET_RESOURCE_INFO:
- nro = (LPNETRESOURCE) alloca (size = 4096);
- ndi->ret = WNetGetResourceInformation ((LPNETRESOURCE) ndi->in,
- nro, &size, &dummy);
- break;
- case GET_RESOURCE_OPENENUM:
- case GET_RESOURCE_OPENENUMTOP:
- nro = (LPNETRESOURCE) alloca (size = 4096);
- ndi->ret = WNetGetResourceInformation ((LPNETRESOURCE) ndi->in,
- nro, &size, &dummy);
- if (ndi->ret != NO_ERROR)
- break;
- if (ndi->what == GET_RESOURCE_OPENENUMTOP)
- {
- nro2 = nro;
- nro = (LPNETRESOURCE) alloca (size = 4096);
- ndi->ret = WNetGetResourceParent (nro2, nro, &size);
- if (ndi->ret != NO_ERROR)
- break;
- }
- ndi->ret = WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, nro,
- &enumhdl);
- if (ndi->ret == NO_ERROR)
- *(HANDLE *) ndi->out = enumhdl;
- break;
- case GET_RESOURCE_ENUM:
- ndi->ret = WNetEnumResource ((HANDLE) ndi->in, (size = 1, &size),
- (LPNETRESOURCE) ndi->out, &ndi->outsize);
- break;
- }
- ReleaseSemaphore (ndi->sem, 1, NULL);
- return 0;
-}
-
-static DWORD
-create_thread_and_wait (int what, PVOID in, PVOID out, DWORD outsize,
- const char *name)
-{
- netdriveinf ndi = { what, 0, in, out, outsize,
- CreateSemaphore (&sec_none_nih, 0, 2, NULL) };
- cygthread *thr = new cygthread (thread_netdrive, (LPVOID) &ndi, name);
- if (thr->detach (ndi.sem))
- ndi.ret = ERROR_OPERATION_ABORTED;
- CloseHandle (ndi.sem);
- return ndi.ret;
-}
-
-/* Returns 0 if path doesn't exist, >0 if path is a directory,
- -1 if path is a file, -2 if it's a symlink. */
-int
-fhandler_netdrive::exists ()
-{
- char *to;
- const char *from;
- size_t len = strlen (get_name ());
- if (len == 2)
- return 1;
- char namebuf[len + 1];
- for (to = namebuf, from = get_name (); *from; to++, from++)
- *to = (*from == '/') ? '\\' : *from;
- *to = '\0';
-
- NETRESOURCE nr = {0};
- nr.dwScope = RESOURCE_GLOBALNET;
- nr.dwType = RESOURCETYPE_DISK;
- nr.lpLocalName = NULL;
- nr.lpRemoteName = namebuf;
- DWORD ret = create_thread_and_wait (GET_RESOURCE_INFO, &nr, NULL, 0,
- "WNetGetResourceInformation");
- if (ret != ERROR_MORE_DATA && ret != NO_ERROR)
- return 0;
- return 1;
-}
-
-fhandler_netdrive::fhandler_netdrive ():
- fhandler_virtual ()
-{
-}
-
-int
-fhandler_netdrive::fstat (struct __stat64 *buf)
-{
- const char *path = get_name ();
- debug_printf ("fstat (%s)", path);
-
- fhandler_base::fstat (buf);
-
- buf->st_mode = S_IFDIR | STD_RBITS | STD_XBITS;
-
- return 0;
-}
-
-int
-fhandler_netdrive::readdir (DIR *dir, dirent *de)
-{
- DWORD size;
- NETRESOURCE *nro;
- DWORD ret;
- int res;
-
- if (!dir->__d_position)
- {
- size_t len = strlen (get_name ());
- char *namebuf;
- NETRESOURCE nr = { 0 };
-
- if (len == 2) /* // */
- {
- namebuf = (char *) alloca (MAX_COMPUTERNAME_LENGTH + 3);
- strcpy (namebuf, "\\\\");
- size = MAX_COMPUTERNAME_LENGTH + 1;
- if (!GetComputerName (namebuf + 2, &size))
- {
- res = geterrno_from_win_error ();
- goto out;
- }
- }
- else
- {
- const char *from;
- char *to;
- namebuf = (char *) alloca (len + 1);
- for (to = namebuf, from = get_name (); *from; to++, from++)
- *to = (*from == '/') ? '\\' : *from;
- *to = '\0';
- }
-
- nr.lpRemoteName = namebuf;
- nr.dwType = RESOURCETYPE_DISK;
- nro = (NETRESOURCE *) alloca (4096);
- ret = create_thread_and_wait (len == 2 ? GET_RESOURCE_OPENENUMTOP
- : GET_RESOURCE_OPENENUM,
- &nr, &dir->__handle, 0, "WNetOpenEnum");
- if (ret != NO_ERROR)
- {
- dir->__handle = INVALID_HANDLE_VALUE;
- res = geterrno_from_win_error (ret);
- goto out;
- }
- }
- ret = create_thread_and_wait (GET_RESOURCE_ENUM, dir->__handle,
- nro = (LPNETRESOURCE) alloca (16384),
- 16384, "WnetEnumResource");
- if (ret != NO_ERROR)
- res = geterrno_from_win_error (ret);
- else
- {
- dir->__d_position++;
- char *bs = strrchr (nro->lpRemoteName, '\\');
- strcpy (de->d_name, bs ? bs + 1 : nro->lpRemoteName);
- res = 0;
- }
-out:
- syscall_printf ("%d = readdir (%p, %p)", res, dir, de);
- return res;
-}
-
-void
-fhandler_netdrive::seekdir (DIR *dir, _off64_t pos)
-{
- rewinddir (dir);
- if (pos < 0)
- return;
- while (dir->__d_position < pos)
- if (!readdir (dir, dir->__d_dirent))
- break;
-}
-
-void
-fhandler_netdrive::rewinddir (DIR *dir)
-{
- if (dir->__handle != INVALID_HANDLE_VALUE)
- WNetCloseEnum (dir->__handle);
- dir->__handle = INVALID_HANDLE_VALUE;
- return fhandler_virtual::rewinddir (dir);
-}
-
-int
-fhandler_netdrive::closedir (DIR *dir)
-{
- rewinddir (dir);
- return fhandler_virtual::closedir (dir);
-}
-
-int
-fhandler_netdrive::open (int flags, mode_t mode)
-{
- int res = fhandler_virtual::open (flags, mode);
- if (!res)
- goto out;
-
- nohandle (true);
-
- if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
- {
- set_errno (EEXIST);
- res = 0;
- goto out;
- }
- else if (flags & O_WRONLY)
- {
- set_errno (EISDIR);
- res = 0;
- goto out;
- }
-
- res = 1;
- set_flags ((flags & ~O_TEXT) | O_BINARY | O_DIROPEN);
- set_open_status ();
-out:
- syscall_printf ("%d = fhandler_netdrive::open (%p, %d)", res, flags, mode);
- return res;
-}
-