Imported Upstream version 3.3.1
[debian/amanda] / client-src / runtar.c
1 /*
2  * Amanda, The Advanced Maryland Automatic Network Disk Archiver
3  * Copyright (c) 1991-1998 University of Maryland at College Park
4  * All Rights Reserved.
5  *
6  * Permission to use, copy, modify, distribute, and sell this software and its
7  * documentation for any purpose is hereby granted without fee, provided that
8  * the above copyright notice appear in all copies and that both that
9  * copyright notice and this permission notice appear in supporting
10  * documentation, and that the name of U.M. not be used in advertising or
11  * publicity pertaining to distribution of the software without specific,
12  * written prior permission.  U.M. makes no representations about the
13  * suitability of this software for any purpose.  It is provided "as is"
14  * without express or implied warranty.
15  *
16  * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
18  * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
20  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
21  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22  *
23  * Authors: the Amanda Development Team.  Its members are listed in a
24  * file named AUTHORS, in the root directory of this distribution.
25  */
26 /*
27  * $Id: runtar.c,v 1.24 2006/08/25 11:41:31 martinea Exp $
28  *
29  * runs GNUTAR program as root
30  *
31  * argv[0] is the runtar program name
32  * argv[1] is the config name or NOCONFIG
33  * argv[2] will be argv[0] of the gtar program
34  * ...
35  */
36 #include "amanda.h"
37 #include "util.h"
38 #include "conffile.h"
39
40 int main(int argc, char **argv);
41
42 int
43 main(
44     int         argc,
45     char **     argv)
46 {
47 #ifdef GNUTAR
48     int i;
49     char *e;
50     char *dbf;
51     char *cmdline;
52 #endif
53
54     if (argc > 1 && argv && argv[1] && g_str_equal(argv[1], "--version")) {
55         printf("runtar-%s\n", VERSION);
56         return (0);
57     }
58
59     /*
60      * Configure program for internationalization:
61      *   1) Only set the message locale for now.
62      *   2) Set textdomain for all amanda related programs to "amanda"
63      *      We don't want to be forced to support dozens of message catalogs.
64      */  
65     setlocale(LC_MESSAGES, "C");
66     textdomain("amanda"); 
67
68     safe_fd(-1, 0);
69     safe_cd();
70
71     set_pname("runtar");
72
73     /* Don't die when child closes pipe */
74     signal(SIGPIPE, SIG_IGN);
75
76     dbopen(DBG_SUBDIR_CLIENT);
77     config_init(CONFIG_INIT_CLIENT, NULL);
78
79     if (argc < 3) {
80         error(_("Need at least 3 arguments\n"));
81         /*NOTREACHED*/
82     }
83
84     dbprintf(_("version %s\n"), VERSION);
85
86     if (strcmp(argv[3], "--create") != 0) {
87         error(_("Can only be used to create tar archives\n"));
88         /*NOTREACHED*/
89     }
90
91 #ifndef GNUTAR
92
93     g_fprintf(stderr,_("gnutar not available on this system.\n"));
94     dbprintf(_("%s: gnutar not available on this system.\n"), argv[0]);
95     dbclose();
96     return 1;
97
98 #else
99
100     /*
101      * Print out version information for tar.
102      */
103     do {
104         FILE *  version_file;
105         char    version_buf[80];
106
107         if ((version_file = popen(GNUTAR " --version 2>&1", "r")) != NULL) {
108             if (fgets(version_buf, (int)sizeof(version_buf), version_file) != NULL) {
109                 dbprintf(_(GNUTAR " version: %s\n"), version_buf);
110             } else {
111                 if (ferror(version_file)) {
112                     dbprintf(_(GNUTAR " version: Read failure: %s\n"), strerror(errno));
113                 } else {
114                     dbprintf(_(GNUTAR " version: Read failure; EOF\n"));
115                 }
116             }
117         } else {
118             dbprintf(_(GNUTAR " version: unavailable: %s\n"), strerror(errno));
119         }
120     } while(0);
121
122 #ifdef WANT_SETUID_CLIENT
123     check_running_as(RUNNING_AS_CLIENT_LOGIN | RUNNING_AS_UID_ONLY);
124     if (!become_root()) {
125         error(_("error [%s could not become root (is the setuid bit set?)]\n"), get_pname());
126         /*NOTREACHED*/
127     }
128 #else
129     check_running_as(RUNNING_AS_CLIENT_LOGIN);
130 #endif
131
132     /* skip argv[0] */
133     argc--;
134     argv++;
135
136     dbprintf(_("config: %s\n"), argv[0]);
137     if (strcmp(argv[0], "NOCONFIG") != 0)
138         dbrename(argv[0], DBG_SUBDIR_CLIENT);
139     argc--;
140     argv++;
141
142     cmdline = stralloc(GNUTAR);
143     for (i = 1; argv[i]; i++) {
144         char *quoted;
145
146         quoted = quote_string(argv[i]);
147         cmdline = vstrextend(&cmdline, " ", quoted, NULL);
148         amfree(quoted);
149     }
150     dbprintf(_("running: %s\n"), cmdline);
151     amfree(cmdline);
152
153     dbf = dbfn();
154     if (dbf) {
155         dbf = stralloc(dbf);
156     }
157     dbclose();
158
159     execve(GNUTAR, argv, safe_env());
160
161     e = strerror(errno);
162     dbreopen(dbf, "more");
163     amfree(dbf);
164     dbprintf(_("execve of %s failed (%s)\n"), GNUTAR, e);
165     dbclose();
166
167     g_fprintf(stderr, _("runtar: could not exec %s: %s\n"), GNUTAR, e);
168     return 1;
169 #endif
170 }