]>
git.ipfire.org Git - thirdparty/cups.git/blob - backend/socket.c
2 * "$Id: socket.c,v 1.13 2000/04/27 21:31:38 mike Exp $"
4 * AppSocket backend for the Common UNIX Printing System (CUPS).
6 * Copyright 1997-2000 by Easy Software Products, all rights reserved.
8 * These coded instructions, statements, and computer programs are the
9 * property of Easy Software Products and are protected by Federal
10 * copyright law. Distribution and use rights are outlined in the file
11 * "LICENSE" which should have been included with this file. If this
12 * file is missing or damaged please contact Easy Software Products
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636-3111 USA
20 * Voice: (301) 373-9603
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org
26 * main() - Send a file to the printer or server.
30 * Include necessary headers.
33 #include <cups/cups.h>
37 #include <cups/string.h>
39 #include <sys/types.h>
43 #if defined(WIN32) || defined(__EMX__)
46 # include <sys/socket.h>
47 # include <netinet/in.h>
48 # include <arpa/inet.h>
50 #endif /* WIN32 || __EMX__ */
54 * 'main()' - Send a file to the printer or server.
58 * printer-uri job-id user title copies options [file]
61 int /* O - Exit status */
62 main(int argc
, /* I - Number of command-line arguments (6 or 7) */
63 char *argv
[]) /* I - Command-line arguments */
65 char method
[255], /* Method in URI */
66 hostname
[1024], /* Hostname */
67 username
[255], /* Username info (not used) */
68 resource
[1024]; /* Resource info (not used) */
69 FILE *fp
; /* Print file */
70 int copies
; /* Number of copies to print */
71 int port
; /* Port number */
72 int fd
; /* AppSocket */
73 int error
; /* Error code (if any) */
74 struct sockaddr_in addr
; /* Socket address */
75 struct hostent
*hostaddr
; /* Host address */
76 int wbytes
; /* Number of bytes written */
77 size_t nbytes
, /* Number of bytes read */
78 tbytes
; /* Total number of bytes written */
79 char buffer
[8192], /* Output buffer */
80 *bufptr
; /* Pointer into buffer */
81 struct timeval timeout
; /* Timeout for select() */
82 fd_set input
; /* Input set for select() */
83 #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
84 struct sigaction action
; /* Actions for POSIX signals */
85 #endif /* HAVE_SIGACTION && !HAVE_SIGSET */
90 puts("network socket \"Unknown\" \"AppSocket/HP JetDirect\"");
93 else if (argc
< 6 || argc
> 7)
95 fprintf(stderr
, "Usage: %s job-id user title copies options [file]\n",
101 * If we have 7 arguments, print the file named on the command-line.
102 * Otherwise, send stdin instead...
113 * Try to open the print file...
116 if ((fp
= fopen(argv
[6], "rb")) == NULL
)
118 perror("ERROR: unable to open print file");
122 copies
= atoi(argv
[4]);
126 * Extract the hostname and port number from the URI...
129 httpSeparate(argv
[0], method
, username
, hostname
, &port
, resource
);
132 port
= 9100; /* Default to HP JetDirect/Tektronix PhaserShare */
135 * Then try to connect to the remote host...
138 if ((hostaddr
= gethostbyname(hostname
)) == NULL
)
140 fprintf(stderr
, "ERROR: Unable to locate printer \'%s\' - %s",
141 hostname
, strerror(errno
));
145 fprintf(stderr
, "INFO: Attempting to connect to host %s on port %d\n",
148 memset(&addr
, 0, sizeof(addr
));
149 memcpy(&(addr
.sin_addr
), hostaddr
->h_addr
, hostaddr
->h_length
);
150 addr
.sin_family
= hostaddr
->h_addrtype
;
151 addr
.sin_port
= htons(port
);
157 if ((fd
= socket(AF_INET
, SOCK_STREAM
, 0)) < 0)
159 perror("ERROR: Unable to create socket");
163 if (connect(fd
, (struct sockaddr
*)&addr
, sizeof(addr
)) < 0)
169 if (error
== ECONNREFUSED
)
171 fprintf(stderr
, "INFO: Network host \'%s\' is busy; will retry in 30 seconds...\n",
177 perror("ERROR: Unable to connect to printer");
186 * Now that we are "connected" to the port, ignore SIGTERM so that we
187 * can finish out any page data the driver sends (e.g. to eject the
191 #ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */
192 sigset(SIGTERM
, SIG_IGN
);
193 #elif defined(HAVE_SIGACTION)
194 memset(&action
, 0, sizeof(action
));
196 sigemptyset(&action
.sa_mask
);
197 action
.sa_handler
= SIG_IGN
;
198 sigaction(SIGTERM
, &action
, NULL
);
200 signal(SIGTERM
, SIG_IGN
);
201 #endif /* HAVE_SIGSET */
204 * Finally, send the print file...
211 fputs("PAGE: 1 1\n", stderr
);
215 fputs("INFO: Connected to host, sending print job...\n", stderr
);
218 while ((nbytes
= fread(buffer
, 1, sizeof(buffer
), fp
)) > 0)
221 * Write the print data to the printer...
229 if ((wbytes
= send(fd
, bufptr
, nbytes
, 0)) < 0)
231 perror("ERROR: Unable to send print file to printer");
240 * Check for possible data coming back from the printer...
247 if (select(fd
+ 1, &input
, NULL
, NULL
, &timeout
) > 0)
250 * Grab the data coming back and spit it out to stderr...
253 if ((nbytes
= recv(fd
, buffer
, sizeof(buffer
), 0)) > 0)
254 fprintf(stderr
, "INFO: Received %u bytes of back-channel data!\n",
258 fprintf(stderr
, "INFO: Sending print file, %u bytes...\n", tbytes
);
262 * Close the socket connection...
269 * Close the input file and return...
280 * End of "$Id: socket.c,v 1.13 2000/04/27 21:31:38 mike Exp $".