zero handle at init.

better error handling
add paper status - volker milde


git-svn-id: svn://svn.code.sf.net/p/rdesktop/code/trunk/rdesktop@630 423420c4-83ab-492f-b58f-81f9feb106b5
This commit is contained in:
Peter Kallden 2004-03-05 06:48:08 +00:00
parent 1e75df64c2
commit 1b6ced7cf4

View File

@ -7,6 +7,11 @@
#include "rdesktop.h" #include "rdesktop.h"
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/lp.h>
#include <errno.h>
extern int errno;
extern RDPDR_DEVICE g_rdpdr_device[]; extern RDPDR_DEVICE g_rdpdr_device[];
@ -55,6 +60,7 @@ parallel_enum_devices(uint32 * id, char *optarg)
// set device type // set device type
g_rdpdr_device[*id].device_type = DEVICE_TYPE_PARALLEL; g_rdpdr_device[*id].device_type = DEVICE_TYPE_PARALLEL;
g_rdpdr_device[*id].pdevice_data = (void *) ppar_info; g_rdpdr_device[*id].pdevice_data = (void *) ppar_info;
g_rdpdr_device[*id].handle = 0;
count++; count++;
(*id)++; (*id)++;
@ -76,21 +82,25 @@ parallel_create(uint32 device_id, uint32 access, uint32 share_mode, uint32 dispo
return STATUS_ACCESS_DENIED; return STATUS_ACCESS_DENIED;
} }
/* all read and writes should be non blocking */
if (fcntl(parallel_fd, F_SETFL, O_NONBLOCK) == -1)
perror("fcntl");
ioctl(parallel_fd, LPABORT, (int) 1);
g_rdpdr_device[device_id].handle = parallel_fd; g_rdpdr_device[device_id].handle = parallel_fd;
*handle = parallel_fd; *handle = parallel_fd;
/* all read and writes should be non blocking */
if (fcntl(*handle, F_SETFL, O_NONBLOCK) == -1)
perror("fcntl");
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS static NTSTATUS
parallel_close(HANDLE handle) parallel_close(HANDLE handle)
{ {
g_rdpdr_device[get_device_index(handle)].handle = 0; int i = get_device_index(handle);
if (i >= 0)
g_rdpdr_device[i].handle = 0;
close(handle); close(handle);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -105,8 +115,33 @@ parallel_read(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32
static NTSTATUS static NTSTATUS
parallel_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result) parallel_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
{ {
*result = write(handle, data, length); int rc = STATUS_SUCCESS;
return STATUS_SUCCESS;
int n = write(handle, data, length);
if (n < 0)
{
int status;
*result = 0;
switch (errno)
{
case EAGAIN:
rc = STATUS_DEVICE_OFF_LINE;
case ENOSPC:
rc = STATUS_DEVICE_PAPER_EMPTY;
case EIO:
rc = STATUS_DEVICE_OFF_LINE;
default:
rc = STATUS_DEVICE_POWERED_OFF;
}
if (ioctl(handle, LPGETSTATUS, &status) == 0)
{
/* coming soon: take care for the printer status */
printf("parallel_write: status = %d, errno = %d\n", status, errno);
}
}
*result = n;
return rc;
} }
static NTSTATUS static NTSTATUS