Imported Upstream version 1.5.3
[platform/upstream/cups.git] / scheduler / cups-exec.c
1 /*
2  * "$Id: cups-exec.c 9931 2011-08-29 20:12:39Z mike $"
3  *
4  *   Sandbox helper for CUPS.
5  *
6  *   Copyright 2007-2011 by Apple Inc.
7  *
8  *   These coded instructions, statements, and computer programs are the
9  *   property of Apple Inc. and are protected by Federal copyright
10  *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
11  *   which should have been included with this file.  If this file is
12  *   file is missing or damaged, see the license at "http://www.cups.org/".
13  *
14  * Usage:
15  *
16  *     cups-exec /path/to/profile /path/to/program argv0 argv1 ... argvN
17  *
18  * Contents:
19  *
20  *   main() - Apply sandbox profile and execute program.
21  */
22
23 /*
24  * Include necessary headers...
25  */
26
27 #include <cups/string-private.h>
28 #include <unistd.h>
29 #ifdef HAVE_SANDBOX_H
30 #  include <sandbox.h>
31 #  ifndef SANDBOX_NAMED_EXTERNAL
32 #    define SANDBOX_NAMED_EXTERNAL  0x0003
33 #  endif /* !SANDBOX_NAMED_EXTERNAL */
34 #endif /* HAVE_SANDBOX_H */
35
36
37 /*
38  * 'main()' - Apply sandbox profile and execute program.
39  */
40
41 int                                     /* O - Exit status */
42 main(int  argc,                         /* I - Number of command-line args */
43      char *argv[])                      /* I - Command-line arguments */
44 {
45   int   i;                              /* Looping var */
46 #ifdef HAVE_SANDBOX_H
47   char  *sandbox_error = NULL;          /* Sandbox error, if any */
48 #endif /* HAVE_SANDBOX_H */
49
50
51  /*
52   * Check that we have enough arguments...
53   */
54
55   if (argc < 4)
56   {
57     puts("Usage: cups-exec /path/to/profile /path/to/program argv0 argv1 ... "
58          "argvN");
59     return (1);
60   }
61
62 #ifdef HAVE_SANDBOX_H
63  /*
64   * Run in a separate security profile...
65   */
66
67   if (strcmp(argv[1], "none") &&
68       sandbox_init(argv[1], SANDBOX_NAMED_EXTERNAL, &sandbox_error))
69   {
70     fprintf(stderr, "DEBUG: sandbox_init failed: %s (%s)\n", sandbox_error,
71             strerror(errno));
72     sandbox_free_error(sandbox_error);
73     return (1);
74   }
75 #endif /* HAVE_SANDBOX_H */
76
77  /*
78   * Close file descriptors we don't need (insurance):
79   *
80   * 0   = stdin
81   * 1   = stdout
82   * 2   = stderr
83   * 3   = back-channel
84   * 4   = side-channel
85   * 5-N = unused
86   */
87
88   for (i = 5; i < 1024; i ++)
89     close(i);
90
91  /*
92   * Execute the program...
93   */
94
95   execv(argv[2], argv + 3);
96
97  /*
98   * If we get here, execv() failed...
99   */
100
101   fprintf(stderr, "DEBUG: execv failed: %s\n", strerror(errno));
102   return (1);
103 }
104
105
106 /*
107  * End of "$Id: cups-exec.c 9931 2011-08-29 20:12:39Z mike $".
108  */