1/*
2 * "$Id: cupsaddsmb.c 11093 2013-07-03 20:48:42Z msweet $"
3 *
4 *   "cupsaddsmb" command for CUPS.
5 *
6 *   Copyright 2007-2012 by Apple Inc.
7 *   Copyright 2001-2006 by Easy Software Products.
8 *
9 *   These coded instructions, statements, and computer programs are the
10 *   property of Apple Inc. and are protected by Federal copyright
11 *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
12 *   which should have been included with this file.  If this file is
13 *   file is missing or damaged, see the license at "http://www.cups.org/".
14 *
15 * Contents:
16 *
17 *   main()        - Export printers on the command-line.
18 *   export_dest() - Export a destination to SAMBA.
19 *   usage()       - Show program usage and exit...
20 */
21
22/*
23 * Include necessary headers...
24 */
25
26#include <cups/cups-private.h>
27#include <cups/adminutil.h>
28#include <fcntl.h>
29#include <unistd.h>
30#include <sys/wait.h>
31
32
33/*
34 * Local globals...
35 */
36
37int		Verbosity = 0;
38const char	*SAMBAUser,
39		*SAMBAPassword,
40		*SAMBAServer;
41
42
43/*
44 * Local functions...
45 */
46
47int	export_dest(http_t *http, const char *dest);
48void	usage(void) __attribute__((noreturn));
49
50
51/*
52 * 'main()' - Export printers on the command-line.
53 */
54
55int					/* O - Exit status */
56main(int  argc,				/* I - Number of command-line arguments */
57     char *argv[])			/* I - Command-line arguments */
58{
59  int		i, j;			/* Looping vars */
60  int		status;			/* Status from export_dest() */
61  int		export_all;		/* Export all printers? */
62  http_t	*http;			/* Connection to server */
63  int		num_dests;		/* Number of printers */
64  cups_dest_t	*dests;			/* Printers */
65
66
67  _cupsSetLocale(argv);
68
69 /*
70  * Parse command-line arguments...
71  */
72
73  export_all    = 0;
74  http          = NULL;
75  SAMBAUser     = cupsUser();
76  SAMBAPassword = NULL;
77  SAMBAServer   = NULL;
78
79  for (i = 1; i < argc; i ++)
80    if (!strcmp(argv[i], "-E"))
81    {
82#ifdef HAVE_SSL
83      cupsSetEncryption(HTTP_ENCRYPT_REQUIRED);
84#else
85      _cupsLangPrintf(stderr,
86	              _("%s: Sorry, no encryption support."),
87	              argv[0]);
88#endif /* HAVE_SSL */
89    }
90    else if (!strcmp(argv[i], "-H"))
91    {
92      i ++;
93      if (i >= argc)
94        usage();
95
96      SAMBAServer = argv[i];
97    }
98    else if (!strcmp(argv[i], "-U"))
99    {
100      char	*sep;			/* Separator for password */
101
102
103      i ++;
104      if (i >= argc)
105        usage();
106
107      SAMBAUser = argv[i];
108
109      if ((sep = strchr(argv[i], '%')) != NULL)
110      {
111       /*
112        * Nul-terminate the username at the first % and point the
113	* password at the rest...
114	*/
115
116        *sep++ = '\0';
117
118        SAMBAPassword = sep;
119      }
120    }
121    else if (!strcmp(argv[i], "-a"))
122      export_all = 1;
123    else if (!strcmp(argv[i], "-h"))
124    {
125      i ++;
126      if (i >= argc)
127        usage();
128
129      cupsSetServer(argv[i]);
130    }
131    else if (!strcmp(argv[i], "-v"))
132      Verbosity = 1;
133    else if (argv[i][0] != '-')
134    {
135      if (!http)
136      {
137       /*
138	* Connect to the server...
139	*/
140
141	if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
142                                       cupsEncryption())) == NULL)
143	{
144	  _cupsLangPrintf(stderr, _("%s: Unable to connect to server."),
145	                  argv[0]);
146	  exit(1);
147	}
148      }
149
150      if (SAMBAServer == NULL)
151      {
152	SAMBAServer = cupsServer();
153
154	if (SAMBAServer[0] == '/')	/* Use localhost instead of domain socket */
155	  SAMBAServer = "localhost";
156      }
157
158      if ((status = export_dest(http, argv[i])) != 0)
159	return (status);
160    }
161    else
162      usage();
163
164 /*
165  * Connect to the server...
166  */
167
168  if ((http = httpConnectEncrypt(cupsServer(), ippPort(),
169                                 cupsEncryption())) == NULL)
170  {
171    _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), argv[0]);
172    exit(1);
173  }
174
175 /*
176  * See if the user specified "-a"...
177  */
178
179  if (export_all)
180  {
181   /*
182    * Export all printers...
183    */
184
185    if (SAMBAServer == NULL)
186    {
187      SAMBAServer = cupsServer();
188
189      if (SAMBAServer[0] == '/')	/* Use localhost instead of domain socket */
190	SAMBAServer = "localhost";
191    }
192
193    num_dests = cupsGetDests2(http, &dests);
194
195    for (j = 0, status = 0; j < num_dests; j ++)
196      if (!dests[j].instance)
197      {
198        if ((status = export_dest(http, dests[j].name)) != 0)
199	  break;
200      }
201
202    cupsFreeDests(num_dests, dests);
203
204    if (status)
205      return (status);
206  }
207
208  return (0);
209}
210
211
212/*
213 * 'export_dest()' - Export a destination to SAMBA.
214 */
215
216int					/* O - 0 on success, non-zero on error */
217export_dest(http_t     *http,		/* I - Connection to server */
218            const char *dest)		/* I - Destination to export */
219{
220  int		status;			/* Status of export */
221  char		ppdfile[1024],		/* PPD file for printer drivers */
222		prompt[1024];		/* Password prompt */
223  int		tries;			/* Number of tries */
224
225
226 /*
227  * Get the Windows PPD file for the printer...
228  */
229
230  if (!cupsAdminCreateWindowsPPD(http, dest, ppdfile, sizeof(ppdfile)))
231  {
232    _cupsLangPrintf(stderr,
233                    _("cupsaddsmb: No PPD file for printer \"%s\" - %s"),
234        	    dest, cupsLastErrorString());
235    return (1);
236  }
237
238 /*
239  * Try to export it...
240  */
241
242  for (status = 0, tries = 0; !status && tries < 3; tries ++)
243  {
244   /*
245    * Get the password, as needed...
246    */
247
248    if (!SAMBAPassword)
249    {
250      snprintf(prompt, sizeof(prompt),
251               _cupsLangString(cupsLangDefault(),
252	                       _("Password for %s required to access %s via "
253			         "SAMBA: ")),
254	       SAMBAUser, SAMBAServer);
255
256      if ((SAMBAPassword = cupsGetPassword(prompt)) == NULL)
257	break;
258    }
259
260    status = cupsAdminExportSamba(dest, ppdfile, SAMBAServer,
261                                  SAMBAUser, SAMBAPassword,
262				  Verbosity ? stderr : NULL);
263
264    if (!status && cupsLastError() == IPP_NOT_FOUND)
265      break;
266  }
267
268  unlink(ppdfile);
269
270  return (!status);
271}
272
273
274/*
275 * 'usage()' - Show program usage and exit...
276 */
277
278void
279usage(void)
280{
281  _cupsLangPuts(stdout, _("Usage: cupsaddsmb [options] printer1 ... printerN"));
282  _cupsLangPuts(stdout, _("       cupsaddsmb [options] -a"));
283  _cupsLangPuts(stdout, "");
284  _cupsLangPuts(stdout, _("Options:"));
285  _cupsLangPuts(stdout, _("  -E                      Encrypt the connection."));
286  _cupsLangPuts(stdout, _("  -H samba-server         Use the named SAMBA "
287                          "server."));
288  _cupsLangPuts(stdout, _("  -U username             Specify username."));
289  _cupsLangPuts(stdout, _("  -a                      Export all printers."));
290  _cupsLangPuts(stdout, _("  -h server[:port]        Specify server address."));
291  _cupsLangPuts(stdout, _("  -v                      Be verbose."));
292
293  exit(1);
294}
295
296
297/*
298 * End of "$Id: cupsaddsmb.c 11093 2013-07-03 20:48:42Z msweet $".
299 */
300