void freeArgv(char **argv) { int j; for (j=0; argv[j]; j++) XTFREE(argv[j]); XTFREE(argv); }
void fileOpenCb(Widget w, XEvent *event, String *params, Cardinal *num_params) { FileWindowRec *fw; FileRec *file; int item; char path[MAXPATHLEN]; String *argv, push_action; if (!(fw = findFileWidget(w, &item))) return; zzz(); file = fw->files[item]; strcpy(path, fw->directory); if (path[strlen(path)-1] != '/') strcat(path, "/"); strcat(path, file->name); if (S_ISDIR(file->stats.st_mode)) { contractPath(path); chFileDir(fw, path); } else if (file->stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) { String arguments = XtNewString(file->name); String action = (String) XtMalloc((strlen(path) + 6) * sizeof(char)); strcat(strcpy(action, "exec "), path); argv = makeArgv(action, 1, &arguments); executeApplication(user.shell, fw->directory, argv); XTFREE(action); freeArgv(argv); } else if (file->type) { if (*(push_action = file->type->push_action)) { if (!(strcmp(push_action, "EDIT"))) doEdit(fw->directory, file->name); else if (!(strcmp(push_action, "VIEW"))) doView(fw->directory, file->name); else if (!(strcmp(push_action, "LOAD"))) { zzz(); newApplicationWindow(path, NULL); wakeUp(); } else { argv = (String *) XtMalloc(sizeof(String)); argv[0] = XtNewString(file->name); performAction(fw->shell, file->type->icon_pm.bm, push_action, fw->directory, 1, argv); XTFREE(argv); } } } else doEdit(fw->directory, file->name); wakeUp(); }
int dupObject(Widget shell, AppRec *dest, AppRec *src) { FILE *fin, *fout; char buffer[BUFSIZ]; size_t nr; if (chdir(src->directory)) return -1; if (!(fin = fopen(src->fname, "r"))) { chdir(user.home); return -1; } chdir(user.home); if (!(dest->fname = crtObjFileName(shell, usrObjects.obj[src->objType].atom_name))) { fclose(fin); return -1; } if (!(fout = fopen(dest->fname, "w"))) { XTFREE(dest->fname); fclose(fin); return -1; } do { nr = fread(buffer, 1, BUFSIZ, fin); if (nr != fwrite(buffer, 1, nr, fout)) { fclose(fin); fclose(fout); chdir(src->directory); unlink(dest->fname); chdir(user.home); XTFREE(dest->fname); return -1; } } while (nr); fclose(fin); fclose(fout); dest->name = XtNewString(src->name); dest->directory = XtNewString(src->directory); dest->icon = XtNewString(src->icon); dest->push_action = XtNewString(src->push_action); dest->drop_action = XtNewString(src->drop_action); dest->objType = src->objType; dest->remove_file = True; return 0; }
/*---------------------------------------------------------------------------*/ void doComHere(char *directory, char *fname) { char path[MAXPATHLEN]; char **argv; char default_term[1000]; if (resources.default_term) { strcpy(path, "cd "); strcat(path, fname); strcat(path, "&&"); sprintf(default_term, "siagrun terminal"); strcat(path, default_term); argv = (char **) XtMalloc(4 * sizeof(char *)); argv[0] = user.shell; argv[1] = "-c"; argv[2] = path; argv[3] = NULL; executeApplication(user.shell, directory, argv); XTFREE(argv); } else error("No default terminal program", ""); }
/*---------------------------------------------------------------------------*/ void doView(char *directory, char *fname) { char path[MAXPATHLEN]; char **argv; if (resources.default_viewer) { sprintf(path, "siagrun editor"); strcat(path, " "); strcat(path, fname); argv = (char **) XtMalloc(4 * sizeof(char *)); argv[0] = user.shell; argv[1] = "-c"; argv[2] = path; argv[3] = NULL; executeApplication(user.shell, directory, argv); XTFREE(argv); } else error("No default viewer", ""); }
void renameFileProc(XtPointer fsel, int conf) { SelFileNamesRec *fnames = (SelFileNamesRec *) fsel; struct stat stats; char to[MAXPATHLEN]; if (conf != YES) { freeSelFiles(fnames); return; } if (chdir(fnames->directory)) { sysError(fnames->shell, "System error:"); freeSelFiles(fnames); return; } chdir(user.home); if (fnames->target[0] != '/' && fnames->target[0] != '~' && fnames->target != 0) { strcpy(to, fnames->directory); if (to[strlen(to)-1] != '/') strcat(to, "/"); } else to[0] = 0; strcat(to, fnames->target); fnexpand(to); XTFREE(fnames->target); fnames->target = XtNewString(to); if (!(stat(to, &stats)) && S_ISDIR(stats.st_mode)) renameDialog(fnames); else moveFilesProc(fsel, YES); }
void selectAdd(FileWindowRec *fw, String pattern, Boolean replace_sel) { SelectionRec *sel = &fw->selected; FileRec *file; int i, j; Boolean changed = False; if (replace_sel && fw->selected.n_sel) { unselectAll(fw); changed = True; } for (i=0; i < fw->n_files; i++) { if ((replace_sel || getSelNr(fw, i) == -1) && fnmultimatch(pattern, (file = fw->files[i])->name)) { changed = True; if ((j = sel->n_sel++) >= sel->n_alloc) sel->file = (FileSpec *) XTREALLOC(sel->file, (sel->n_alloc += 10) * sizeof(FileSpec)); sel->file[j].nr = i; sel->file[j].name = XtNewString(file->name); sel->n_bytes += file->stats.st_size; XtVaSetValues(file->form, XmNborderColor, resources.select_color, NULL); } } if (changed) updateStatus(fw); XTFREE(pattern); }
static void placeDTIcon(DTIconRec *dticon) { Dimension width; XmString labelstr; String icon_pos; if (x0 == -1) { /* Seems to be necessary at least under HP-UX: */ icon_pos = XtNewString(resources.icon_pos); sscanf(icon_pos, "%d%d", &x0, &y0); XTFREE(icon_pos); if (x0 < 0) x0 += winInfo.rootWidth - DTICONWIDTH; if (y0 < 0) y0 += winInfo.rootHeight - DTICONHEIGHT; } dticon->x = x0; dticon->y = y0; dticon->width = dticon->app.icon_pm.width; dticon->height = dticon->app.icon_pm.height; labelstr = XmStringCreateLocalized(dticon->app.name); width = XmStringWidth((XmFontList) resources.icon_font, labelstr) + 2; dticon->height += XmStringWidth((XmFontList) resources.icon_font, labelstr) + 4; if (width > dticon->width) dticon->width = width; dticon->height += 2 * MARGIN; dticon->width += 2 * MARGIN; while (!tryPosition(dticon)); dticon->x += MARGIN; dticon->y += MARGIN; }
void removeIconProc(XtPointer awp, int conf) { DTIconRec *dticon = (DTIconRec *) awp; int i; dticons_blocked = False; if (conf == YES) { XtDestroyWidget(dticon->shell); freeApplicationResources(&dticon->app); if (dticon->label_mask != None) freePixmap(dticon->label_mask); if (dticon->drop_pixmap != None) freePixmap(dticon->drop_pixmap); for (i=0; i<n_dtIcons; i++) { if (dtIcons[i] == dticon) { dtIcons[i] = dtIcons[--n_dtIcons]; break;; } } XTFREE(dticon); dtIcons = (DTIconRec **) XTREALLOC(dtIcons, n_dtIcons * sizeof(DTIconRec *)); if (resources.auto_save) writeDTIcons(True); } }
void writeDTIconsProc(XtPointer allp, int conf) { dticons_blocked = False; if (conf == YES) overwriteDTIcons(*(Boolean *)allp); XTFREE(allp); }
String crtObjFileName(Widget shell, String atom_name) { struct stat stats; time_t now; String name; if (stat(resources.obj_dir, &stats)) { if (mkdir(resources.obj_dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) { error(shell, "Could not create directory:", resources.obj_dir); return NULL; } } else if (!S_ISDIR(stats.st_mode)) { error(shell, "Not a directory:", resources.obj_dir); return NULL; } now = time(NULL); name = (String) XtMalloc((strlen(atom_name) + 12) * sizeof(char)); sprintf(name, "%s-%lu", atom_name, (unsigned long) now); chdir(resources.obj_dir); if (!(lstat(name, &stats))) { XTFREE(name); name = tempnam(resources.obj_dir, NULL); } return name; }
void fileExecProc(XtPointer fnm, int conf) { ExecFileRec *data = (ExecFileRec *) fnm; String action; if (conf == YES) { action = (String) XtMalloc((strlen(data->action) + strlen(data->arguments) + 2) * sizeof(char)); sprintf(action, "%s %s", data->action, data->arguments); performAction(data->shell, data->icon.bm, action, data->directory, 0, NULL); XTFREE(action); } XTFREE(data->arguments); XTFREE(data->directory); XTFREE(data->action); XTFREE(data); }
int readDirectory(FileList *fl_return, int *n_return, String path) { FileList fl = NULL; DIR *dir; struct dirent *entry; register int n, m; if (chdir(path)) goto error2; if (!(dir = opendir("."))) goto error2; for(n = 0; entry = readdir(dir); n++) { fl = (FileRec **) XTREALLOC(fl, (n+1)*sizeof(FileRec *)); fl[n] = (FileRec *) XtMalloc(sizeof(FileRec)); strcpy(fl[n]->name, entry->d_name); if (lstat(entry->d_name, &(fl[n]->stats))) goto error1; if (S_ISLNK(fl[n]->stats.st_mode)) { fl[n]->sym_link = True; if (stat(entry->d_name, &(fl[n]->stats))) goto error1; } else fl[n]->sym_link = False; fl[n]->selected = False; } if (closedir(dir)) goto error1; *fl_return = fl; *n_return = n; return 0; error1: for(m = 0; m <= n; m++) XTFREE(fl[m]); XTFREE(fl); error2: *fl_return = NULL; *n_return = 0; return -1; }
void filterFiles(FileWindowRec *fw, String pattern) { strcpy(fw->dirFilter, pattern); if (pattern[0]) fw->do_filter = True; else fw->do_filter = False; XTFREE(pattern); updateFileDisplay(fw, RESHOW); }
void mkDirProc(XtPointer fnm, int conf) { NewFileRec *nfr = (NewFileRec *) fnm; if (conf == YES) { if (chdir(nfr->directory)) sysError(nfr->shell, "Can't change to directory:"); else if (mkdir(nfr->name, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) sysError(nfr->shell, "Can't make directory:"); else { markForUpdate(nfr->directory, CHECK_FILES); intUpdate(CHECK_DIR); } XTFREE(nfr->name); } XTFREE(nfr->directory); XTFREE(nfr); }
/*---------------------------------------------------------------------------*/ void fileExecAction(Widget w, XEvent *event, String *params, Cardinal *num_params) { int i; FileWindowRec *fw; char **argv; i = findWidget(w, &fw); if (i == -1 || !fw) { /* error("Internal error:","widget not found in fileExecAction"); */ return; } if (fw->files[i]->type) { if (*fw->files[i]->type->push_action) if (!strcmp(fw->files[i]->type->push_action, "EDIT")) doEdit(fw->directory, fw->files[i]->name); else if (!strcmp(fw->files[i]->type->push_action, "VIEW")) doView(fw->directory, fw->files[i]->name); else if (!strcmp(fw->files[i]->type->push_action, "IMAGE")) doImage(fw->directory, fw->files[i]->name); else if (!strcmp(fw->files[i]->type->push_action, "SIAGHELP")) doSiaghelp(fw->directory, fw->files[i]->name); else { int k = 0; char *action = varPopup(fw->files[i]->type->icon_bm, fw->files[i]->type->push_action); if (!action) return; argv = (char **) XtMalloc( (user.arg0flag ? 6 : 5) * sizeof(char *)); argv[k++] = user.shell; argv[k++] = "-c"; argv[k++] = action; if (user.arg0flag) argv[k++] = user.shell; argv[k++] = fw->files[i]->name; argv[k] = NULL; executeApplication(user.shell, fw->directory, argv); XTFREE(argv); } } else doEdit(fw->directory, fw->files[i]->name); }
void fileOnDeskCb(Widget w, XtPointer client_data, XtPointer call_data) { AppList *appl; AppRec newapp; FileWindowRec *fw = (FileWindowRec *) client_data; appl = applistFromFiles(fw); newapp.name = XtNewString(appl[0]->name); newapp.directory = XtNewString(appl[0]->directory); newapp.fname = XtNewString(appl[0]->fname); newapp.icon = XtNewString(appl[0]->icon); newapp.push_action = appl[0]->push_action; newapp.drop_action = appl[0]->drop_action; newapp.objType = APPLICATION; newapp.remove_file = False; dtIcons = (DTIconRec **) XTREALLOC(dtIcons, (n_dtIcons + 1) * sizeof(DTIconRec *)); dtIcons[n_dtIcons] = createDTIcon(fw->shell, &newapp, -1, -1); displayDTIcon(dtIcons[n_dtIcons++]); if (resources.auto_save) writeDTIcons(True); XTFREE(appl[0]); XTFREE(appl); }
void selectRemove(FileWindowRec *fw, String pattern) { SelectionRec *sel = &fw->selected; int i = 0, item; Boolean changed = False; while (i < sel->n_sel) { if (fnmultimatch(pattern, sel->file[i].name)) { changed = True; XTFREE(sel->file[i].name); item = sel->file[i].nr; memcpy(&sel->file[i], &sel->file[--(sel->n_sel)], sizeof(FileSpec)); sel->n_bytes -= fw->files[item]->stats.st_size; XtVaSetValues(fw->files[item]->form, XmNborderColor, winInfo.background, NULL); } else i++; } if (changed) updateStatus(fw); XTFREE(pattern); }
void filterDirectory(FileList *fl_return, int *n_return, FilterType type) { FileList fl = NULL, oldfl = *fl_return; int n = 0, m = 0; for (; m < *n_return; m++) if (S_ISDIR(oldfl[m]->stats.st_mode) && type == Directories || !S_ISDIR(oldfl[m]->stats.st_mode) && type == Files || (type == All && strcmp(oldfl[m]->name,".") && strcmp(oldfl[m]->name,".."))) { fl = (FileList) XTREALLOC(fl, (n+1)*sizeof(FileRec *)); fl[n] = oldfl[m]; n++; } else XTFREE(oldfl[m]); XTFREE(oldfl); *fl_return = fl; *n_return = n; }
void newFileProc(XtPointer fnm, int conf) { NewFileRec *nfr = (NewFileRec *) fnm; int desc; if (conf == YES) { if (chdir(nfr->directory)) sysError(nfr->shell, "Can't change to directory:"); else if ((desc = create(nfr->name, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) sysError(nfr->shell, "Can't create file:"); else { close(desc); markForUpdate(nfr->directory, CHECK_FILES); intUpdate(CHECK_DIR); } chdir(user.home); XTFREE(nfr->name); } XTFREE(nfr->directory); XTFREE(nfr); }
void xtermCb(Widget w, XtPointer client_data, XtPointer call_data) { FileWindowRec *fw = (FileWindowRec *) client_data; String *argv; zzz(); argv = (String *) XtMalloc(4 * sizeof(String)); argv[0] = user.shell; argv[1] = "-c"; argv[2] = resources.xterm; argv[3] = NULL; executeApplication(user.shell, fw->directory, argv); XTFREE(argv); wakeUp(); }
void readUserObjects(void) { FILE *fp; String atom_name, push_action, label, icon, drag_icon; char s[MAXAPPSTRINGLEN]; int i, p; usrObjects.nr = 0; usrObjects.obj = NULL; if (!(fp = fopen(resources.usrobj_file, "r"))) { if (exists(resources.usrobj_file)) error(topShell, "Cannot read object file", resources.usrobj_file); return; } for (i=0; (p = parseObj(fp, &atom_name, &push_action, &label, &icon, &drag_icon)) > 0; i++) { usrObjects.obj = (UserObjectRec *) XTREALLOC(usrObjects.obj, (i+1) * sizeof(UserObjectRec)); usrObjects.obj[i].atom_name = XtNewString(strparse(s, atom_name, "\\:")); if ((usrObjects.obj[i].atom = XmInternAtom(dpy, usrObjects.obj[i].atom_name, False)) == None) { XTFREE(usrObjects.obj[i].atom_name); error(topShell, "Couldn't initialize user defined object", atom_name); i--; } else { usrObjects.obj[i].push_action = XtNewString(strparse(s, push_action, "\\:")); usrObjects.obj[i].label = XtNewString(strparse(s, label, "\\:")); usrObjects.obj[i].icon = XtNewString(strparse(s, icon, "\\:")); usrObjects.obj[i].drag_icon = XtNewString(strparse(s, drag_icon, "\\:")); } } if (p == -1) error(topShell, "Error in objects file:", resources.usrobj_file); usrObjects.nr = i; if (fclose(fp)) sysError(topShell, "Error reading objects file:"); }
void changeDTIconProc(XtPointer awp, int conf) { DTIconRec *dticon = ((AppSpecRec *) awp)->win.dticon; XTFREE(awp); dticons_blocked = False; if (conf == YES) { XtDestroyWidget(dticon->app.form); if (dticon->app.loaded) freeIcon(dticon->app.icon_pm); if (dticon->label_mask != None) freePixmap(dticon->label_mask); if (dticon->drop_pixmap != None) freePixmap(dticon->drop_pixmap); dticon->app.objType = getObjectType(dticon->app.push_action); readApplicationIcon(getAnyShell(), &dticon->app, ERR_POPUP); displayDTIcon(dticon); if (resources.auto_save) writeDTIcons(True); } }
void changeDirCb(Widget w, XtPointer client_data, XtPointer calldata) { FileWindowRec *fw = (FileWindowRec *) client_data; char *newpath, dir[MAXPATHLEN]; newpath = XmTextFieldGetString(w); if (newpath[0] != '/' && newpath[0] != '~' && newpath[0] != 0) { strcpy(dir, fw->directory); if (dir[strlen(dir)-1] != '/') strcat(dir, "/"); } else dir[0] = 0; strcat(dir, newpath); XTFREE(newpath); fnexpand(dir); contractPath(dir); if (!chFileDir(fw, dir)) XmTextFieldSetString(fw->dirfield, fw->directory); }
/*---------------------------------------------------------------------------*/ void doOpenWith(char *directory, char *fname, char *with) { char path[MAXPATHLEN]; char **argv; strcpy(path, with); strcat(path, " "); strcat(path, fname); argv = (char **) XtMalloc(4 * sizeof(char *)); argv[0] = user.shell; argv[1] = "-c"; argv[2] = path; argv[3] = NULL; executeApplication(user.shell, directory, argv); XTFREE(argv); }
void updateIconDisplay(void) { struct stat cur; Boolean reread = False; if (dticons_blocked) return; if (resources.check_application_files) if (dticons_readable) reread = stat(resources.dticon_file, &cur) || cur.st_ctime > dticons_stats.st_ctime || cur.st_mtime > dticons_stats.st_mtime; else reread = !stat(resources.dticon_file, &cur); if (reread) { FILE *fp; AppRec *app; char *name, *directory, *fname, *icon, *push_action, *drop_action, *xp, *yp; char *nname, *ndirectory, *nfname, *nicon, *npush_action, *ndrop_action; char s[MAXAPPSTRINGLEN]; int i, j, p, x, y; zzz(); dticons_readable = !stat(resources.dticon_file, &dticons_stats); if (!(fp = fopen(resources.dticon_file, "r"))) { dticons_readable = False; error(getAnyShell(), "Cannot read desktop icons from", resources.dticon_file); i = 0; goto remove; } /* update existing icons/append new ones */ for (i=0; (p = parseIcon(fp, &name, &directory, &fname, &icon, &push_action, &drop_action, &xp, &yp)) > 0; i++) { if ((x = atoi(strparse(s, xp, "\\:"))) < 0) x += winInfo.rootWidth - DTICONWIDTH; if ((y = atoi(strparse(s, yp, "\\:"))) < 0) y += winInfo.rootHeight - DTICONHEIGHT; nname = XtNewString(strparse(s, name, "\\:")); ndirectory = XtNewString(strparse(s, directory, "\\:")); nfname = XtNewString(strparse(s, fname, "\\:")); nicon = XtNewString(strparse(s, icon, "\\:")); npush_action = XtNewString(strparse(s, push_action, "\\:")); ndrop_action = XtNewString(strparse(s, drop_action, "\\:")); if (i < n_dtIcons) { DTIconRec *dticon = dtIcons[i]; app = &dticon->app; if (!(x != dticon->x || y != dticon->y || strcmp(nname, app->name) || strcmp(ndirectory, app->directory) || strcmp(nfname, app->fname) || strcmp(nicon, app->icon) || strcmp(npush_action, app->push_action) || strcmp(ndrop_action, app->drop_action))) { XTFREE(nname); XTFREE(ndirectory); XTFREE(nfname); XTFREE(nicon); XTFREE(npush_action); XTFREE(ndrop_action); continue; } XtDestroyWidget(dticon->app.form); if (dticon->label_mask != None) freePixmap(dticon->label_mask); if (dticon->drop_pixmap != None) freePixmap(dticon->drop_pixmap); freeApplicationResources(&dticon->app); } else { dtIcons = (DTIconRec **) XTREALLOC(dtIcons, (i+1) * sizeof(DTIconRec *)); dtIcons[i] = (DTIconRec *) XtMalloc(sizeof(DTIconRec)); } app = &dtIcons[i]->app; app->name = nname; app->directory = ndirectory; app->fname = nfname; app->icon = nicon; app->push_action = npush_action; app->drop_action = ndrop_action; app->objType = getObjectType(app->push_action); app->remove_file = False; dtIcons[i]->x = x; dtIcons[i]->y = y; readApplicationIcon(getAnyShell(), app, ERR_POPUP); dtIcons[i]->label_mask = None; dtIcons[i]->drop_pixmap = None; dtIcons[i]->moved = False; dtIcons[i]->save = True; displayDTIcon(dtIcons[i]); } remove: /* remove any remaining icons */ for (j = i; j < n_dtIcons; j++) { DTIconRec *dticon = dtIcons[j]; XtDestroyWidget(dticon->shell); freeApplicationResources(&dticon->app); if (dticon->label_mask != None) freePixmap(dticon->label_mask); if (dticon->drop_pixmap != None) freePixmap(dticon->drop_pixmap); XTFREE(dticon); } if (i < n_dtIcons) dtIcons = (DTIconRec **) XTREALLOC(dtIcons, i * sizeof(DTIconRec *)); n_dtIcons = i; wakeUp(); if (dticons_readable && p == -1) error(getAnyShell(), "Error reading desktop icons from", resources.dticon_file); if (dticons_readable && fclose(fp)) sysError(getAnyShell(), "Error reading desktop icons:"); } }
void moveFilesProc(XtPointer fsel, int conf) { SelFileNamesRec *fnames = (SelFileNamesRec *) fsel; struct stat tostats, tolstats, frstats; char from[MAXPATHLEN], to[MAXPATHLEN]; String name, cwd; String op_name, from_err, to_err; size_t toend, fromend; int devto, devfrom, deverr = -1, i, perm, res; Boolean is_dir, is_link; if (conf != YES || !fnames->op) { freeSelFiles(fnames); return; } if (chdir(fnames->directory)) { sysError(fnames->shell, "System error:"); freeSelFiles(fnames); return; } chdir(user.home); switch (fnames->op) { case COPY: op_name = "Copy:"; from_err = "Error copying"; to_err = "Error copying to"; break; case MOVE: op_name = "Move:"; from_err = "Error moving"; to_err = "Error moving to"; break; default: /* i.e. LINK */ op_name = "Link:"; from_err = "Error creating symlink to"; to_err = "Error creating symlink in"; } if (fnames->target[0] != '/' && fnames->target[0] != '~' && fnames->target != 0) { strcpy(to, fnames->directory); if (to[strlen(to)-1] != '/') strcat(to, "/"); } else to[0] = 0; strcat(to, fnames->target); fnexpand(to); if (!(cwd = absolutePath(to))) { error(fnames->shell, no_target, to); freeSelFiles(fnames); return; } strcpy(to, cwd); XTFREE(cwd); fromend = strlen(strcpy(from, fnames->directory)); if (from[fromend-1] != '/') { from[fromend++] = '/'; from[fromend] = 0; } devfrom = findDev(from); if (mountDev(devto = findDev(to), False)) deverr = devto; else if (mountDev(devfrom, False)) deverr = devfrom; if (deverr != -1) { error(fnames->shell, "Cannot mount device on", mntable.devices[deverr].def_mpoint); umountDev(devto, False); freeSelFiles(fnames); return; } if (!(stat(to, &tostats)) && S_ISDIR(tostats.st_mode)) { if (chdir(to) || !(perm = permission(&tostats, P_WRITE))) { chdir(user.home); if (!perm) error(fnames->shell, "You have no write permission for ", to); else sysError(fnames->shell, "System error:"); umountDev(devto, False); umountDev(devfrom, False); freeSelFiles(fnames); return; } chdir(user.home); fnames->dirtarget = True; toend = strlen(to); if (to[toend-1] != '/') { to[toend++] = '/'; to[toend] = 0; } } else if (fnames->n_sel == 1) fnames->dirtarget = False; else { error(fnames->shell, op_name, "Target for multiple files must be a folder"); umountDev(devto, False); umountDev(devfrom, False); freeSelFiles(fnames); return; } if (!fnames->first) zzz(); XTFREE(fnames->target); fnames->target = XtNewString(to); for (i = fnames->first; i < fnames->n_sel; i++) { name = fnames->names[i]; if (fnames->op != LINK && (!strcmp(name, ".") || !strcmp(name, ".."))) { error(fnames->shell, "Cannot move or copy . or ..", NULL); continue; } strcpy(from+fromend, name); if (fnames->dirtarget) { if (fnames->op != LINK && prefix(from, to)) { String err_str, format = "Cannot move or copy %s to"; err_str = (String) XtMalloc((strlen(format) + strlen(from)) * sizeof(char)); sprintf(err_str, format, from); error(fnames->shell, err_str, to); XTFREE(err_str); umountDev(devto, False); umountDev(devfrom, False); freeSelFiles(fnames); wakeUp(); return; } strcpy(to+toend, name); } if (!(lstat(to, &tolstats))) { fnames->first = i; is_dir = False; if (!(stat(to, &tostats))) { if (S_ISDIR(tostats.st_mode)) is_dir = True; if (!stat(from, &frstats) && tostats.st_ino == frstats.st_ino) { error(fnames->shell, op_name, "Source and destination are identical"); umountDev(devto, False); umountDev(devfrom, False); freeSelFiles(fnames); wakeUp(); return; } } if (S_ISLNK(tolstats.st_mode)) is_link = True; else is_link = False; if (fnames->conf_ovwr || (is_dir && (!is_link || fnames->op == COPY) && resources.confirm_delete_folder)) overwriteDialog(fnames, to, (fnames->op == COPY && is_dir && (lstat(from, &frstats) || !S_ISDIR(frstats.st_mode)))? "File copy:" : op_name, is_dir && (!is_link || fnames->op == COPY)); else overwriteProc(fsel, YES); umountDev(devto, False); umountDev(devfrom, False); return; } switch (fnames->op) { case COPY: rcopy(from, to, False); res = 0; break; case MOVE: res = movefile(from, to); break; default: res = makeLink(from, to); } if (res) { if (opError(fnames->shell, from_err, name) != YES) break; } else fnames->update = True; } umountDev(devto, False); umountDev(devfrom, False); if (fnames->update) { if (fnames->op == COPY) intUpdate(CHECK_DIR); /* Check for new subdirectories */ if (fnames->op == MOVE) markForUpdate(fnames->directory, CHECK_FILES); markForUpdate(to, RESHOW); if (fnames->op != COPY) intUpdate(CHECK_DIR); } freeSelFiles(fnames); wakeUp(); }