blob: b995c03862be79617034f87b7a25d71954fec98e [file] [log] [blame]
/*
* "cupsaddsmb" command for CUPS.
*
* Copyright 2007-2012 by Apple Inc.
* Copyright 2001-2006 by Easy Software Products.
*
* Licensed under Apache License v2.0. See the file "LICENSE" for more information.
*/
/*
* Include necessary headers...
*/
#include <cups/cups-private.h>
#include <cups/adminutil.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
/*
* Local globals...
*/
int Verbosity = 0;
const char *SAMBAUser,
*SAMBAPassword,
*SAMBAServer;
/*
* Local functions...
*/
int export_dest(http_t *http, const char *dest);
void usage(void) __attribute__((noreturn));
/*
* 'main()' - Export printers on the command-line.
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
{
int i, j; /* Looping vars */
int status; /* Status from export_dest() */
int export_all; /* Export all printers? */
http_t *http; /* Connection to server */
int num_dests; /* Number of printers */
cups_dest_t *dests; /* Printers */
_cupsSetLocale(argv);
/*
* Parse command-line arguments...
*/
export_all = 0;
http = NULL;
SAMBAUser = cupsUser();
SAMBAPassword = NULL;
SAMBAServer = NULL;
for (i = 1; i < argc; i ++)
if (!strcmp(argv[i], "-E"))
{
#ifdef HAVE_SSL
cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
#else
_cupsLangPrintf(stderr,
_("%s: Sorry, no encryption support."),
argv[0]);
#endif /* HAVE_SSL */
}
else if (!strcmp(argv[i], "-H"))
{
i ++;
if (i >= argc)
usage();
SAMBAServer = argv[i];
}
else if (!strcmp(argv[i], "-U"))
{
char *sep; /* Separator for password */
i ++;
if (i >= argc)
usage();
SAMBAUser = argv[i];
if ((sep = strchr(argv[i], '%')) != NULL)
{
/*
* Nul-terminate the username at the first % and point the
* password at the rest...
*/
*sep++ = '\0';
SAMBAPassword = sep;
}
}
else if (!strcmp(argv[i], "-a"))
export_all = 1;
else if (!strcmp(argv[i], "-h"))
{
i ++;
if (i >= argc)
usage();
cupsSetServer(argv[i]);
}
else if (!strcmp(argv[i], "-v"))
Verbosity = 1;
else if (argv[i][0] != '-')
{
if (!http)
{
/*
* Connect to the server...
*/
if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
cupsEncryption())) == NULL)
{
_cupsLangPrintf(stderr, _("%s: Unable to connect to server."),
argv[0]);
exit(1);
}
}
if (SAMBAServer == NULL)
{
SAMBAServer = cupsServer();
if (SAMBAServer[0] == '/') /* Use localhost instead of domain socket */
SAMBAServer = "localhost";
}
if ((status = export_dest(http, argv[i])) != 0)
return (status);
}
else
usage();
/*
* Connect to the server...
*/
if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
cupsEncryption())) == NULL)
{
_cupsLangPrintf(stderr, _("%s: Unable to connect to server."), argv[0]);
exit(1);
}
/*
* See if the user specified "-a"...
*/
if (export_all)
{
/*
* Export all printers...
*/
if (SAMBAServer == NULL)
{
SAMBAServer = cupsServer();
if (SAMBAServer[0] == '/') /* Use localhost instead of domain socket */
SAMBAServer = "localhost";
}
num_dests = cupsGetDests2(http, &dests);
for (j = 0, status = 0; j < num_dests; j ++)
if (!dests[j].instance)
{
if ((status = export_dest(http, dests[j].name)) != 0)
break;
}
cupsFreeDests(num_dests, dests);
if (status)
return (status);
}
return (0);
}
/*
* 'export_dest()' - Export a destination to SAMBA.
*/
int /* O - 0 on success, non-zero on error */
export_dest(http_t *http, /* I - Connection to server */
const char *dest) /* I - Destination to export */
{
int status; /* Status of export */
char ppdfile[1024], /* PPD file for printer drivers */
prompt[1024]; /* Password prompt */
int tries; /* Number of tries */
/*
* Get the Windows PPD file for the printer...
*/
if (!cupsAdminCreateWindowsPPD(http, dest, ppdfile, sizeof(ppdfile)))
{
_cupsLangPrintf(stderr,
_("cupsaddsmb: No PPD file for printer \"%s\" - %s"),
dest, cupsLastErrorString());
return (1);
}
/*
* Try to export it...
*/
for (status = 0, tries = 0; !status && tries < 3; tries ++)
{
/*
* Get the password, as needed...
*/
if (!SAMBAPassword)
{
snprintf(prompt, sizeof(prompt),
_cupsLangString(cupsLangDefault(),
_("Password for %s required to access %s via "
"SAMBA: ")),
SAMBAUser, SAMBAServer);
if ((SAMBAPassword = cupsGetPassword(prompt)) == NULL)
break;
}
status = cupsAdminExportSamba(dest, ppdfile, SAMBAServer,
SAMBAUser, SAMBAPassword,
Verbosity ? stderr : NULL);
if (!status && cupsLastError() == IPP_NOT_FOUND)
break;
}
unlink(ppdfile);
return (!status);
}
/*
* 'usage()' - Show program usage and exit...
*/
void
usage(void)
{
_cupsLangPuts(stdout, _("Usage: cupsaddsmb [options] printer1 ... printerN"));
_cupsLangPuts(stdout, _(" cupsaddsmb [options] -a"));
_cupsLangPuts(stdout, "");
_cupsLangPuts(stdout, _("Options:"));
_cupsLangPuts(stdout, _(" -E Encrypt the connection."));
_cupsLangPuts(stdout, _(" -H samba-server Use the named SAMBA "
"server."));
_cupsLangPuts(stdout, _(" -U username Specify username."));
_cupsLangPuts(stdout, _(" -a Export all printers."));
_cupsLangPuts(stdout, _(" -h server[:port] Specify server address."));
_cupsLangPuts(stdout, _(" -v Be verbose."));
exit(1);
}