ReactOS 0.4.15-dev-8131-g4988de4
parallel.c
Go to the documentation of this file.
1/* -*- c-basic-offset: 8 -*-
2 rdesktop: A Remote Desktop Protocol client.
3 Copyright (C) Matthew Chapman 1999-2005
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*/
19#define MAX_PARALLEL_DEVICES 1
20
21#define FILE_DEVICE_PARALLEL 0x22
22
23#define IOCTL_PAR_QUERY_RAW_DEVICE_ID 0x0c
24
25#include "rdesktop.h"
26#include <unistd.h>
27#include <fcntl.h>
28#include <sys/ioctl.h>
29#include <errno.h>
30
31#if defined(__linux__)
32#include <linux/lp.h>
33#endif
34
35/* Enumeration of devices from rdesktop.c */
36/* returns numer of units found and initialized. */
37/* optarg looks like ':LPT1=/dev/lp0' */
38/* when it arrives to this function. */
39int
41{
42 PARALLEL_DEVICE *ppar_info;
43
44 char *pos = optarg;
45 char *pos2;
46 int count = 0;
47
48 /* skip the first colon */
49 optarg++;
50 while ((pos = next_arg(optarg, ',')) && *id < RDPDR_MAX_DEVICES)
51 {
52 ppar_info = (PARALLEL_DEVICE *) xmalloc(sizeof(PARALLEL_DEVICE));
53
54 pos2 = next_arg(optarg, '=');
55 strcpy(This->rdpdr_device[*id].name, optarg);
56
57 toupper_str(This->rdpdr_device[*id].name);
58
59 This->rdpdr_device[*id].local_path = xmalloc(strlen(pos2) + 1);
60 strcpy(This->rdpdr_device[*id].local_path, pos2);
61 printf("PARALLEL %s to %s\n", optarg, pos2);
62
63 /* set device type */
64 This->rdpdr_device[*id].device_type = DEVICE_TYPE_PARALLEL;
65 This->rdpdr_device[*id].pdevice_data = (void *) ppar_info;
66 This->rdpdr_device[*id].handle = 0;
67 count++;
68 (*id)++;
69
70 optarg = pos;
71 }
72 return count;
73}
74
75static NTSTATUS
76parallel_create(RDPCLIENT * This, uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition,
77 uint32 flags, char *filename, NTHANDLE * handle)
78{
79 int parallel_fd;
80
81 parallel_fd = open(This->rdpdr_device[device_id].local_path, O_RDWR);
82 if (parallel_fd == -1)
83 {
84 perror("open");
86 }
87
88 /* all read and writes should be non blocking */
89 if (fcntl(parallel_fd, F_SETFL, O_NONBLOCK) == -1)
90 perror("fcntl");
91
92#if defined(LPABORT)
93 /* Retry on errors */
94 ioctl(parallel_fd, LPABORT, (int) 1);
95#endif
96
97 This->rdpdr_device[device_id].handle = parallel_fd;
98
99 *handle = parallel_fd;
100
101 return STATUS_SUCCESS;
102}
103
104static NTSTATUS
106{
108 if (i >= 0)
109 This->rdpdr_device[i].handle = 0;
110 close(handle);
111 return STATUS_SUCCESS;
112}
113
114static NTSTATUS
116{
118 return STATUS_SUCCESS;
119}
120
121static NTSTATUS
123{
124 int rc = STATUS_SUCCESS;
125
126 int n = write(handle, data, length);
127 if (n < 0)
128 {
129#if defined(LPGETSTATUS)
130 int status;
131#endif
132
133 *result = 0;
134 switch (errno)
135 {
136 case EAGAIN:
138 case ENOSPC:
140 case EIO:
142 default:
144 }
145#if defined(LPGETSTATUS)
146 if (ioctl(handle, LPGETSTATUS, &status) == 0)
147 {
148 /* coming soon: take care for the printer status */
149 printf("parallel_write: status = %d, errno = %d\n", status, errno);
150 }
151#endif
152 }
153 *result = n;
154 return rc;
155}
156
157static NTSTATUS
159{
160 if ((request >> 16) != FILE_DEVICE_PARALLEL)
162
163 /* extract operation */
164 request >>= 2;
165 request &= 0xfff;
166
167 printf("PARALLEL IOCTL %d: ", request);
168
169 switch (request)
170 {
172
173 default:
174
175 printf("\n");
176 unimpl("UNKNOWN IOCTL %d\n", request);
177 }
178 return STATUS_SUCCESS;
179}
180
187};
#define EIO
Definition: acclib.h:81
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define EAGAIN
Definition: acclib.h:83
#define read
Definition: acwin.h:96
#define open
Definition: acwin.h:95
#define close
Definition: acwin.h:98
#define write
Definition: acwin.h:97
LONG NTSTATUS
Definition: precomp.h:26
#define RDPDR_MAX_DEVICES
Definition: constants.h:484
#define DEVICE_TYPE_PARALLEL
Definition: constants.h:486
char * next_arg(char *src, char needle)
Definition: rdesktop.c:1174
int get_device_index(RD_NTHANDLE handle)
void unimpl(char *format,...)
Definition: uimain.c:801
void toupper_str(char *p)
Definition: rdesktop.c:1223
void * xmalloc(int size)
Definition: uimain.c:747
unsigned int uint32
Definition: types.h:32
unsigned char uint8
Definition: types.h:28
const char * optarg
Definition: getopt.c:49
#define ENOSPC
Definition: errno.h:34
#define LPGETSTATUS
Definition: parallel.h:63
#define LPABORT
Definition: parallel.h:57
#define printf
Definition: freeldr.h:97
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble n
Definition: glext.h:7729
GLuint in
Definition: glext.h:9616
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLuint GLint GLboolean GLint GLenum access
Definition: glext.h:7866
GLuint64EXT * result
Definition: glext.h:11304
GLuint id
Definition: glext.h:5910
GLintptr offset
Definition: glext.h:5920
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define O_RDWR
Definition: fcntl.h:36
_CRTIMP void __cdecl perror(_In_opt_z_ const char *_ErrMsg)
const char * filename
Definition: ioapi.h:137
static NTSTATUS parallel_write(RDPCLIENT *This, NTHANDLE handle, uint8 *data, uint32 length, uint32 offset, uint32 *result)
Definition: parallel.c:122
static NTSTATUS parallel_read(RDPCLIENT *This, NTHANDLE handle, uint8 *data, uint32 length, uint32 offset, uint32 *result)
Definition: parallel.c:115
int parallel_enum_devices(RDPCLIENT *This, uint32 *id, char *optarg)
Definition: parallel.c:40
#define IOCTL_PAR_QUERY_RAW_DEVICE_ID
Definition: parallel.c:23
DEVICE_FNS parallel_fns
Definition: parallel.c:181
static NTSTATUS parallel_close(RDPCLIENT *This, NTHANDLE handle)
Definition: parallel.c:105
#define FILE_DEVICE_PARALLEL
Definition: parallel.c:21
static NTSTATUS parallel_create(RDPCLIENT *This, uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition, uint32 flags, char *filename, NTHANDLE *handle)
Definition: parallel.c:76
static NTSTATUS parallel_device_control(RDPCLIENT *This, NTHANDLE handle, uint32 request, STREAM in, STREAM out)
Definition: parallel.c:158
#define O_NONBLOCK
Definition: port.h:158
#define STATUS_DEVICE_POWERED_OFF
Definition: ntstatus.h:195
#define STATUS_DEVICE_PAPER_EMPTY
Definition: ntstatus.h:194
#define STATUS_DEVICE_OFF_LINE
Definition: ntstatus.h:196
static FILE * out
Definition: regtests2xml.c:44
#define errno
Definition: errno.h:18
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: tftpd.h:86
Definition: ps.c:97
Definition: parse.h:23
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define ioctl
Definition: wintirpc.h:60