#include <cups/cups.h>
#include <cups/string-private.h>
static void usage(void);
int
main(int argc,
char *argv[])
{
int i,
printer,
num_printers,
pclass,
num_pclasses,
server,
num_servers,
count,
interval,
lease,
continuous,
port,
sock,
val,
seconds,
verbose;
const char *options;
time_t curtime;
struct tm *curdate;
struct sockaddr_in addr;
char packet[1540];
static const char * const names[26] =
{
"alpha",
"bravo",
"charlie",
"delta",
"echo",
"foxtrot",
"golf",
"hotel",
"india",
"juliet",
"kilo",
"lima",
"mike",
"november",
"oscar",
"papa",
"quebec",
"romeo",
"sierra",
"tango",
"uniform",
"victor",
"wiskey",
"x-ray",
"yankee",
"zulu"
};
num_printers = 10;
num_pclasses = 5;
num_servers = 1;
interval = 30;
lease = 60;
port = 0;
verbose = 0;
continuous = 0;
options = NULL;
for (i = 1; i < argc; i ++)
{
if (!strcmp(argv[i], "-c"))
continuous = 1;
else if (!strcmp(argv[i], "-i"))
{
i ++;
if (i < argc)
interval = atoi(argv[i]);
else
usage();
continuous = 1;
}
else if (!strcmp(argv[i], "-l"))
{
i ++;
if (i < argc)
lease = atoi(argv[i]);
else
usage();
}
else if (!strcmp(argv[i], "-o"))
{
i ++;
if (i < argc)
options = argv[i];
else
usage();
}
else if (!strcmp(argv[i], "-C"))
{
i ++;
if (i < argc)
num_pclasses = atoi(argv[i]);
else
usage();
}
else if (!strcmp(argv[i], "-p"))
{
i ++;
if (i < argc)
num_printers = atoi(argv[i]);
else
usage();
}
else if (!strcmp(argv[i], "-s"))
{
i ++;
if (i < argc)
num_servers = atoi(argv[i]);
else
usage();
}
else if (!strcmp(argv[i], "-v"))
verbose = 1;
else if (isdigit(argv[i][0] & 255))
{
port = atoi(argv[i]);
}
else
usage();
}
if ((num_printers <= 0 && num_pclasses <= 0) || num_servers <= 0 ||
interval <= 0 || lease < 1 || port <= 0)
usage();
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("Unable to open broadcast socket");
return (1);
}
val = 1;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)))
{
perror("Unable to put socket in broadcast mode");
close(sock);
return (1);
}
memset(&addr, 0, sizeof(addr));
addr.sin_addr.s_addr = htonl(0x7f000001);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
for (;;)
{
printf("Sending %d printers from %d servers...\n", num_printers,
num_servers);
count = num_servers * (num_printers + num_pclasses) / interval + 1;
curtime = time(NULL);
curdate = localtime(&curtime);
seconds = interval;
for (i = 0, printer = 0; printer < num_printers; printer ++)
{
for (server = 0; server < num_servers; server ++, i ++)
{
if (i == count)
{
seconds --;
i = 0;
sleep(1);
curtime = time(NULL);
curdate = localtime(&curtime);
}
snprintf(packet, sizeof(packet),
"%x %x ipp://testserver-%d/printers/%s-%d \"Server Room %d\" "
"\"Test Printer %d\" \"Acme Blazer 2000\"%s%s "
"lease-duration=%d\n",
CUPS_PRINTER_REMOTE, IPP_PRINTER_IDLE, server + 1,
names[printer % 26], printer / 26 + 1, server + 1,
printer + 1, options ? " ipp-options=" : "",
options ? options : "", lease);
if (verbose)
printf("[%02d:%02d:%02d] %s", curdate->tm_hour, curdate->tm_min,
curdate->tm_sec, packet);
if (sendto(sock, packet, strlen(packet), 0,
(struct sockaddr *)&addr, sizeof(addr)) < 0)
perror("Unabled to send packet");
}
}
for (i = 0, pclass = 0; pclass < num_pclasses; pclass ++)
{
for (server = 0; server < num_servers; server ++, i ++)
{
if (i == count)
{
seconds --;
i = 0;
sleep(1);
curtime = time(NULL);
curdate = localtime(&curtime);
}
snprintf(packet, sizeof(packet),
"%x %x ipp://testserver-%d/classes/class-%s-%d \"Server Room %d\" "
"\"Test Class %d\" \"Acme Blazer 2000\"%s%s "
"lease-duration=%d\n",
CUPS_PRINTER_REMOTE | CUPS_PRINTER_CLASS, IPP_PRINTER_IDLE,
server + 1, names[pclass % 26], pclass / 26 + 1, server + 1,
pclass + 1, options ? " ipp-options=" : "",
options ? options : "", lease);
if (verbose)
printf("[%02d:%02d:%02d] %s", curdate->tm_hour, curdate->tm_min,
curdate->tm_sec, packet);
if (sendto(sock, packet, strlen(packet), 0,
(struct sockaddr *)&addr, sizeof(addr)) < 0)
perror("Unabled to send packet");
}
}
if (!continuous)
break;
if (seconds > 0)
sleep(seconds);
}
return (0);
}
static void
usage(void)
{
puts("Usage: testdirsvc [-c] [-i interval] [-l lease-duration] "
"[-o ipp-options] [-p printers] "
"[-C classes] [-s servers] [-v] port");
exit(0);
}