Imported Upstream version 3.1.0
[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     /*
55      * Configure program for internationalization:
56      *   1) Only set the message locale for now.
57      *   2) Set textdomain for all amanda related programs to "amanda"
58      *      We don't want to be forced to support dozens of message catalogs.
59      */  
60     setlocale(LC_MESSAGES, "C");
61     textdomain("amanda"); 
62
63     safe_fd(-1, 0);
64     safe_cd();
65
66     set_pname("runtar");
67
68     /* Don't die when child closes pipe */
69     signal(SIGPIPE, SIG_IGN);
70
71     dbopen(DBG_SUBDIR_CLIENT);
72     config_init(CONFIG_INIT_CLIENT, NULL);
73
74     if (argc < 3) {
75         error(_("Need at least 3 arguments\n"));
76         /*NOTREACHED*/
77     }
78
79     dbprintf(_("version %s\n"), VERSION);
80
81     if (strcmp(argv[3], "--create") != 0) {
82         error(_("Can only be used to create tar archives\n"));
83         /*NOTREACHED*/
84     }
85
86 #ifndef GNUTAR
87
88     g_fprintf(stderr,_("gnutar not available on this system.\n"));
89     dbprintf(_("%s: gnutar not available on this system.\n"), argv[0]);
90     dbclose();
91     return 1;
92
93 #else
94
95     /*
96      * Print out version information for tar.
97      */
98     do {
99         FILE *  version_file;
100         char    version_buf[80];
101
102         if ((version_file = popen(GNUTAR " --version 2>&1", "r")) != NULL) {
103             if (fgets(version_buf, (int)sizeof(version_buf), version_file) != NULL) {
104                 dbprintf(_(GNUTAR " version: %s\n"), version_buf);
105             } else {
106                 if (ferror(version_file)) {
107                     dbprintf(_(GNUTAR " version: Read failure: %s\n"), strerror(errno));
108                 } else {
109                     dbprintf(_(GNUTAR " version: Read failure; EOF\n"));
110                 }
111             }
112         } else {
113             dbprintf(_(GNUTAR " version: unavailable: %s\n"), strerror(errno));
114         }
115     } while(0);
116
117 #ifdef WANT_SETUID_CLIENT
118     check_running_as(RUNNING_AS_CLIENT_LOGIN | RUNNING_AS_UID_ONLY);
119     if (!become_root()) {
120         error(_("error [%s could not become root (is the setuid bit set?)]\n"), get_pname());
121         /*NOTREACHED*/
122     }
123 #else
124     check_running_as(RUNNING_AS_CLIENT_LOGIN);
125 #endif
126
127     /* skip argv[0] */
128     argc--;
129     argv++;
130
131     dbprintf(_("config: %s\n"), argv[0]);
132     if (strcmp(argv[0], "NOCONFIG") != 0)
133         dbrename(argv[0], DBG_SUBDIR_CLIENT);
134     argc--;
135     argv++;
136
137     cmdline = stralloc(GNUTAR);
138     for (i = 1; argv[i]; i++) {
139         char *quoted;
140
141         quoted = quote_string(argv[i]);
142         cmdline = vstrextend(&cmdline, " ", quoted, NULL);
143         amfree(quoted);
144     }
145     dbprintf(_("running: %s\n"), cmdline);
146     amfree(cmdline);
147
148     dbf = dbfn();
149     if (dbf) {
150         dbf = stralloc(dbf);
151     }
152     dbclose();
153
154     execve(GNUTAR, argv, safe_env());
155
156     e = strerror(errno);
157     dbreopen(dbf, "more");
158     amfree(dbf);
159     dbprintf(_("execve of %s failed (%s)\n"), GNUTAR, e);
160     dbclose();
161
162     g_fprintf(stderr, _("runtar: could not exec %s: %s\n"), GNUTAR, e);
163     return 1;
164 #endif
165 }