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
[] = {
47 "/Library/WindowMaker",
48 "/Library/WindowMaker/Backgrounds",
49 "/Library/WindowMaker/IconSets",
50 "/Library/WindowMaker/Pixmaps",
51 "/Library/WindowMaker/SoundSets",
52 "/Library/WindowMaker/Sounds",
53 "/Library/WindowMaker/Styles",
54 "/Library/WindowMaker/Themes",
59 char *RequiredFiles
[] = {
60 "/Defaults/WindowMaker",
61 "/Defaults/WMWindowAttributes",
76 wlog(const char *msg
, ...)
83 vsprintf(buf
, msg
, args
);
92 alert(const char *msg
, ...)
99 vsprintf(buf
, msg
, args
);
101 WMRunAlertPanel(scr
, NULL
, _("Error"),
102 buffer
, _("OK"), NULL
, NULL
);
109 ask(char *title
, char *yes
, char *no
, const char *msg
, ...)
116 vsprintf(buf
, msg
, args
);
118 WMRunAlertPanel(scr
, NULL
, title
,
119 buffer
, yes
, no
, NULL
);
126 renameName(char *path
)
128 char *buf
= wmalloc(strlen(path
)+8);
131 sprintf(buf
, "%s~", path
);
133 if (access(buf
, F_OK
) < 0) {
137 for (i
= 0; i
< 10; i
++) {
138 sprintf(buf
, "%s~%i", path
, i
);
140 if (access(buf
, F_OK
) < 0) {
145 sprintf(buf
, "%s~", path
);
153 showFileError(int error
, Bool directory
, char *path
)
158 alert(_("The directory %s needs to be fully accessible, but is\n"
159 "not. Make sure all of it's parent directories have\n"
160 "read and execute permissions set."), path
);
162 alert(_("The file %s needs to be fully accessible, but is not.\n"
163 "Make sure it has read and write permissions set and\n"
164 "all of it's parent directories have read and execute\n"
165 "permissions."), path
);
170 alert(_("The %s %s is in a read-only file system, but it needs to be\n"
171 "writable. Start wmaker with the --static command line option."),
172 directory
? _("directory") : _("file"), path
);
176 alert(_("An error occurred while accessing the %s %s. Please make sure\n"
177 "it exists and is accessible.\n%s"),
178 directory
? _("directory") : _("file"), path
,
187 checkDir(char *path
, Bool fatal
)
189 if (access(path
, F_OK
) < 0) {
190 if (mkdir(path
, 0775) < 0) {
191 alert(_("could not create directory %s\n%s"), path
,
195 wlog(_("created directory %s"), path
);
199 if (access(path
, R_OK
|W_OK
|X_OK
) == 0) {
202 wsyserror("bad access to directory %s", path
);
207 if (stat(path
, &buf
) < 0) {
208 alert(_("The directory %s could not be stat()ed. Please make sure\n"
209 "it exists and is accessible."), path
);
214 char *newName
= renameName(path
);
216 if (ask(_("Rename"), _("OK"), _("Cancel"),
217 _("A directory named %s needs to be created but a file with\n"
218 "the same name already exists. The file will be renamed to\n"
219 "%s and the directory will be created."),
222 if (rename(path
, newName
) < 0) {
223 alert(_("Could not rename %s to %s:%s"),
224 path
, newName
, wstrerror(errno
));
231 if (!(buf
.st_mode
& S_IRWXU
)) {
232 if (chmod(path
, (buf
.st_mode
& 00077)|7) < 0) {
237 return checkDir(path
, True
);
240 showFileError(errno
, True
, path
);
249 checkFile(char *path
)
251 if (access(path
, F_OK
|R_OK
|W_OK
) == 0) {
255 showFileError(errno
, False
, path
);
263 checkCurrentSetup(char *home
)
268 if (!checkDir(home
, False
)) {
269 wlog("couldnt make directory %s", home
);
273 for (p
= RequiredDirectories
; p
!= NULL
; p
++) {
274 sprintf(path
, "%s%s", home
, p
);
275 if (!checkDir(p
, False
)) {
276 wlog("couldnt make directory %s", p
);
281 for (p
= RequiredFiles
; p
!= NULL
; p
++) {
282 sprintf(path
, "%s%s", home
, p
);
283 if (!checkFile(p
, False
)) {
294 copyAllFiles(char *gsdir
)
301 /* copy misc data files */
303 sprintf(path
, "%s/USER_FILES", DATADIR
);
305 f
= fopen(path
, "rb");
307 if (!fgets(file
, 255, f
)) {
310 sprintf(path
, "%s/%s", DATADIR
, file
);
311 sprintf(target
, "%s/Library/WindowMaker/%s", gsdir
, file
);
312 if (!copyFile(path
, target
)) {
318 /* copy auto{start,finish} scripts */
321 /* select and copy menu */
324 /* copy Defaults stuff */
326 sprintf(path
, "%s/USER_FILES", ETCDIR
);
328 f
= fopen(path
, "rb");
330 if (!fgets(path
, 255, f
)) {
333 sprintf(path
, "%s/%s", ETCDIR
, file
);
334 sprintf(target
, "%s/Defaults/%s", gsdir
, file
);
335 if (!copyFile(path
, target
)) {
348 showFinishSplash(char *gsdir
)
353 win
= WMCreateWindow(scr
, "finished");
359 main(int argc
, char **argv
)
365 for (i
=1; i
<argc
; i
++) {
366 if (strcmp(argv
[i
], "-display")==0) {
369 wwarning(_("too few arguments for %s"), argv
[i
-1]);
372 DisplayName
= argv
[i
];
373 } else if (strcmp(argv
[i
], "-version")==0
374 || strcmp(argv
[i
], "--version")==0) {
380 WMInitializeApplication("WMSetup", &argc
, argv
);
382 dpy
= XOpenDisplay("");
384 printf("could not open display\n");
388 scr
= WMCreateScreen(dpy
, DefaultScreen(dpy
));
390 gsdir
= wusergnusteppath();
392 /* check directory structure and copy files */
393 if (access(gsdir
, F_OK
) != 0) {
394 if (!ask(_("Window Maker"), _("OK"), _("Cancel"),
395 _("Window Maker will create a directory named %s, where\n"
396 "it will store it's configuration files and other data."),
398 alert(_("Window Maker will be started in 'static' mode, where\n"
399 "it will use default configuration and will not write\n"
400 "any information to disk."));
405 if (checkCurrentSetup(gsdir
)) {
406 printf(_("%s: wmaker configuration files already installed\n"),
411 if (!copyAllFiles(gsdir
)) {
412 alert(_("An error occurred while doing user specific setup of\n"
413 "Window Maker. It will be started in 'static' mode, where\n"
414 "the default configuration will be used and it will not write\n"
415 "any information to disk."));
419 showFinishSplash(gsdir
);