1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-20 04:48:06 +01:00

WINGs: Simplify and rationalize createDir() and deleteFile()

Signed-off-by: Tamas TEVESZ <ice@extreme.hu>
This commit is contained in:
Tamas TEVESZ
2010-09-23 16:34:56 +02:00
committed by Carlos R. Mafra
parent a8813b2eae
commit 02de600ecd

View File

@@ -67,10 +67,10 @@ static void browserDClick();
static void fillColumn(WMBrowserDelegate * self, WMBrowser * bPtr, int column, WMList * list); static void fillColumn(WMBrowserDelegate * self, WMBrowser * bPtr, int column, WMList * list);
static void deleteFile();
static void normalizePath(char *s); static void normalizePath(char *s);
static void deleteFile();
static void createDir(); static void createDir();
static void goHome(); static void goHome();
@@ -595,7 +595,8 @@ static void showError(WMScreen * scr, WMWindow * owner, char *s, char *file)
static void createDir(WMButton * bPre, WMFilePanel * panel) static void createDir(WMButton * bPre, WMFilePanel * panel)
{ {
char *dirName, *directory, *file, *s; char *dirName, *directory, *file;
size_t slen;
WMScreen *scr = WMWidgetScreen(panel->win); WMScreen *scr = WMWidgetScreen(panel->win);
dirName = WMRunInputPanel(scr, panel->win, _("Create Directory"), dirName = WMRunInputPanel(scr, panel->win, _("Create Directory"),
@@ -603,55 +604,43 @@ static void createDir(WMButton * bPre, WMFilePanel * panel)
if (!dirName) if (!dirName)
return; return;
directory = getCurrentFileName(panel); /* if `dirName' is an absolute path, don't mind `directory'.
s = strrchr(directory, '/'); * normalize as needed (possibly not needed at all?) */
if (s) normalizePath(dirName);
s[1] = 0; if (*dirName != '/') {
directory = getCurrentFileName(panel);
if (dirName[0] == '/') { normalizePath(directory);
directory[0] = 0;
} else { } else {
while ((s = strstr(directory, "//"))) { directory = NULL;
int i;
for (i = 2; s[i] == '/'; i++) ;
strcpy(s, &s[i - 1]);
}
if ((s = strrchr(directory, '/')) && !s[1])
s[0] = 0;
}
while ((s = strstr(dirName, "//"))) {
int i;
for (i = 2; s[i] == '/'; i++) ;
strcpy(s, &s[i - 1]);
}
if ((s = strrchr(dirName, '/')) && !s[1])
s[0] = 0;
file = wmalloc(strlen(dirName) + strlen(directory) + 4);
sprintf(file, "%s/%s", directory, dirName);
while ((s = strstr(file, "//"))) {
int i;
for (i = 2; s[i] == '/'; i++) ;
strcpy(s, &s[i - 1]);
} }
if (mkdir(file, 0xfff) != 0) { slen = strlen(dirName) + (directory ? strlen(directory) + 1 /* "/" */ : 0) + 1 /* NULL */;
switch (errno) { file = wmalloc(slen);
case EACCES:
showError(scr, panel->win, _("Permission denied."), NULL); if (directory) {
break; strncpy(file, directory, slen - 1);
case EEXIST: strncat(file, "/", slen - strlen(file));
showError(scr, panel->win, _("'%s' already exists."), file); }
break;
case ENOENT: strncat(file, dirName, slen - strlen(file));
showError(scr, panel->win, _("Path does not exist."), NULL);
} if (mkdir(file, 00777) != 0) {
} else #define __msgbufsize__ 512
char *buffer = wmalloc(__msgbufsize__);
snprintf(buffer, __msgbufsize__, _("Can not create %s: %s"), file, strerror(errno));
showError(scr, panel->win, buffer, NULL);
wfree(buffer);
#undef __msgbufsize__
} else {
WMSetFilePanelDirectory(panel, file); WMSetFilePanelDirectory(panel, file);
}
wfree(dirName); if (dirName)
wfree(directory); wfree(dirName);
wfree(file); if (directory)
wfree(directory);
if (file)
wfree(file);
} }
/* /*
@@ -686,105 +675,44 @@ static void normalizePath(char *s)
static void deleteFile(WMButton * bPre, WMFilePanel * panel) static void deleteFile(WMButton * bPre, WMFilePanel * panel)
{ {
char *file; char *file, *buffer;
char *buffer, *s;
struct stat filestat; struct stat filestat;
WMScreen *scr = WMWidgetScreen(panel->win); WMScreen *scr = WMWidgetScreen(panel->win);
#define __msgbufsize__ 512
buffer = wmalloc(__msgbufsize__);
file = getCurrentFileName(panel); file = getCurrentFileName(panel);
normalizePath(file);
while ((s = strstr(file, "//"))) { if (stat(file, &filestat) == -1) {
int i; snprintf(buffer, __msgbufsize__, _("Can not find %s: %s"), file, strerror(errno));
for (i = 2; s[i] == '/'; i++) ; showError(scr, panel->win, buffer, NULL);
strcpy(s, &s[i - 1]); goto out;
} }
if (strlen(file) > 1 && (s = strrchr(file, '/')) && !s[1])
s[0] = 0;
if (stat(file, &filestat)) { snprintf(buffer, __msgbufsize__, _("Delete %s %s?"),
switch (errno) { S_ISDIR(filestat.st_mode) ? _("directory") : _("file"), file);
case ENOENT:
showError(scr, panel->win, _("'%s' does not exist."), file);
break;
case EACCES:
showError(scr, panel->win, _("Permission denied."), NULL);
break;
case ENOMEM:
showError(scr, panel->win, _("Insufficient memory available."), NULL);
break;
case EROFS:
showError(scr, panel->win, _("'%s' is on a read-only filesystem."), file);
break;
default:
showError(scr, panel->win, _("Can not delete '%s'."), file);
}
wfree(file);
return;
} else if (S_ISDIR(filestat.st_mode)) {
int len = strlen(file) + 20;
buffer = wmalloc(len);
snprintf(buffer, len, _("Delete directory %s ?"), file);
} else {
int len = strlen(file) + 15;
buffer = wmalloc(len);
snprintf(buffer, len, _("Delete file %s ?"), file);
}
if (!WMRunAlertPanel(WMWidgetScreen(panel->win), panel->win, if (!WMRunAlertPanel(WMWidgetScreen(panel->win), panel->win,
_("Warning"), buffer, _("OK"), _("Cancel"), NULL)) { _("Warning"), buffer, _("OK"), _("Cancel"), NULL)) {
if (S_ISDIR(filestat.st_mode)) {
if (rmdir(file) != 0) { if (remove(file) == -1) {
switch (errno) { snprintf(buffer, __msgbufsize__, _("Removing %s failed: %s"), file, strerror(errno));
case EACCES: showError(scr, panel->win, buffer, NULL);
showError(scr, panel->win, _("Permission denied."), NULL);
break;
case ENOENT:
showError(scr, panel->win, _("Directory '%s' does not exist."), file);
break;
case ENOTEMPTY:
showError(scr, panel->win, _("Directory '%s' is not empty."), file);
break;
case EBUSY:
showError(scr, panel->win, _("Directory '%s' is busy."), file);
break;
default:
showError(scr, panel->win, _("Can not delete '%s'."), file);
}
} else {
char *s = strrchr(file, '/');
if (s)
s[0] = 0;
WMSetFilePanelDirectory(panel, file);
}
} else if (remove(file) != 0) {
switch (errno) {
case EISDIR:
showError(scr, panel->win, _("'%s' is a directory."), file);
break;
case ENOENT:
showError(scr, panel->win, _("'%s' does not exist."), file);
break;
case EACCES:
showError(scr, panel->win, _("Permission denied."), NULL);
break;
case ENOMEM:
showError(scr, panel->win, _("Insufficient memory available."), NULL);
break;
case EROFS:
showError(scr, panel->win, _("'%s' is on a read-only filesystem."), file);
break;
default:
showError(scr, panel->win, _("Can not delete '%s'."), file);
}
} else { } else {
char *s = strrchr(file, '/'); char *s = strrchr(file, '/');
if (s) if (s)
s[1] = 0; s[0] = 0;
WMSetFilePanelDirectory(panel, file); WMSetFilePanelDirectory(panel, file);
} }
} }
wfree(buffer); out:
wfree(file); if (buffer)
wfree(buffer);
if (file)
wfree(file);
#undef __msgbufsize__
} }
static void goUnmount(WMButton * bPtr, WMFilePanel * panel) static void goUnmount(WMButton * bPtr, WMFilePanel * panel)