/[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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 589 by n-ki, Thu Jan 29 12:24:15 2004 UTC revision 664 by astrand, Sat Apr 17 07:14:41 2004 UTC
# Line 7  Line 7 
7  #include "rdesktop.h"  #include "rdesktop.h"
8  #include <unistd.h>  #include <unistd.h>
9  #include <fcntl.h>  #include <fcntl.h>
10    #include <sys/ioctl.h>
11    #include <errno.h>
12    
13    #if defined(__linux__)
14    #include <linux/lp.h>
15    #endif
16    
17    extern int errno;
18    
19  extern RDPDR_DEVICE g_rdpdr_device[];  extern RDPDR_DEVICE g_rdpdr_device[];
20    
21  PARALLEL_DEVICE *  static PARALLEL_DEVICE *
22  get_parallel_data(HANDLE handle)  get_parallel_data(HANDLE handle)
23  {  {
24          int index;          int index;
# Line 29  get_parallel_data(HANDLE handle) Line 37  get_parallel_data(HANDLE handle)
37  /* optarg looks like ':LPT1=/dev/lp0'            */  /* optarg looks like ':LPT1=/dev/lp0'            */
38  /* when it arrives to this function.             */  /* when it arrives to this function.             */
39  int  int
40  parallel_enum_devices(int *id, char *optarg)  parallel_enum_devices(uint32 * id, char *optarg)
41  {  {
42          PARALLEL_DEVICE *ppar_info;          PARALLEL_DEVICE *ppar_info;
43    
# Line 55  parallel_enum_devices(int *id, char *opt Line 63  parallel_enum_devices(int *id, char *opt
63                  // set device type                  // set device type
64                  g_rdpdr_device[*id].device_type = DEVICE_TYPE_PARALLEL;                  g_rdpdr_device[*id].device_type = DEVICE_TYPE_PARALLEL;
65                  g_rdpdr_device[*id].pdevice_data = (void *) ppar_info;                  g_rdpdr_device[*id].pdevice_data = (void *) ppar_info;
66                    g_rdpdr_device[*id].handle = 0;
67                  count++;                  count++;
68                  (*id)++;                  (*id)++;
69    
# Line 64  parallel_enum_devices(int *id, char *opt Line 73  parallel_enum_devices(int *id, char *opt
73  }  }
74    
75  static NTSTATUS  static NTSTATUS
76  parallel_create(uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition, uint32 flags,  parallel_create(uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition,
77                 char *filename, HANDLE * handle)                  uint32 flags, char *filename, HANDLE * handle)
78  {  {
79          int parallel_fd;          int parallel_fd;
80    
81          parallel_fd = open(g_rdpdr_device[device_id].local_path, O_RDWR);          parallel_fd = open(g_rdpdr_device[device_id].local_path, O_RDWR);
82          if (parallel_fd == -1) {          if (parallel_fd == -1)
83            {
84                  perror("open");                  perror("open");
85                  return STATUS_ACCESS_DENIED;                  return STATUS_ACCESS_DENIED;
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          g_rdpdr_device[device_id].handle = parallel_fd;          g_rdpdr_device[device_id].handle = parallel_fd;
98    
99          *handle = parallel_fd;          *handle = parallel_fd;
100    
101          return STATUS_SUCCESS;          return STATUS_SUCCESS;
102  }  }
103    
104  static NTSTATUS  static NTSTATUS
105  parallel_close(HANDLE handle)  parallel_close(HANDLE handle)
106  {  {
107          g_rdpdr_device[get_device_index(handle)].handle = 0;          int i = get_device_index(handle);
108            if (i >= 0)
109                    g_rdpdr_device[i].handle = 0;
110          close(handle);          close(handle);
111          return STATUS_SUCCESS;          return STATUS_SUCCESS;
112  }  }
113    
114  NTSTATUS  static NTSTATUS
115  parallel_read(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)  parallel_read(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
116  {  {
117          *result = read(handle, data, length);          *result = read(handle, data, length);
# Line 99  parallel_read(HANDLE handle, uint8 * dat Line 121  parallel_read(HANDLE handle, uint8 * dat
121  static NTSTATUS  static NTSTATUS
122  parallel_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)  parallel_write(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
123  {  {
124          *result = write(handle, data, length);          int rc = STATUS_SUCCESS;
125          return STATUS_SUCCESS;  
126            int n = write(handle, data, length);
127            if (n < 0)
128            {
129                    int status;
130    
131                    *result = 0;
132                    switch (errno)
133                    {
134                            case EAGAIN:
135                                    rc = STATUS_DEVICE_OFF_LINE;
136                            case ENOSPC:
137                                    rc = STATUS_DEVICE_PAPER_EMPTY;
138                            case EIO:
139                                    rc = STATUS_DEVICE_OFF_LINE;
140                            default:
141                                    rc = STATUS_DEVICE_POWERED_OFF;
142                    }
143    #if defined(LPGETSTATUS)
144                    if (ioctl(handle, LPGETSTATUS, &status) == 0)
145                    {
146                            /* coming soon: take care for the printer status */
147                            printf("parallel_write: status = %d, errno = %d\n", status, errno);
148                    }
149    #endif
150            }
151            *result = n;
152            return rc;
153  }  }
154    
155  static NTSTATUS  static NTSTATUS

Legend:
Removed from v.589  
changed lines
  Added in v.664

  ViewVC Help
Powered by ViewVC 1.1.26