~ubuntu-branches/ubuntu/oneiric/cups/oneiric-proposed

« back to all changes in this revision

Viewing changes to .pc/cups-avahi.patch/scheduler/main.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt, Till Kamppeter, Martin Pitt
  • Date: 2011-08-07 12:53:12 UTC
  • mfrom: (1.2.13 upstream)
  • Revision ID: james.westby@ubuntu.com-20110807125312-s323cyb3oqaxaemo
Tags: 1.5.0-1
[ Till Kamppeter ]
* New upstream release
* debian/patches/usb-backend-no-segfault-on-bad-device-id.patch,
  debian/patches/usb-backend-accept-old-usblp-uris.patch,
  debian/patches/use-ps2write-ghostscript-device-for-pdftops-filter.patch:
  Removed, included upstream.
* debian/patches/poppler-based-pdftops-fixes.patch,
  debian/patches/do-not-emit-ps-level-3-with-poppler.patch: Replaced patch
  by a new one only containing the parts which remain after removing the
  parts included upstream.
* debian/patches/pidfile.patch,
  debian/patches/ppd-poll-with-client-conf.patch,
  debian/patches/cups-avahi.patch,
  debian/patches/drop_unnecessary_dependencies.patch,
  debian/patches/do-not-broadcast-with-hostnames.patch,
  debian/patches/ppdc-dynamic-linking.patch,
  debian/patches/pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.patch:
  Manually regenerated to adapt to upstream changes.
* debian/patches/manpage-translations.patch,
  debian/patches/rootbackends-worldreadable.patch,
  debian/patches/no-conffile-timestamp.patch,
  debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch,
  debian/patches/cups-snmp-oids-device-id-hp-ricoh.patch,
  debian/patches/configure-default-browse-protocols.patch,
  debian/patches/logfiles_adm_readable.patch,
  debian/patches/confdirperms.patch,
  debian/patches/printer-filtering.patch,
  debian/patches/show-compile-command-lines.patch,
  debian/patches/log-debug-history-nearly-unlimited.patch:
  Refreshed using quilt.
* debian/patches/default-ripcache-size-auto.patch: Dropped, as once,
  Ghostscript 9.04 is ignoring the cache size value as it crashes easily
  otherwise (Ghostscript upstream bug #691586) and second, CUPS defaults to
  more reasonable 128 MB (now only used for imagetops).
* debian/patches/support-gzipped-charmaps.patch: Dropped, as the SBCS and
  VBCS character maps are not used any more by CUPS.
* debian/rules: Enable threads in the ./configure command line, as otherwise
  CUPS 1.5.0 does not build at all.
* debian/local/filters/pdf-filters/filter/pdftoijs.cxx,
  debian/local/filters/pdf-filters/filter/pdftoraster.cxx,
  debian/local/filters/pdf-filters/pdftoopvp/pdftoopvp.cxx,
  debian/local/filters/pdf-filters/pdftopdf/pdftopdf.cxx: Under CUPS 1.5.x.
  all programs using the PPD API of CUPS need to explicitly include
  "<cups/ppd.h>". Updated the PDF filter add-on package.
* debian/local/filters/pdf-filters/addtocups: Make the addition of the
  pdftopdf and pdftoopvp directories also work with CUPS 1.5.x.
* debian/local/filters/pdf-filters/addtocups,
  debian/local/filters/pdf-filters/removefromcups: Added a symbolic link
  cups/i18n.h, so that texttopdf builds.
* debian/cups-client.install: Install the new ipptool and its sample
  files and manpages.
* debian/cups-client.install: Commented out lines for dropped man page
  translations: ipptool, lppasswd, client.conf, ipptoolfile, cupsenable,
  lpadmin, lpinfo, cupsreject, cupsdisable, cupsaccept
* debian/cups-common.install, debian/rules: The /usr/share/cups/charmaps
  directory got removed from CUPS.
* debian/libcups2-dev.install: cups/i18n.h got renamed to
  cups/language-private.h. Install this as /usr/include/cups/i18n.h.
* debian/libcups2.symbols, debian/libcupsmime1.symbols: Updated.
* debian/cups.lintian-overrides, debian/cups.postinst, debian/cups.prerm,
  debian/cups.templates, debian/local/apparmor-profile: The "scsi"
  CUPS backend got dropped upstream, removed its treatment from these files.

[ Martin Pitt ]
* Add Serbian (Cyrillic) debconf translations, thanks Zlatan Todoric.
  (Closes: #635105)
* Add Serbian (Latin) debconf translations, thanks Zlatan Todoric.
  (Closes: #635108)
* debian/local/apparmor-profile: Allow access to serial printers on USB
  adapters. (LP: #677432)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 * "$Id: main.c 9310 2010-09-21 22:34:57Z mike $"
 
2
 * "$Id: main.c 9783 2011-05-18 20:44:16Z mike $"
3
3
 *
4
4
 *   Main loop for the CUPS scheduler.
5
5
 *
6
 
 *   Copyright 2007-2010 by Apple Inc.
 
6
 *   Copyright 2007-2011 by Apple Inc.
7
7
 *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
8
8
 *
9
9
 *   These coded instructions, statements, and computer programs are the
15
15
 * Contents:
16
16
 *
17
17
 *   main()                - Main entry for the CUPS scheduler.
 
18
 *   cupsdAddString()      - Copy and add a string to an array.
18
19
 *   cupsdCheckProcess()   - Tell the main loop to check for dead children.
19
 
 *   cupsdClosePipe()      - Close a pipe as necessary.
20
 
 *   cupsdOpenPipe()       - Create a pipe which is closed on exec.
21
20
 *   cupsdClearString()    - Clear a string.
 
21
 *   cupsdFreeStrings()    - Free an array of strings.
22
22
 *   cupsdHoldSignals()    - Hold child and termination signals.
23
23
 *   cupsdReleaseSignals() - Release signals for delivery.
24
24
 *   cupsdSetString()      - Set a string value.
25
25
 *   cupsdSetStringf()     - Set a formatted string value.
26
 
 *   cupsd_clean_files()   - Clean out old files.
27
26
 *   launchd_checkin()     - Check-in with launchd and collect the listening
28
27
 *                           fds.
29
28
 *   launchd_checkout()    - Update the launchd KeepAlive file as needed.
46
45
#include <sys/resource.h>
47
46
#include <syslog.h>
48
47
#include <grp.h>
49
 
#include <cups/dir.h>
50
 
#include <fnmatch.h>
51
48
 
52
49
#ifdef HAVE_LAUNCH_H
53
50
#  include <launch.h>
72
69
#  include <notify.h>
73
70
#endif /* HAVE_NOTIFY_H */
74
71
 
75
 
#if defined(__APPLE__) && defined(HAVE_DLFCN_H)
76
 
#  include <dlfcn.h>
77
 
#endif /* __APPLE__ && HAVE_DLFCN_H */
78
 
 
79
72
 
80
73
/*
81
74
 * Local functions...
82
75
 */
83
76
 
84
 
static void             cupsd_clean_files(const char *path,
85
 
                                          const char *pattern);
86
77
#ifdef HAVE_LAUNCHD
87
78
static void             launchd_checkin(void);
88
79
static void             launchd_checkout(void);
113
104
static int              stop_scheduler = 0;
114
105
                                        /* Should the scheduler stop? */
115
106
 
116
 
#if defined(__APPLE__) && defined(HAVE_DLFCN_H)
117
 
static const char *PSQLibPath = "/usr/lib/libPrintServiceQuota.dylib";
118
 
static const char *PSQLibFuncName = "PSQUpdateQuota";
119
 
static void *PSQLibRef;                 /* libPrintServiceQuota.dylib */
120
 
#endif /* HAVE_DLFCN_H */
121
 
 
122
107
 
123
108
/*
124
109
 * 'main()' - Main entry for the CUPS scheduler.
172
157
 
173
158
  if (getuid() != geteuid())
174
159
  {
175
 
    fputs("cupsd: Cannot run as a setuid program!\n", stderr);
 
160
    fputs("cupsd: Cannot run as a setuid program\n", stderr);
176
161
    return (1);
177
162
  }
178
163
#endif /* HAVE_GETEUID */
205
190
              if (i >= argc)
206
191
              {
207
192
                _cupsLangPuts(stderr, _("cupsd: Expected config filename "
208
 
                                        "after \"-c\" option!\n"));
 
193
                                        "after \"-c\" option."));
209
194
                usage(1);
210
195
              }
211
196
 
236
221
                if ((current = malloc(1024)) == NULL)
237
222
                {
238
223
                  _cupsLangPuts(stderr,
239
 
                                _("cupsd: Unable to get current directory!\n"));
 
224
                                _("cupsd: Unable to get current directory."));
240
225
                  return (1);
241
226
                }
242
227
 
243
228
                if (!getcwd(current, 1024))
244
229
                {
245
230
                  _cupsLangPuts(stderr,
246
 
                                _("cupsd: Unable to get current directory!\n"));
 
231
                                _("cupsd: Unable to get current directory."));
247
232
                  free(current);
248
233
                  return (1);
249
234
                }
271
256
              fg      = 1;
272
257
#else
273
258
              _cupsLangPuts(stderr, _("cupsd: launchd(8) support not compiled "
274
 
                                      "in, running in normal mode.\n"));
 
259
                                      "in, running in normal mode."));
275
260
              fg = 0;
276
261
#endif /* HAVE_LAUNCHD */
277
262
              break;
304
289
 
305
290
          default : /* Unknown option */
306
291
              _cupsLangPrintf(stderr, _("cupsd: Unknown option \"%c\" - "
307
 
                                        "aborting!\n"), *opt);
 
292
                                        "aborting."), *opt);
308
293
              usage(1);
309
294
              break;
310
295
        }
311
296
    else
312
297
    {
313
 
      _cupsLangPrintf(stderr, _("cupsd: Unknown argument \"%s\" - aborting!\n"),
 
298
      _cupsLangPrintf(stderr, _("cupsd: Unknown argument \"%s\" - aborting."),
314
299
                      argv[i]);
315
300
      usage(1);
316
301
    }
372
357
      }
373
358
      else if (WIFEXITED(i))
374
359
      {
375
 
        fprintf(stderr, "cupsd: Child exited with status %d!\n",
 
360
        fprintf(stderr, "cupsd: Child exited with status %d\n",
376
361
                WEXITSTATUS(i));
377
362
        return (2);
378
363
      }
379
364
      else
380
365
      {
381
 
        fprintf(stderr, "cupsd: Child exited on signal %d!\n", WTERMSIG(i));
 
366
        fprintf(stderr, "cupsd: Child exited on signal %d\n", WTERMSIG(i));
382
367
        return (3);
383
368
      }
384
369
    }
520
505
  */
521
506
 
522
507
  if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot)))
523
 
    cupsd_clean_files(TempDir, NULL);
 
508
    cupsdCleanFiles(TempDir, NULL);
524
509
 
525
 
  cupsd_clean_files(CacheDir, "*.ipp");
 
510
  cupsdCleanFiles(CacheDir, "*.ipp");
526
511
 
527
512
#if HAVE_LAUNCHD
528
513
  if (Launchd)
536
521
  }
537
522
#endif /* HAVE_LAUNCHD */
538
523
 
539
 
#if defined(__APPLE__) && defined(HAVE_DLFCN_H)
540
 
 /*
541
 
  * Load Print Service quota enforcement library (X Server only)
542
 
  */
543
 
 
544
 
  PSQLibRef = dlopen(PSQLibPath, RTLD_LAZY);
545
 
 
546
 
  if (PSQLibRef)
547
 
    PSQUpdateQuotaProc = dlsym(PSQLibRef, PSQLibFuncName);
548
 
#endif /* __APPLE__ && HAVE_DLFCN_H */
549
 
 
550
524
 /*
551
525
  * Startup the server...
552
526
  */
893
867
        cupsArrayCount(PrintingJobs) > 0)
894
868
    {
895
869
      SleepJobs = 0;
896
 
      cupsdStopAllJobs(CUPSD_JOB_DEFAULT, 10);
 
870
      cupsdStopAllJobs(CUPSD_JOB_DEFAULT, 5);
897
871
    }
898
872
#endif /* __APPLE__ */
899
873
 
972
946
      browse_time = current_time;
973
947
    }
974
948
 
 
949
#ifndef HAVE_AUTHORIZATION_H
975
950
   /*
976
951
    * Update the root certificate once every 5 minutes if we have client
977
952
    * connections...
987
962
      cupsdDeleteCert(0);
988
963
      cupsdAddCert(0, "root", NULL);
989
964
    }
 
965
#endif /* !HAVE_AUTHORIZATION_H */
990
966
 
991
967
   /*
992
968
    * Check for new data on the client sockets...
1189
1165
    krb5_free_context(KerberosContext);
1190
1166
#endif /* HAVE_GSSAPI */
1191
1167
 
1192
 
#if defined(__APPLE__) && defined(HAVE_DLFCN_H)
1193
 
 /*
1194
 
  * Unload Print Service quota enforcement library (X Server only)
1195
 
  */
1196
 
 
1197
 
  PSQUpdateQuotaProc = NULL;
1198
 
  if (PSQLibRef)
1199
 
  {
1200
 
    dlclose(PSQLibRef);
1201
 
    PSQLibRef = NULL;
1202
 
  }
1203
 
#endif /* __APPLE__ && HAVE_DLFCN_H */
1204
 
 
1205
1168
#ifdef __sgi
1206
1169
 /*
1207
1170
  * Remove the fake IRIX lpsched lock file, but only if the existing
1252
1215
}
1253
1216
 
1254
1217
/*
 
1218
 * 'cupsdAddString()' - Copy and add a string to an array.
 
1219
 */
 
1220
 
 
1221
int                                     /* O  - 1 on success, 0 on failure */
 
1222
cupsdAddString(cups_array_t **a,        /* IO - String array */
 
1223
               const char   *s)         /* I  - String to copy and add */
 
1224
{
 
1225
  if (!*a)
 
1226
    *a = cupsArrayNew3((cups_array_func_t)strcmp, NULL,
 
1227
                       (cups_ahash_func_t)NULL, 0,
 
1228
                       (cups_acopy_func_t)_cupsStrAlloc,
 
1229
                       (cups_afree_func_t)_cupsStrFree);
 
1230
 
 
1231
  return (cupsArrayAdd(*a, (char *)s));
 
1232
}
 
1233
 
 
1234
 
 
1235
/*
1255
1236
 * 'cupsdCheckProcess()' - Tell the main loop to check for dead children.
1256
1237
 */
1257
1238
 
1267
1248
 
1268
1249
 
1269
1250
/*
1270
 
 * 'cupsdClosePipe()' - Close a pipe as necessary.
1271
 
 */
1272
 
 
1273
 
void
1274
 
cupsdClosePipe(int *fds)                /* I - Pipe file descriptors (2) */
1275
 
{
1276
 
 /*
1277
 
  * Close file descriptors as needed...
1278
 
  */
1279
 
 
1280
 
  if (fds[0] >= 0)
1281
 
  {
1282
 
    close(fds[0]);
1283
 
    fds[0] = -1;
1284
 
  }
1285
 
 
1286
 
  if (fds[1] >= 0)
1287
 
  {
1288
 
    close(fds[1]);
1289
 
    fds[1] = -1;
1290
 
  }
1291
 
}
1292
 
 
1293
 
 
1294
 
/*
1295
 
 * 'cupsdOpenPipe()' - Create a pipe which is closed on exec.
1296
 
 */
1297
 
 
1298
 
int                                     /* O - 0 on success, -1 on error */
1299
 
cupsdOpenPipe(int *fds)                 /* O - Pipe file descriptors (2) */
1300
 
{
1301
 
 /*
1302
 
  * Create the pipe...
1303
 
  */
1304
 
 
1305
 
  if (pipe(fds))
1306
 
  {
1307
 
    fds[0] = -1;
1308
 
    fds[1] = -1;
1309
 
 
1310
 
    return (-1);
1311
 
  }
1312
 
 
1313
 
 /*
1314
 
  * Set the "close on exec" flag on each end of the pipe...
1315
 
  */
1316
 
 
1317
 
  if (fcntl(fds[0], F_SETFD, fcntl(fds[0], F_GETFD) | FD_CLOEXEC))
1318
 
  {
1319
 
    close(fds[0]);
1320
 
    close(fds[1]);
1321
 
 
1322
 
    fds[0] = -1;
1323
 
    fds[1] = -1;
1324
 
 
1325
 
    return (-1);
1326
 
  }
1327
 
 
1328
 
  if (fcntl(fds[1], F_SETFD, fcntl(fds[1], F_GETFD) | FD_CLOEXEC))
1329
 
  {
1330
 
    close(fds[0]);
1331
 
    close(fds[1]);
1332
 
 
1333
 
    fds[0] = -1;
1334
 
    fds[1] = -1;
1335
 
 
1336
 
    return (-1);
1337
 
  }
1338
 
 
1339
 
 /*
1340
 
  * Return 0 indicating success...
1341
 
  */
1342
 
 
1343
 
  return (0);
1344
 
}
1345
 
 
1346
 
 
1347
 
/*
1348
1251
 * 'cupsdClearString()' - Clear a string.
1349
1252
 */
1350
1253
 
1360
1263
 
1361
1264
 
1362
1265
/*
 
1266
 * 'cupsdFreeStrings()' - Free an array of strings.
 
1267
 */
 
1268
 
 
1269
void
 
1270
cupsdFreeStrings(cups_array_t **a)      /* IO - String array */
 
1271
{
 
1272
  if (*a)
 
1273
  {
 
1274
    cupsArrayDelete(*a);
 
1275
    *a = NULL;
 
1276
  }
 
1277
}
 
1278
 
 
1279
 
 
1280
/*
1363
1281
 * 'cupsdHoldSignals()' - Hold child and termination signals.
1364
1282
 */
1365
1283
 
1463
1381
}
1464
1382
 
1465
1383
 
1466
 
/*
1467
 
 * 'cupsd_clean_files()' - Clean out old files.
1468
 
 */
1469
 
 
1470
 
static void
1471
 
cupsd_clean_files(const char *path,     /* I - Directory to clean */
1472
 
                  const char *pattern)  /* I - Filename pattern or NULL */
1473
 
{
1474
 
  cups_dir_t    *dir;                   /* Directory */
1475
 
  cups_dentry_t *dent;                  /* Directory entry */
1476
 
  char          filename[1024];         /* Filename */
1477
 
  int           status;                 /* Status from unlink/rmdir */
1478
 
 
1479
 
 
1480
 
  cupsdLogMessage(CUPSD_LOG_DEBUG,
1481
 
                  "cupsd_clean_files(path=\"%s\", pattern=\"%s\")", path,
1482
 
                  pattern ? pattern : "(null)");
1483
 
 
1484
 
  if ((dir = cupsDirOpen(path)) == NULL)
1485
 
  {
1486
 
    cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open directory \"%s\" - %s",
1487
 
                    path, strerror(errno));
1488
 
    return;
1489
 
  }
1490
 
 
1491
 
  cupsdLogMessage(CUPSD_LOG_INFO, "Cleaning out old files in \"%s\"...", path);
1492
 
 
1493
 
  while ((dent = cupsDirRead(dir)) != NULL)
1494
 
  {
1495
 
    if (pattern && fnmatch(pattern, dent->filename, 0))
1496
 
      continue;
1497
 
 
1498
 
    snprintf(filename, sizeof(filename), "%s/%s", path, dent->filename);
1499
 
 
1500
 
    if (S_ISDIR(dent->fileinfo.st_mode))
1501
 
    {
1502
 
      cupsd_clean_files(filename, pattern);
1503
 
 
1504
 
      status = rmdir(filename);
1505
 
    }
1506
 
    else
1507
 
      status = unlink(filename);
1508
 
 
1509
 
    if (status)
1510
 
      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove \"%s\" - %s", filename,
1511
 
                      strerror(errno));
1512
 
    else
1513
 
      cupsdLogMessage(CUPSD_LOG_DEBUG, "Removed \"%s\"...", filename);
1514
 
  }
1515
 
 
1516
 
  cupsDirClose(dir);
1517
 
}
1518
 
 
1519
 
 
1520
1384
#ifdef HAVE_LAUNCHD
1521
1385
/*
1522
1386
 * 'launchd_checkin()' - Check-in with launchd and collect the listening fds.
1527
1391
{
1528
1392
  size_t                i,              /* Looping var */
1529
1393
                        count;          /* Number of listeners */
1530
 
#  ifdef HAVE_SSL
1531
 
  int                   portnum;        /* Port number */
1532
 
#  endif /* HAVE_SSL */
1533
1394
  launch_data_t         ld_msg,         /* Launch data message */
1534
1395
                        ld_resp,        /* Launch data response */
1535
1396
                        ld_array,       /* Launch data array */
1661
1522
        lis->fd = fd;
1662
1523
 
1663
1524
#  ifdef HAVE_SSL
1664
 
        portnum = 0;
1665
 
 
1666
 
#    ifdef AF_INET6
1667
 
        if (lis->address.addr.sa_family == AF_INET6)
1668
 
          portnum = ntohs(lis->address.ipv6.sin6_port);
1669
 
        else
1670
 
#    endif /* AF_INET6 */
1671
 
        if (lis->address.addr.sa_family == AF_INET)
1672
 
          portnum = ntohs(lis->address.ipv4.sin_port);
1673
 
 
1674
 
        if (portnum == 443)
 
1525
        if (_httpAddrPort(&(lis->address)) == 443)
1675
1526
          lis->encryption = HTTP_ENCRYPT_ALWAYS;
1676
1527
#  endif /* HAVE_SSL */
1677
1528
      }
1837
1688
            {
1838
1689
              strlcpy(job->printer->state_message, message,
1839
1690
                       sizeof(job->printer->state_message));
1840
 
              cupsdAddPrinterHistory(job->printer);
1841
1691
            }
1842
1692
 
1843
1693
            if (!job->attrs)
1869
1719
        {
1870
1720
          for (i = 0; job->filters[i] < 0; i ++);
1871
1721
 
1872
 
          if (!job->filters[i])
 
1722
          if (!job->filters[i] &&
 
1723
              (!job->printer->pc || !job->printer->pc->single_file ||
 
1724
               job->backend <= 0))
1873
1725
          {
1874
1726
           /*
1875
1727
            * Process the next file...
1913
1765
    else if (status)
1914
1766
    {
1915
1767
      if (WIFEXITED(status))
1916
 
        cupsdLogMessage(CUPSD_LOG_DEBUG, "PID %d (%s) stopped with status %d!",
1917
 
                        pid, name, WEXITSTATUS(status));
 
1768
      {
 
1769
        int code = WEXITSTATUS(status); /* Exit code */
 
1770
 
 
1771
        if (code > 100)
 
1772
          cupsdLogMessage(CUPSD_LOG_DEBUG,
 
1773
                          "PID %d (%s) stopped with status %d (%s)", pid, name,
 
1774
                          code, strerror(code - 100));
 
1775
        else
 
1776
          cupsdLogMessage(CUPSD_LOG_DEBUG,
 
1777
                          "PID %d (%s) stopped with status %d.", pid, name,
 
1778
                          code);
 
1779
      }
1918
1780
      else
1919
 
        cupsdLogMessage(CUPSD_LOG_ERROR, "PID %d (%s) crashed on signal %d!",
 
1781
        cupsdLogMessage(CUPSD_LOG_ERROR, "PID %d (%s) crashed on signal %d.",
1920
1782
                        pid, name, WTERMSIG(status));
1921
1783
 
1922
1784
      if (LogLevel < CUPSD_LOG_DEBUG)
2227
2089
static void
2228
2090
usage(int status)                       /* O - Exit status */
2229
2091
{
2230
 
  _cupsLangPuts(status ? stderr : stdout,
2231
 
                _("Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
2232
 
                  "\n"
2233
 
                  "-c config-file      Load alternate configuration file\n"
2234
 
                  "-f                  Run in the foreground\n"
2235
 
                  "-F                  Run in the foreground but detach\n"
2236
 
                  "-h                  Show this usage message\n"
2237
 
                  "-l                  Run cupsd from launchd(8)\n"));
 
2092
  FILE  *fp = status ? stderr : stdout; /* Output file */
 
2093
 
 
2094
 
 
2095
  _cupsLangPuts(fp, _("Usage: cupsd [options]"));
 
2096
  _cupsLangPuts(fp, _("Options:"));
 
2097
  _cupsLangPuts(fp, _("  -c config-file          Load alternate configuration "
 
2098
                      "file."));
 
2099
  _cupsLangPuts(fp, _("  -f                      Run in the foreground."));
 
2100
  _cupsLangPuts(fp, _("  -F                      Run in the foreground but "
 
2101
                      "detach from console."));
 
2102
  _cupsLangPuts(fp, _("  -h                      Show this usage message."));
 
2103
  _cupsLangPuts(fp, _("  -l                      Run cupsd from launchd(8)."));
 
2104
  _cupsLangPuts(fp, _("  -t                      Test the configuration "
 
2105
                      "file."));
 
2106
 
2238
2107
  exit(status);
2239
2108
}
2240
2109
 
2241
2110
 
2242
2111
/*
2243
 
 * End of "$Id: main.c 9310 2010-09-21 22:34:57Z mike $".
 
2112
 * End of "$Id: main.c 9783 2011-05-18 20:44:16Z mike $".
2244
2113
 */