/[rdesktop]/sourceforge.net/trunk/rdesktop/parallel.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /sourceforge.net/trunk/rdesktop/parallel.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 592 - (show annotations)
Fri Jan 30 14:10:32 2004 UTC (20 years, 4 months ago) by n-ki
File MIME type: text/plain
File size: 3051 byte(s)
reworked the asyncio some and completed it. parallel and serial uses it now. disk.c is a likely candidate for the future, but there are some problems with disk.c that we will have to look into first. parallel and serial works better, they do not hang the session, but are still yerky at large chunks... possibly we could split the chunks, but the terminal server does not seem to like partial transfers, i've tried some variations.. :) fns->write() could be split in smaller pieces, but what should the thresholds be.

1 #define MAX_PARALLEL_DEVICES 1
2
3 #define FILE_DEVICE_PARALLEL 0x22
4
5 #define IOCTL_PAR_QUERY_RAW_DEVICE_ID 0x0c
6
7 #include "rdesktop.h"
8 #include <unistd.h>
9 #include <fcntl.h>
10
11 extern RDPDR_DEVICE g_rdpdr_device[];
12
13 PARALLEL_DEVICE *
14 get_parallel_data(HANDLE handle)
15 {
16 int index;
17
18 for (index = 0; index < RDPDR_MAX_DEVICES; index++)
19 {
20 if (handle == g_rdpdr_device[index].handle)
21 return (PARALLEL_DEVICE *) g_rdpdr_device[index].pdevice_data;
22 }
23 return NULL;
24 }
25
26
27 /* Enumeration of devices from rdesktop.c */
28 /* returns numer of units found and initialized. */
29 /* optarg looks like ':LPT1=/dev/lp0' */
30 /* when it arrives to this function. */
31 int
32 parallel_enum_devices(int *id, char *optarg)
33 {
34 PARALLEL_DEVICE *ppar_info;
35
36 char *pos = optarg;
37 char *pos2;
38 int count = 0;
39
40 // skip the first colon
41 optarg++;
42 while ((pos = next_arg(optarg, ',')) && *id < RDPDR_MAX_DEVICES)
43 {
44 ppar_info = (PARALLEL_DEVICE *) xmalloc(sizeof(PARALLEL_DEVICE));
45
46 pos2 = next_arg(optarg, '=');
47 strcpy(g_rdpdr_device[*id].name, optarg);
48
49 toupper_str(g_rdpdr_device[*id].name);
50
51 g_rdpdr_device[*id].local_path = xmalloc(strlen(pos2) + 1);
52 strcpy(g_rdpdr_device[*id].local_path, pos2);
53 printf("PARALLEL %s to %s\n", optarg, pos2);
54
55 // set device type
56 g_rdpdr_device[*id].device_type = DEVICE_TYPE_PARALLEL;
57 g_rdpdr_device[*id].pdevice_data = (void *) ppar_info;
58 count++;
59 (*id)++;
60
61 optarg = pos;
62 }
63 return count;
64 }
65
66 static NTSTATUS
67 parallel_create(uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition,
68 uint32 flags, char *filename, HANDLE * handle)
69 {
70 int parallel_fd;
71
72 parallel_fd = open(g_rdpdr_device[device_id].local_path, O_RDWR);
73 if (parallel_fd == -1)
74 {
75 perror("open");
76 return STATUS_ACCESS_DENIED;
77 }
78
79 g_rdpdr_device[device_id].handle = parallel_fd;
80
81 *handle = parallel_fd;
82
83 /* all read and writes should be non blocking */
84 if (fcntl(*handle, F_SETFL, O_NONBLOCK) == -1)
85 perror("fcntl");
86
87 return STATUS_SUCCESS;
88 }
89
90 static NTSTATUS
91 parallel_close(HANDLE handle)
92 {
93 g_rdpdr_device[get_device_index(handle)].handle = 0;
94 close(handle);
95 return STATUS_SUCCESS;
96 }
97
98 NTSTATUS
99 parallel_read(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
100 {
101 *result = read(handle, data, length);
102 return STATUS_SUCCESS;
103 }
104
105 static NTSTATUS
106 parallel_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
107 {
108 *result = write(handle, data, length);
109 return STATUS_SUCCESS;
110 }
111
112 static NTSTATUS
113 parallel_device_control(HANDLE handle, uint32 request, STREAM in, STREAM out)
114 {
115 if ((request >> 16) != FILE_DEVICE_PARALLEL)
116 return STATUS_INVALID_PARAMETER;
117
118 /* extract operation */
119 request >>= 2;
120 request &= 0xfff;
121
122 printf("PARALLEL IOCTL %d: ", request);
123
124 switch (request)
125 {
126 case IOCTL_PAR_QUERY_RAW_DEVICE_ID:
127
128 default:
129
130 printf("\n");
131 unimpl("UNKNOWN IOCTL %d\n", request);
132 }
133 return STATUS_SUCCESS;
134 }
135
136 DEVICE_FNS parallel_fns = {
137 parallel_create,
138 parallel_close,
139 parallel_read,
140 parallel_write,
141 parallel_device_control
142 };

  ViewVC Help
Powered by ViewVC 1.1.26