File: pike2.pmod

package info (click to toggle)
ohcount 3.0.0-6.1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,828 kB
  • sloc: ansic: 6,534; ruby: 2,560; perl: 2,041; erlang: 350; lisp: 272; sh: 244; pascal: 196; vhdl: 150; haskell: 149; asm: 127; cs: 124; awk: 98; java: 92; php: 73; tcl: 58; xml: 57; fortran: 54; makefile: 32; python: 31; ada: 30; objc: 30; jsp: 28; sql: 18; cobol: 13; ml: 9; cpp: 3
file content (241 lines) | stat: -rw-r--r-- 8,069 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
pike	comment	//
pike	comment	// LPD.pmod: an implementation of the BSD lpd protocol (RFC 1179).
pike	comment	// This is a module for pike.
pike	comment	// 3 July 1998 <hww3@riverweb.com> Bill Welliver
pike	comment	//
pike	comment	// $Id: LPD.pmod,v 1.10 2008/01/13 17:02:43 nilsson Exp $
pike	comment	//
pike	blank	
pike	code	#pike __REAL_VERSION__
pike	blank	
pike	comment	//! A client for communicating with printers and print spoolers that
pike	comment	//! support the BSD lpd protocol (RFC 1179).
pike	code	class client {
pike	code	  string host;
pike	code	  int port;
pike	code	  private object conn;
pike	code	  int jobnum;
pike	code	  string jobtype;
pike	code	  string jobname;
pike	blank	
pike	code	  private int connect(string host, int port)
pike	code	  {
pike	code	    int a=random(10);
pike	comment	    // try to open one of the "official" local socket ports.
pike	comment	    // not having one doesn't seem to be a problem with most LPD 
pike	comment	    // servers, but we should at least try. will probably fail
pike	comment	    // if two try to open the same local port at once. ymmv.
pike	code	    int res=conn->open_socket(721 + a);
pike	blank	
pike	code	    return conn->connect(host, port);
pike	code	  }
pike	blank	
pike	comment	//! @decl int set_job_type(string type)
pike	comment	//! Set the type of job to be sent to the printer to @i{type@}.
pike	comment	//! Valid types are: text, postscript and raw.
pike	code	  int set_job_type(string type)
pike	code	  {
pike	code	    type=lower_case(type);
pike	blank	
pike	code	    switch (type) { 
pike	code	     case "f":
pike	code	     case "text":
pike	code	      jobtype="f";
pike	code	      break;
pike	blank	
pike	code	     case "o":
pike	code	     case "postscript":
pike	code	     case "ps":
pike	code	      jobtype="o";
pike	code	      break;
pike	blank	
pike	code	     default:
pike	code	     case "l":
pike	code	     case "raw":
pike	code	      jobtype="l";
pike	code	      break;
pike	code	    }
pike	code	    return 1;
pike	code	  }
pike	blank	
pike	comment	//! @decl int set_job_name(string name)
pike	comment	//! Sets the name of the print job to @i{name@}.
pike	code	  int set_job_name(string name)
pike	code	  {
pike	code	    jobname=name;
pike	code	    return 1;
pike	code	  }
pike	blank	
pike	comment	//! @decl int start_queue(string queue)
pike	comment	//! Start the queue @i{queue@} if not already printing.
pike	comment	//! @returns
pike	comment	//! Returns 0 if unable to connect, 1 otherwise. 
pike	code	  int start_queue(string queue)
pike	code	  {
pike	code	    if(!queue) return 0;
pike	blank	
pike	code	    if(!connect(host, port))
pike	code	      return 0;
pike	blank	
pike	code	    conn->write(sprintf("%c%s\n", 01, queue));
pike	code	    string resp= conn->read();
pike	code	    conn->close();
pike	code	    return 1;
pike	code	  }
pike	blank	
pike	comment	//! @decl string|int send_job(string queue, string job)
pike	comment	//! Send print job consisting of data @i{job@} to printer @i{queue@}.
pike	comment	//! @returns
pike	comment	//! Returns 1 if success, 0 otherwise.
pike	code	  int send_job(string queue, string job)
pike	code	  {
pike	code	    string resp;
pike	blank	
pike	code	    if(!queue) return 0;
pike	blank	
pike	code	    if(!connect(host, port))
pike	code	      return 0;
pike	comment	    // werror("connected to " + host + "\n");
pike	blank	
pike	code	    string control="";
pike	code	    control+="H"+gethostname()+"\n";
pike	code	#if constant(getuid) && constant(getpwuid)
pike	code	    control+="P"+(getpwuid(getuid())[0]||"nobody")+"\n";
pike	code	#else
pike	code	    control+="P-1\n";
pike	code	#endif
pike	code	    control+=(jobtype||"l")+"dfA"+ sprintf("%03d%s", jobnum, gethostname())+"\n";
pike	code	    if(jobname)
pike	code	    {
pike	code	      control+="J" + jobname + "\n";
pike	code	      control+="N" + jobname + "\n";
pike	code	    }
pike	code	    else
pike	code	    { 
pike	code	      control+="JPike LPD Client Job " + jobnum + "\n";
pike	code	      control+="NPike LPD Client Job " + jobnum + "\n";
pike	code	    }
pike	code	    jobnum++;
pike	code	werror("job file:\n\n" + control  + "\n\n");
pike	blank	
pike	code	    conn->write(sprintf("%c%s\n", 02, queue));
pike	code	    resp=conn->read(1);
pike	code	    if((int)resp !=0)
pike	code	    {
pike	code	      werror("receive job failed.\n");
pike	code	      return 0;
pike	code	    }
pike	blank	
pike	code	    conn->write(sprintf("%c%s cfA%03d%s\n", 02, (string)sizeof(control),
pike	code				jobnum,gethostname()));
pike	blank	
pike	code	    resp=conn->read(1);
pike	code	    if((int)resp !=0)
pike	code	    {
pike	code	      werror("request receive control failed.\n");
pike	code	      return 0;
pike	code	    }
pike	blank	
pike	code	    conn->write(sprintf("%s%c", control, 0));
pike	blank	
pike	code	    resp=conn->read(1);
pike	code	    if((int)resp !=0)
pike	code	    {
pike	code	      werror("send receive control failed.\n");
pike	code	      return 0;
pike	code	    }
pike	blank	
pike	code	    conn->write(sprintf("%c%s dfA%03d%s\n", 03, (string)sizeof(job), jobnum,
pike	code				gethostname()));
pike	code	    resp=conn->read(1);
pike	code	    if((int)resp !=0)
pike	code	    {
pike	code	      werror("request receive job failed.\n");
pike	code	      return 0;
pike	code	    }
pike	blank	
pike	blank	
pike	code	    conn->write(sprintf("%s%c", job, 0));
pike	blank	
pike	code	    resp=conn->read(1);
pike	code	    if((int)resp !=0)
pike	code	    {
pike	code	      werror("send receive job failed.\n");
pike	code	      return 0;
pike	code	    }
pike	blank	
pike	blank	
pike	blank	
pike	comment	    // read the response. 
pike	blank	
pike	comment	//    resp=conn->read();
pike	code	    if((int)(resp)!=0) 
pike	code	    { 
pike	code	      conn->close();
pike	code	      return 0;
pike	code	    }
pike	code	    conn->close();
pike	comment	//    start_queue(queue);
pike	code	    return 1;
pike	code	  }
pike	blank	
pike	comment	//! @decl int delete_job(string queue, int|void job)
pike	comment	//! Delete job @i{job@} from printer @i{queue@}.
pike	comment	//! @returns
pike	comment	//! Returns 1 on success, 0 otherwise.
pike	code	  int delete_job(string queue, int|void job)
pike	code	  {
pike	code	    if(!queue) return 0;
pike	blank	
pike	code	    if(!connect(host, port))
pike	code	      return 0;
pike	blank	
pike	code	#if constant(getpwuid) && constant(getuid)
pike	code	    string agent=(getpwuid(getuid())[0]||"nobody");
pike	code	#else
pike	code	    string agent="nobody";
pike	code	#endif
pike	blank	
pike	code	    if(job)
pike	code	      conn->write(sprintf("%c%s %s %d\n", 05, queue, agent, job));
pike	code	    else
pike	code	      conn->write(sprintf("%c%s %s\n", 05, queue, agent));
pike	code	    string resp= conn->read();
pike	code	    conn->close();
pike	code	    return 1;
pike	code	  }
pike	blank	
pike	blank	
pike	comment	//! @decl string|int status(string queue)
pike	comment	//! Check the status of queue @i{queue@}.
pike	comment	//! @returns
pike	comment	//! Returns 0 on failure, otherwise returns the status response from the printer.
pike	code	  string|int status(string queue)
pike	code	  {
pike	code	    if(!queue) return 0;
pike	blank	
pike	code	    if(!connect(host, port))
pike	code	      return 0;
pike	blank	
pike	code	    conn->write(sprintf("%c%s\n", 04, queue));
pike	code	    string resp= conn->read();
pike	code	    conn->close();
pike	code	    return resp;
pike	code	  }
pike	blank	
pike	comment	//! Create a new LPD client connection.
pike	comment	//! @param hostname
pike	comment	//! Contains the hostname or ipaddress of the print host.
pike	comment	//! if not provided, defaults to @i{localhost@}.
pike	comment	//! @param portnum
pike	comment	//! Contains the port the print host is listening on.
pike	comment	//! if not provided, defaults to port @i{515@}, the RFC 1179 standard.
pike	code	  void create(string|void hostname, int|void portnum)
pike	code	  {
pike	code	    host=hostname || "localhost";
pike	code	    port=portnum || 515;
pike	code	    conn=Stdio.File();
pike	code	    jobnum=1;
pike	code	  }
pike	code	}
pike	blank