1 /* wmsetup.c- create wmaker config file dir structure and copy default
4 * Copyright (c) 2000-2003 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.
26 #define PROG_VERSION "wmsetup 0.0 (Window Maker)"
33 #include <sys/types.h>
36 #include <WINGs/WINGs.h>
38 #include "../src/config.h"
42 char *RequiredDirectories
[] = {
46 "/Library/WindowMaker",
47 "/Library/WindowMaker/Backgrounds",
48 "/Library/WindowMaker/IconSets",
49 "/Library/WindowMaker/Pixmaps",
50 "/Library/WindowMaker/CachedPixmaps",
51 "/Library/WindowMaker/SoundSets",
52 "/Library/WindowMaker/Sounds",
53 "/Library/WindowMaker/Styles",
54 "/Library/WindowMaker/Themes",
55 "/Library/WindowMaker/WPrefs",
60 char *RequiredFiles
[] = {
61 "/Defaults/WindowMaker",
62 "/Defaults/WMWindowAttributes",
77 wlog(const char *msg
, ...)
84 vsprintf(buf
, msg
, args
);
93 alert(const char *msg
, ...)
100 vsprintf(buf
, msg
, args
);
102 WMRunAlertPanel(scr
, NULL
, _("Error"),
103 buffer
, _("OK"), NULL
, NULL
);
110 ask(char *title
, char *yes
, char *no
, const char *msg
, ...)
117 vsprintf(buf
, msg
, args
);
119 WMRunAlertPanel(scr
, NULL
, title
,
120 buffer
, yes
, no
, NULL
);
127 renameName(char *path
)
129 char *buf
= wmalloc(strlen(path
)+8);
132 sprintf(buf
, "%s~", path
);
134 if (access(buf
, F_OK
) < 0) {
138 for (i
= 0; i
< 10; i
++) {
139 sprintf(buf
, "%s~%i", path
, i
);
141 if (access(buf
, F_OK
) < 0) {
146 sprintf(buf
, "%s~", path
);
154 showFileError(int error
, Bool directory
, char *path
)
159 alert(_("The directory %s needs to be fully accessible, but is\n"
160 "not. Make sure all of it's parent directories have\n"
161 "read and execute permissions set."), path
);
163 alert(_("The file %s needs to be fully accessible, but is not.\n"
164 "Make sure it has read and write permissions set and\n"
165 "all of it's parent directories have read and execute\n"
166 "permissions."), path
);
171 alert(_("The %s %s is in a read-only file system, but it needs to be\n"
172 "writable. Start wmaker with the --static command line option."),
173 directory
? _("directory") : _("file"), path
);
177 alert(_("An error occurred while accessing the %s %s. Please make sure\n"
178 "it exists and is accessible.\n%s"),
179 directory
? _("directory") : _("file"), path
,
188 checkDir(char *path
, Bool fatal
)
190 if (access(path
, F_OK
) < 0) {
191 if (mkdir(path
, 0775) < 0) {
192 alert(_("could not create directory %s\n%s"), path
,
196 wlog(_("created directory %s"), path
);
200 if (access(path
, R_OK
|W_OK
|X_OK
) == 0) {
203 wsyserror("bad access to directory %s", path
);
208 if (stat(path
, &buf
) < 0) {
209 alert(_("The directory %s could not be stat()ed. Please make sure\n"
210 "it exists and is accessible."), path
);
215 char *newName
= renameName(path
);
217 if (ask(_("Rename"), _("OK"), _("Cancel"),
218 _("A directory named %s needs to be created but a file with\n"
219 "the same name already exists. The file will be renamed to\n"
220 "%s and the directory will be created."),
223 if (rename(path
, newName
) < 0) {
224 alert(_("Could not rename %s to %s:%s"),
225 path
, newName
, wstrerror(errno
));
232 if (!(buf
.st_mode
& S_IRWXU
)) {
233 if (chmod(path
, (buf
.st_mode
& 00077)|7) < 0) {
238 return checkDir(path
, True
);
241 showFileError(errno
, True
, path
);
250 checkFile(char *path
)
252 if (access(path
, F_OK
|R_OK
|W_OK
) == 0) {
256 showFileError(errno
, False
, path
);
264 checkCurrentSetup(char *home
)
269 if (!checkDir(home
, False
)) {
270 wlog("couldnt make directory %s", home
);
274 for (p
= RequiredDirectories
; p
!= NULL
; p
++) {
275 sprintf(path
, "%s%s", home
, p
);
276 if (!checkDir(p
, False
)) {
277 wlog("couldnt make directory %s", p
);
282 for (p
= RequiredFiles
; p
!= NULL
; p
++) {
283 sprintf(path
, "%s%s", home
, p
);
284 if (!checkFile(p
, False
)) {
295 copyAllFiles(char *gsdir
)
302 /* copy misc data files */
304 sprintf(path
, "%s/USER_FILES", DATADIR
);
306 f
= fopen(path
, "rb");
308 if (!fgets(file
, 255, f
)) {
311 sprintf(path
, "%s/%s", DATADIR
, file
);
312 sprintf(target
, "%s/Library/WindowMaker/%s", gsdir
, file
);
313 if (!copyFile(path
, target
)) {
319 /* copy auto{start,finish} scripts */
322 /* select and copy menu */
325 /* copy Defaults stuff */
327 sprintf(path
, "%s/USER_FILES", ETCDIR
);
329 f
= fopen(path
, "rb");
331 if (!fgets(path
, 255, f
)) {
334 sprintf(path
, "%s/%s", ETCDIR
, file
);
335 sprintf(target
, "%s/Defaults/%s", gsdir
, file
);
336 if (!copyFile(path
, target
)) {
349 showFinishSplash(char *gsdir
)
354 win
= WMCreateWindow(scr
, "finished");
360 main(int argc
, char **argv
)
366 for (i
=1; i
<argc
; i
++) {
367 if (strcmp(argv
[i
], "-display")==0) {
370 wwarning(_("too few arguments for %s"), argv
[i
-1]);
373 DisplayName
= argv
[i
];
374 } else if (strcmp(argv
[i
], "-version")==0
375 || strcmp(argv
[i
], "--version")==0) {
381 WMInitializeApplication("WMSetup", &argc
, argv
);
383 dpy
= XOpenDisplay("");
385 printf("could not open display\n");
389 scr
= WMCreateScreen(dpy
, DefaultScreen(dpy
));
391 gsdir
= wusergnusteppath();
393 /* check directory structure and copy files */
394 if (access(gsdir
, F_OK
) != 0) {
395 if (!ask(_("Window Maker"), _("OK"), _("Cancel"),
396 _("Window Maker will create a directory named %s, where\n"
397 "it will store it's configuration files and other data."),
399 alert(_("Window Maker will be started in 'static' mode, where\n"
400 "it will use default configuration and will not write\n"
401 "any information to disk."));
406 if (checkCurrentSetup(gsdir
)) {
407 printf(_("%s: wmaker configuration files already installed\n"),
412 if (!copyAllFiles(gsdir
)) {
413 alert(_("An error occurred while doing user specific setup of\n"
414 "Window Maker. It will be started in 'static' mode, where\n"
415 "the default configuration will be used and it will not write\n"
416 "any information to disk."));
420 showFinishSplash(gsdir
);