#include <cups/cups.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <cups/string.h>
#include <signal.h>
#ifdef WIN32
# include <io.h>
#else
# include <unistd.h>
# include <fcntl.h>
# include <termios.h>
#endif
void list_devices(void);
int
main(int argc,
char *argv[])
{
char method[255],
hostname[1024],
username[255],
resource[1024],
*options;
int port;
int fp;
int copies;
int fd;
int wbytes;
size_t nbytes,
tbytes;
char buffer[8192],
*bufptr;
struct termios opts;
#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET)
struct sigaction action;
#endif
setbuf(stderr, NULL);
if (argc == 1)
{
list_devices();
return (0);
}
else if (argc < 6 || argc > 7)
{
fputs("Usage: USB job-id user title copies options [file]\n", stderr);
return (1);
}
if (argc == 6)
{
fp = 0;
copies = 1;
}
else
{
if ((fp = open(argv[6], O_RDONLY)) < 0)
{
perror("ERROR: unable to open print file");
return (1);
}
copies = atoi(argv[4]);
}
httpSeparate(argv[0], method, username, hostname, &port, resource);
if ((options = strchr(resource, '?')) != NULL)
{
*options++ = '\0';
}
do
{
if ((fd = open(resource, O_WRONLY | O_EXCL)) == -1)
{
if (errno == EBUSY)
{
fputs("INFO: USB port busy; will retry in 30 seconds...\n", stderr);
sleep(30);
}
else if (errno == ENXIO || errno == EIO || errno == ENOENT)
{
fputs("INFO: Printer not connected; will retry in 30 seconds...\n", stderr);
sleep(30);
}
else
{
fprintf(stderr, "ERROR: Unable to open USB port device file \"%s\": %s\n",
resource, strerror(errno));
return (1);
}
}
}
while (fd < 0);
tcgetattr(fd, &opts);
opts.c_lflag &= ~(ICANON | ECHO | ISIG);
tcsetattr(fd, TCSANOW, &opts);
if (argc < 7)
{
#ifdef HAVE_SIGSET
sigset(SIGTERM, SIG_IGN);
#elif defined(HAVE_SIGACTION)
memset(&action, 0, sizeof(action));
sigemptyset(&action.sa_mask);
action.sa_handler = SIG_IGN;
sigaction(SIGTERM, &action, NULL);
#else
signal(SIGTERM, SIG_IGN);
#endif
}
while (copies > 0)
{
copies --;
if (fp != 0)
{
fputs("PAGE: 1 1\n", stderr);
lseek(fp, 0, SEEK_SET);
}
tbytes = 0;
while ((nbytes = read(fp, buffer, sizeof(buffer))) > 0)
{
tbytes += nbytes;
bufptr = buffer;
while (nbytes > 0)
{
if ((wbytes = write(fd, bufptr, nbytes)) < 0)
if (errno == ENOTTY)
wbytes = write(fd, bufptr, nbytes);
if (wbytes < 0)
{
perror("ERROR: Unable to send print file to printer");
break;
}
nbytes -= wbytes;
bufptr += wbytes;
}
if (argc > 6)
fprintf(stderr, "INFO: Sending print file, %lu bytes...\n",
(unsigned long)tbytes);
}
}
close(fd);
if (fp != 0)
close(fp);
fputs("INFO: Ready to print.\n", stderr);
return (0);
}
void
list_devices(void)
{
#ifdef __linux
int i;
int fd;
char device[255];
FILE *probe;
char line[1024],
*delim,
make[IPP_MAX_NAME],
model[IPP_MAX_NAME];
if ((fd = open("/dev/usb/lp0", O_WRONLY)) >= 0)
close(fd);
else if ((fd = open("/dev/usb/usblp0", O_WRONLY)) >= 0)
close(fd);
else if ((fd = open("/dev/usblp0", O_WRONLY)) >= 0)
close(fd);
if ((probe = fopen("/proc/bus/usb/devices", "r")) != NULL)
{
i = 0;
memset(make, 0, sizeof(make));
memset(model, 0, sizeof(model));
while (fgets(line, sizeof(line), probe) != NULL)
{
if ((delim = strrchr(line, '\n')) != NULL)
*delim = '\0';
if (strncmp(line, "S:", 2) == 0)
{
if (strncmp(line, "S: Manufacturer=", 17) == 0)
{
strlcpy(make, line + 17, sizeof(make));
if (strcmp(make, "Hewlett-Packard") == 0)
strcpy(make, "HP");
}
else if (strncmp(line, "S: Product=", 12) == 0)
strlcpy(model, line + 12, sizeof(model));
}
else if (strncmp(line, "I:", 2) == 0 &&
(strstr(line, "Driver=printer") != NULL ||
strstr(line, "Driver=usblp") != NULL) &&
make[0] && model[0])
{
sprintf(device, "/dev/usb/lp%d", i);
if (access(device, 0))
{
sprintf(device, "/dev/usb/usblp%d", i);
if (access(device, 0))
sprintf(device, "/dev/usblp%d", i);
}
printf("direct usb:%s \"%s %s\" \"USB Printer #%d\"\n",
device, make, model, i + 1);
i ++;
memset(make, 0, sizeof(make));
memset(model, 0, sizeof(model));
}
}
fclose(probe);
for (; i < 16; i ++)
{
sprintf(device, "/dev/usb/lp%d", i);
if (access(device, 0))
{
sprintf(device, "/dev/usb/usblp%d", i);
if (access(device, 0))
{
sprintf(device, "/dev/usblp%d", i);
if (access(device, 0))
continue;
}
}
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
}
}
else
{
for (i = 0; i < 16; i ++)
{
sprintf(device, "/dev/usb/lp%d", i);
if (access(device, 0))
{
sprintf(device, "/dev/usb/usblp%d", i);
if (access(device, 0))
{
sprintf(device, "/dev/usblp%d", i);
if (access(device, 0))
continue;
}
}
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
}
}
#elif defined(__sgi)
#elif defined(__sun)
#elif defined(__hpux)
#elif defined(__osf)
#elif defined(__FreeBSD__)
int i;
char device[255];
for (i = 0; i < 3; i ++)
{
sprintf(device, "/dev/unlpt%d", i);
if (!access(device, 0))
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
}
#elif defined(__NetBSD__) || defined(__OpenBSD__)
int i;
char device[255];
for (i = 0; i < 3; i ++)
{
sprintf(device, "/dev/ulpt%d", i);
if (!access(device, 0))
printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1);
}
#endif
}