rdesktop/parallel.c

127 lines
2.5 KiB
C
Raw Normal View History

#define MAX_PARALLEL_DEVICES 1
#define FILE_DEVICE_PARALLEL 0x22
#define IOCTL_PAR_QUERY_RAW_DEVICE_ID 0x0c
#define PARALLELDEV0 "/dev/lp0"
#include "rdesktop.h"
#include <unistd.h>
#include <fcntl.h>
extern RDPDR_DEVICE g_rdpdr_device[];
PARALLEL_DEVICE *
get_parallel_data(HANDLE handle)
{
int index;
for (index = 0; index < RDPDR_MAX_DEVICES; index++)
{
if (handle == g_rdpdr_device[index].handle)
return (PARALLEL_DEVICE *) g_rdpdr_device[index].pdevice_data;
}
return NULL;
}
/* Enumeration of devices from rdesktop.c */
/* returns numer of units found and initialized. */
/* optarg looks like ':LPT1=/dev/lp0' */
/* when it arrives to this function. */
int
parallel_enum_devices(int *id, char *optarg)
{
//TODO: Read from configuration file? CUPS?
PARALLEL_DEVICE *ppar_info;
char *pos = optarg;
char *pos2;
int count = 0;
// skip the first colon
optarg++;
while ((pos = next_arg(optarg, ',')) && *id < RDPDR_MAX_DEVICES)
{
ppar_info = (PARALLEL_DEVICE *) xmalloc(sizeof(PARALLEL_DEVICE));
pos2 = next_arg(optarg, '=');
strcpy(g_rdpdr_device[*id].name, optarg);
toupper_str(g_rdpdr_device[*id].name);
g_rdpdr_device[*id].local_path = xmalloc(strlen(pos2) + 1);
strcpy(g_rdpdr_device[*id].local_path, pos2);
printf("PARALLEL %s to %s\n", optarg, pos2);
// set device type
g_rdpdr_device[*id].device_type = DEVICE_TYPE_PARALLEL;
g_rdpdr_device[*id].pdevice_data = (void *) ppar_info;
count++;
(*id)++;
optarg = pos;
}
return count;
}
static NTSTATUS
parallel_create(uint32 device_id, HANDLE * handle)
{
int parallel_fd;
parallel_fd = open(PARALLELDEV0, O_WRONLY);
if (parallel_fd == -1)
return STATUS_ACCESS_DENIED;
*handle = parallel_fd;
return STATUS_SUCCESS;
}
static NTSTATUS
parallel_close(HANDLE handle)
{
close(handle);
return STATUS_SUCCESS;
}
static NTSTATUS
parallel_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
{
*result = write(handle, data, length);
return STATUS_SUCCESS;
}
static NTSTATUS
parallel_device_control(HANDLE handle, uint32 request, STREAM in, STREAM out)
{
if ((request >> 16) != FILE_DEVICE_PARALLEL)
return STATUS_INVALID_PARAMETER;
/* extract operation */
request >>= 2;
request &= 0xfff;
printf("PARALLEL IOCTL %d: ", request);
switch (request)
{
case IOCTL_PAR_QUERY_RAW_DEVICE_ID:
default:
printf("\n");
unimpl("UNKNOWN IOCTL %d\n", request);
}
return STATUS_SUCCESS;
}
DEVICE_FNS parallel_fns = {
parallel_create,
parallel_close,
NULL,
parallel_write,
parallel_device_control
};