1 /* wmsetup.c- create wmaker config file dir structure and copy default
4 * Copyright (c) 2000 Alfredo K. Kojima
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #define PROG_VERSION "wmsetup 0.0 (Window Maker)"
32 #include <sys/types.h>
37 #include "../src/config.h"
41 char *RequiredDirectories
[] = {
46 "/Library/WindowMaker",
47 "/Library/WindowMaker/Backgrounds",
48 "/Library/WindowMaker/IconSets",
49 "/Library/WindowMaker/Pixmaps",
50 "/Library/WindowMaker/SoundSets",
51 "/Library/WindowMaker/Sounds",
52 "/Library/WindowMaker/Styles",
53 "/Library/WindowMaker/Themes",
58 char *RequiredFiles
[] = {
59 "/Defaults/WindowMaker",
60 "/Defaults/WMWindowAttributes",
75 wlog(const char *msg
, ...)
82 vsprintf(buf
, msg
, args
);
90 void alert(const char *msg
, ...)
97 vsprintf(buf
, msg
, args
);
99 WMRunAlertPanel(scr
, NULL
, _("Error"),
100 buffer
, _("OK"), NULL
, NULL
);
108 Bool
ask(char *title
, char *yes
, char *no
, const char *msg
, ...)
115 vsprintf(buf
, msg
, args
);
117 WMRunAlertPanel(scr
, NULL
, title
,
118 buffer
, yes
, no
, NULL
);
124 char *renameName(char *path
)
126 char *buf
= wmalloc(strlen(path
)+8);
129 sprintf(buf
, "%s~", path
);
131 if (access(buf
, F_OK
) < 0) {
135 for (i
= 0; i
< 10; i
++) {
136 sprintf(buf
, "%s~%i", path
, i
);
138 if (access(buf
, F_OK
) < 0) {
143 sprintf(buf
, "%s~", path
);
150 void showFileError(int error
, Bool directory
, char *path
)
155 alert(_("The directory %s needs to be fully accessible, but is\n"
156 "not. Make sure all of it's parent directories have\n"
157 "read and execute permissions set."), path
);
159 alert(_("The file %s needs to be fully accessible, but is not.\n"
160 "Make sure it has read and write permissions set and\n"
161 "all of it's parent directories have read and execute\n"
162 "permissions."), path
);
167 alert(_("The %s %s is in a read-only file system, but it needs to be\n"
168 "writable. Start wmaker with the --static command line option."),
169 directory
? _("directory") : _("file"), path
);
173 alert(_("An error occurred while accessing the %s %s. Please make sure\n"
174 "it exists and is accessible.\n%s"),
175 directory
? _("directory") : _("file"), path
,
183 Bool
checkDir(char *path
, Bool fatal
)
185 if (access(path
, F_OK
) < 0) {
186 if (mkdir(path
, 0775) < 0) {
187 alert(_("could not create directory %s\n%s"), path
,
191 wlog(_("created directory %s"), path
);
195 if (access(path
, R_OK
|W_OK
|X_OK
) == 0) {
198 wsyserror("bad access to directory %s", path
);
203 if (stat(path
, &buf
) < 0) {
204 alert(_("The directory %s could not be stat()ed. Please make sure\n"
205 "it exists and is accessible."), path
);
210 char *newName
= renameName(path
);
212 if (ask(_("Rename"), _("OK"), _("Cancel"),
213 _("A directory named %s needs to be created but a file with\n"
214 "the same name already exists. The file will be renamed to\n"
215 "%s and the directory will be created."),
218 if (rename(path
, newName
) < 0) {
219 alert(_("Could not rename %s to %s:%s"),
220 path
, newName
, wstrerror(errno
));
227 if (!(buf
.st_mode
& S_IRWXU
)) {
228 if (chmod(path
, (buf
.st_mode
& 00077)|7) < 0) {
233 return checkDir(path
, True
);
236 showFileError(errno
, True
, path
);
244 Bool
checkFile(char *path
)
246 if (access(path
, F_OK
|R_OK
|W_OK
) == 0) {
250 showFileError(errno
, False
, path
);
257 Bool
checkCurrentSetup(char *home
)
262 if (!checkDir(home
, False
)) {
263 wlog("couldnt make directory %s", home
);
267 for (p
= RequiredDirectories
; p
!= NULL
; p
++) {
268 sprintf(path
, "%s%s", home
, p
);
269 if (!checkDir(p
, False
)) {
270 wlog("couldnt make directory %s", p
);
275 for (p
= RequiredFiles
; p
!= NULL
; p
++) {
276 sprintf(path
, "%s%s", home
, p
);
277 if (!checkFile(p
, False
)) {
287 Bool
copyAllFiles(char *gsdir
)
294 /* copy misc data files */
296 sprintf(path
, "%s/USER_FILES", DATADIR
);
298 f
= fopen(path
, "r");
300 if (!fgets(path
, 255, f
)) {
303 sprintf(path
, "%s/%s", DATADIR
, file
);
304 sprintf(target
, "%s/Library/WindowMaker/%s", gsdir
, file
);
305 if (!copyFile(path
, target
)) {
311 /* copy auto{start,finish} scripts */
314 /* select and copy menu */
317 /* copy Defaults stuff */
319 sprintf(path
, "%s/USER_FILES", ETCDIR
);
321 f
= fopen(path
, "r");
323 if (!fgets(path
, 255, f
)) {
326 sprintf(path
, "%s/%s", ETCDIR
, file
);
327 sprintf(target
, "%s/Defaults/%s", gsdir
, file
);
328 if (!copyFile(path
, target
)) {
340 void showFinishSplash(char *gsdir
)
345 win
= WMCreateWindow(scr
, "finished");
350 int main(int argc
, char **argv
)
356 for (i
=1; i
<argc
; i
++) {
357 if (strcmp(argv
[i
], "-display")==0) {
360 wwarning(_("too few arguments for %s"), argv
[i
-1]);
363 DisplayName
= argv
[i
];
364 } else if (strcmp(argv
[i
], "-version")==0
365 || strcmp(argv
[i
], "--version")==0) {
371 WMInitializeApplication("WMSetup", &argc
, argv
);
373 dpy
= XOpenDisplay("");
375 printf("could not open display\n");
379 scr
= WMCreateScreen(dpy
, DefaultScreen(dpy
));
381 gsdir
= wusergnusteppath();
383 /* check directory structure and copy files */
384 if (access(gsdir
, F_OK
) != 0) {
385 if (!ask(_("Window Maker"), _("OK"), _("Cancel"),
386 _("Window Maker will create a directory named %s, where\n"
387 "it will store it's configuration files and other data."),
389 alert(_("Window Maker will be started in 'static' mode, where\n"
390 "it will use default configuration and will not write\n"
391 "any information to disk."));
396 if (checkCurrentSetup(gsdir
)) {
397 printf(_("%s: wmaker configuration files already installed\n"),
402 if (!copyAllFiles(gsdir
)) {
403 alert(_("An error occurred while doing user specific setup of\n"
404 "Window Maker. It will be started in 'static' mode, where\n"
405 "the default configuration will be used and it will not write\n"
406 "any information to disk."));
410 showFinishSplash(gsdir
);