/[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 580 by astrand, Fri Jan 23 08:35:52 2004 UTC revision 632 by stargo, Fri Mar 5 09:36:49 2004 UTC
# Line 4  Line 4 
4    
5  #define IOCTL_PAR_QUERY_RAW_DEVICE_ID   0x0c  #define IOCTL_PAR_QUERY_RAW_DEVICE_ID   0x0c
6    
 #define PARALLELDEV0                    "/dev/lp0"  
   
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    
# Line 31  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  {  {
         //TODO: Read from configuration file? CUPS?  
42          PARALLEL_DEVICE *ppar_info;          PARALLEL_DEVICE *ppar_info;
43    
44          char *pos = optarg;          char *pos = optarg;
# Line 58  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 67  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, HANDLE * handle)  parallel_create(uint32 device_id, uint32 access, uint32 share_mode, uint32 disposition,
77                    uint32 flags, char *filename, HANDLE * handle)
78  {  {
79          int parallel_fd;          int parallel_fd;
80    
81          parallel_fd = open(PARALLELDEV0, O_WRONLY);          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");
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;
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            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
115    parallel_read(HANDLE handle, uint8 * data, uint32 length, uint32 offset, uint32 * result)
116    {
117            *result = read(handle, data, length);
118            return STATUS_SUCCESS;
119    }
120    
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
# Line 120  parallel_device_control(HANDLE handle, u Line 179  parallel_device_control(HANDLE handle, u
179  DEVICE_FNS parallel_fns = {  DEVICE_FNS parallel_fns = {
180          parallel_create,          parallel_create,
181          parallel_close,          parallel_close,
182          NULL,          parallel_read,
183          parallel_write,          parallel_write,
184          parallel_device_control          parallel_device_control
185  };  };

Legend:
Removed from v.580  
changed lines
  Added in v.632

  ViewVC Help
Powered by ViewVC 1.1.26