38 |
#include <sys/time.h> |
#include <sys/time.h> |
39 |
#include <dirent.h> /* opendir, closedir, readdir */ |
#include <dirent.h> /* opendir, closedir, readdir */ |
40 |
#include <time.h> |
#include <time.h> |
41 |
|
#include <errno.h> |
42 |
#include "rdesktop.h" |
#include "rdesktop.h" |
43 |
|
|
44 |
#define IRP_MJ_CREATE 0x00 |
#define IRP_MJ_CREATE 0x00 |
55 |
#define IRP_MN_QUERY_DIRECTORY 0x01 |
#define IRP_MN_QUERY_DIRECTORY 0x01 |
56 |
#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 |
#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 |
57 |
|
|
58 |
extern char hostname[16]; |
extern char g_hostname[16]; |
59 |
extern DEVICE_FNS serial_fns; |
extern DEVICE_FNS serial_fns; |
60 |
extern DEVICE_FNS printer_fns; |
extern DEVICE_FNS printer_fns; |
61 |
extern DEVICE_FNS parallel_fns; |
extern DEVICE_FNS parallel_fns; |
62 |
extern DEVICE_FNS disk_fns; |
extern DEVICE_FNS disk_fns; |
63 |
extern FILEINFO g_fileinfo[]; |
extern FILEINFO g_fileinfo[]; |
64 |
|
|
65 |
static VCHANNEL *rdpdr_channel; |
static VCHANNEL *rdpdr_channel; |
66 |
|
|
67 |
/* If select() times out, the request for the device with handle g_min_timeout_fd is aborted */ |
/* If select() times out, the request for the device with handle g_min_timeout_fd is aborted */ |
205 |
|
|
206 |
if (NULL == g_rdpdr_clientname) |
if (NULL == g_rdpdr_clientname) |
207 |
{ |
{ |
208 |
g_rdpdr_clientname = hostname; |
g_rdpdr_clientname = g_hostname; |
209 |
} |
} |
210 |
hostlen = (strlen(g_rdpdr_clientname) + 1) * 2; |
hostlen = (strlen(g_rdpdr_clientname) + 1) * 2; |
211 |
|
|
266 |
{ |
{ |
267 |
out_uint32_le(s, g_rdpdr_device[i].device_type); |
out_uint32_le(s, g_rdpdr_device[i].device_type); |
268 |
out_uint32_le(s, i); /* RDP Device ID */ |
out_uint32_le(s, i); /* RDP Device ID */ |
269 |
|
/* Is it possible to use share names longer than 8 chars? |
270 |
|
/astrand */ |
271 |
out_uint8p(s, g_rdpdr_device[i].name, 8); |
out_uint8p(s, g_rdpdr_device[i].name, 8); |
272 |
|
|
273 |
switch (g_rdpdr_device[i].device_type) |
switch (g_rdpdr_device[i].device_type) |
817 |
iorq = g_iorequest; |
iorq = g_iorequest; |
818 |
while (iorq != NULL) |
while (iorq != NULL) |
819 |
{ |
{ |
820 |
/* We need to test that the fd is still valid */ |
if (iorq->fd != 0) |
|
if ((iorq->fd != 0) && (read(iorq->fd, &c, 0) == 0)) |
|
821 |
{ |
{ |
822 |
switch (iorq->major) |
switch (iorq->major) |
823 |
{ |
{ |
824 |
case IRP_MJ_READ: |
case IRP_MJ_READ: |
825 |
|
/* Is this FD valid? FDs will |
826 |
|
be invalid when |
827 |
|
reconnecting. FIXME: Real |
828 |
|
support for reconnects. */ |
829 |
|
|
830 |
|
if ((read(iorq->fd, &c, 0) != 0) && (errno == EBADF)) |
831 |
|
break; |
832 |
|
|
833 |
FD_SET(iorq->fd, rfds); |
FD_SET(iorq->fd, rfds); |
834 |
|
*n = MAX(*n, iorq->fd); |
835 |
|
|
836 |
// Check if io request timeout is smaller than current (but not 0). |
// Check if io request timeout is smaller than current (but not 0). |
837 |
if (iorq->timeout |
if (iorq->timeout |
845 |
tv->tv_usec = (select_timeout % 1000) * 1000; |
tv->tv_usec = (select_timeout % 1000) * 1000; |
846 |
*timeout = True; |
*timeout = True; |
847 |
} |
} |
848 |
|
|
849 |
break; |
break; |
850 |
|
|
851 |
case IRP_MJ_WRITE: |
case IRP_MJ_WRITE: |
852 |
|
/* FD still valid? See above. */ |
853 |
|
if ((write(iorq->fd, &c, 0) != 0) && (errno == EBADF)) |
854 |
|
break; |
855 |
|
|
856 |
FD_SET(iorq->fd, wfds); |
FD_SET(iorq->fd, wfds); |
857 |
|
*n = MAX(*n, iorq->fd); |
858 |
break; |
break; |
859 |
|
|
860 |
} |
} |
861 |
*n = MAX(*n, iorq->fd); |
|
862 |
} |
} |
863 |
|
|
864 |
iorq = iorq->next; |
iorq = iorq->next; |