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"
40 char *RequiredDirectories
[] = {
44 "/Library/WindowMaker",
45 "/Library/WindowMaker/Backgrounds",
46 "/Library/WindowMaker/IconSets",
47 "/Library/WindowMaker/Pixmaps",
48 "/Library/WindowMaker/CachedPixmaps",
49 "/Library/WindowMaker/SoundSets",
50 "/Library/WindowMaker/Sounds",
51 "/Library/WindowMaker/Styles",
52 "/Library/WindowMaker/Themes",
53 "/Library/WindowMaker/WPrefs",
57 char *RequiredFiles
[] = {
58 "/Defaults/WindowMaker",
59 "/Defaults/WMWindowAttributes",
68 void wlog(const char *msg
, ...)
75 vsprintf(buf
, msg
, args
);
82 void alert(const char *msg
, ...)
89 vsprintf(buf
, msg
, args
);
91 WMRunAlertPanel(scr
, NULL
, _("Error"), buffer
, _("OK"), NULL
, NULL
);
96 Bool
ask(char *title
, char *yes
, char *no
, const char *msg
, ...)
103 vsprintf(buf
, msg
, args
);
105 WMRunAlertPanel(scr
, NULL
, title
, buffer
, yes
, no
, NULL
);
110 char *renameName(char *path
)
112 char *buf
= wmalloc(strlen(path
) + 8);
115 sprintf(buf
, "%s~", path
);
117 if (access(buf
, F_OK
) < 0) {
121 for (i
= 0; i
< 10; i
++) {
122 sprintf(buf
, "%s~%i", path
, i
);
124 if (access(buf
, F_OK
) < 0) {
129 sprintf(buf
, "%s~", path
);
134 void showFileError(int error
, Bool directory
, char *path
)
139 alert(_("The directory %s needs to be fully accessible, but is\n"
140 "not. Make sure all of it's parent directories have\n"
141 "read and execute permissions set."), path
);
143 alert(_("The file %s needs to be fully accessible, but is not.\n"
144 "Make sure it has read and write permissions set and\n"
145 "all of it's parent directories have read and execute\n" "permissions."), path
);
150 alert(_("The %s %s is in a read-only file system, but it needs to be\n"
151 "writable. Start wmaker with the --static command line option."),
152 directory
? _("directory") : _("file"), path
);
156 alert(_("An error occurred while accessing the %s %s. Please make sure\n"
157 "it exists and is accessible.\n%s"),
158 directory
? _("directory") : _("file"), path
, wstrerror(error
));
163 Bool
checkDir(char *path
, Bool fatal
)
165 if (access(path
, F_OK
) < 0) {
166 if (mkdir(path
, 0775) < 0) {
167 alert(_("could not create directory %s\n%s"), path
, wstrerror(errno
));
170 wlog(_("created directory %s"), path
);
174 if (access(path
, R_OK
| W_OK
| X_OK
) == 0) {
177 wsyserror("bad access to directory %s", path
);
182 if (stat(path
, &buf
) < 0) {
183 alert(_("The directory %s could not be stat()ed. Please make sure\n"
184 "it exists and is accessible."), path
);
189 char *newName
= renameName(path
);
191 if (ask(_("Rename"), _("OK"), _("Cancel"),
192 _("A directory named %s needs to be created but a file with\n"
193 "the same name already exists. The file will be renamed to\n"
194 "%s and the directory will be created."), path
, newName
)) {
196 if (rename(path
, newName
) < 0) {
197 alert(_("Could not rename %s to %s:%s"), path
, newName
, wstrerror(errno
));
204 if (!(buf
.st_mode
& S_IRWXU
)) {
205 if (chmod(path
, (buf
.st_mode
& 00077) | 7) < 0) {
210 return checkDir(path
, True
);
213 showFileError(errno
, True
, path
);
218 Bool
checkFile(char *path
)
220 if (access(path
, F_OK
| R_OK
| W_OK
) == 0) {
224 showFileError(errno
, False
, path
);
229 Bool
checkCurrentSetup(char *home
)
234 if (!checkDir(home
, False
)) {
235 wlog("couldnt make directory %s", home
);
239 for (p
= RequiredDirectories
; p
!= NULL
; p
++) {
240 sprintf(path
, "%s%s", home
, p
);
241 if (!checkDir(p
, False
)) {
242 wlog("couldnt make directory %s", p
);
247 for (p
= RequiredFiles
; p
!= NULL
; p
++) {
248 sprintf(path
, "%s%s", home
, p
);
249 if (!checkFile(p
, False
)) {
257 Bool
copyAllFiles(char *gsdir
)
264 /* copy misc data files */
266 sprintf(path
, "%s/USER_FILES", DATADIR
);
268 f
= fopen(path
, "rb");
270 if (!fgets(file
, 255, f
)) {
273 sprintf(path
, "%s/%s", DATADIR
, file
);
274 sprintf(target
, "%s/Library/WindowMaker/%s", gsdir
, file
);
275 if (!copyFile(path
, target
)) {
281 /* copy auto{start,finish} scripts */
283 /* select and copy menu */
285 /* copy Defaults stuff */
287 sprintf(path
, "%s/USER_FILES", ETCDIR
);
289 f
= fopen(path
, "rb");
291 if (!fgets(path
, 255, f
)) {
294 sprintf(path
, "%s/%s", ETCDIR
, file
);
295 sprintf(target
, "%s/Defaults/%s", gsdir
, file
);
296 if (!copyFile(path
, target
)) {
306 void showFinishSplash(char *gsdir
)
311 win
= WMCreateWindow(scr
, "finished");
315 int main(int argc
, char **argv
)
321 for (i
= 1; i
< argc
; i
++) {
322 if (strcmp(argv
[i
], "-display") == 0) {
325 wwarning(_("too few arguments for %s"), argv
[i
- 1]);
328 DisplayName
= argv
[i
];
329 } else if (strcmp(argv
[i
], "-version") == 0 || strcmp(argv
[i
], "--version") == 0) {
335 WMInitializeApplication("WMSetup", &argc
, argv
);
337 dpy
= XOpenDisplay("");
339 printf("could not open display\n");
343 scr
= WMCreateScreen(dpy
, DefaultScreen(dpy
));
345 gsdir
= wusergnusteppath();
347 /* check directory structure and copy files */
348 if (access(gsdir
, F_OK
) != 0) {
349 if (!ask(_("Window Maker"), _("OK"), _("Cancel"),
350 _("Window Maker will create a directory named %s, where\n"
351 "it will store it's configuration files and other data."), gsdir
)) {
352 alert(_("Window Maker will be started in 'static' mode, where\n"
353 "it will use default configuration and will not write\n"
354 "any information to disk."));
359 if (checkCurrentSetup(gsdir
)) {
360 printf(_("%s: wmaker configuration files already installed\n"), argv
[0]);
364 if (!copyAllFiles(gsdir
)) {
365 alert(_("An error occurred while doing user specific setup of\n"
366 "Window Maker. It will be started in 'static' mode, where\n"
367 "the default configuration will be used and it will not write\n"
368 "any information to disk."));
372 showFinishSplash(gsdir
);