* details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with these librararies and programs; if not, write
+ * License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
#include <dirent.h>
#include <unistd.h>
#include <string.h>
+#include <stdint.h>
+#if defined(CSRG_BASED)
+#include <sys/param.h>
+#include <sys/mount.h>
+#else
#include <ustat.h>
+#endif
#include <Xm/RowColumn.h>
#include <Xm/CascadeB.h>
#include <Dt/EnvControlP.h>
#include <Dt/Wsm.h>
#include <Dt/Dnd.h>
+#include <Dt/SharedProcs.h>
+#include "DtSvcInternal.h" /* _DtGetMask */
#include <Tt/tttk.h>
#include "Desktop.h"
#include "Main.h"
#include "SharedMsgs.h"
+#include "dtcopy/fsrtns.h"
#define AdditionalHeader (GETMESSAGE(27,98, "(Plus %d additional object(s))"))
DialogData * primaryTrashHelpDialog = NULL;
DialogData ** secondaryTrashHelpDialogList = NULL;
int secondaryTrashHelpDialogCount = 0;
+
+/* Forward prototype */
+int EraseDir(char *dir_name);
+/* From dtcopy/fsrtns.c */
+extern int EmptyDir(char *sourceP, int rm, int force);
+
/* 'defines' for trash files */
static char * TRASH_DIR = ".dt/Trash";
static char * TRASH_INFO_FILE = ".dt/Trash/.trashinfo";
/* Remove the original information file, and move the new one */
(void) fclose(newFile);
- (void) chown(NewTrashInfoFileName, getuid(), getgid());
+ if(-1 == chown(NewTrashInfoFileName, getuid(), getgid())) {
+ return( False );
+ }
(void) remove(TrashInfoFileName);
(void) rename(NewTrashInfoFileName, TrashInfoFileName);
- (void) chown(TrashInfoFileName, getuid(), getgid());
+ if(-1 == chown(TrashInfoFileName, getuid(), getgid())) {
+ return( False );
+ }
return( True );
}
else
trashMenu[i].helpData = NULL;
trashMenu[i].activateCallback = NULL;
trashMenu[i].activateData = NULL;
- trashMenu[i].maskBit = NULL;
+ trashMenu[i].maskBit = 0;
trashMenu[i].isHelpBtn = False;
trashMenu[i].label = NULL;
trashMenu[i].mnemonic = NULL;
Select_All(*selectAllBtn, NULL, NULL);
Remove(*removeBtn, NULL, NULL);
*/
- EmptyDir(trashFileMgrData->current_directory,0);
+ EmptyDir(trashFileMgrData->current_directory,0,0);
}
}
DIR * dirp;
struct dirent * entry;
Boolean success;
- int i, rc;
+ int i, rc, rv;
char savechar;
for (i = 0; i < file_count; i++)
pipe_msg = PIPEMSG_OTHER_ERROR;
rc = BAD_FILE_ERROR;
DPRINTF(("MoveToTrashProcess: sending BAD_FILE_ERROR\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
- write(pipe_fd, &rc, sizeof(int));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, &rc, sizeof(int));
continue;
}
if (path && MatchesSacredDirectory(path))
pipe_msg = PIPEMSG_OTHER_ERROR;
rc = BAD_FILE_SACRED;
DPRINTF(("MoveToTrashProcess: sending BAD_FILE_SACRED\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
- write(pipe_fd, &rc, sizeof(int));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, &rc, sizeof(int));
continue;
}
XtFree(path);
pipe_msg = PIPEMSG_OTHER_ERROR;
DPRINTF(("MoveToTrashProcess: sending BAD_TRASH message\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
- write(pipe_fd, &rc, sizeof(int));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, &rc, sizeof(int));
continue;
}
else if (CheckAccess(path, W_OK) != 0 && !S_ISLNK(s1.st_mode))
pipe_msg = PIPEMSG_OTHER_ERROR;
rc = VERIFY_FILE;
DPRINTF(("MoveToTrashProcess: sending VERIFY_FILE\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
- write(pipe_fd, &rc, sizeof(int));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, &rc, sizeof(int));
continue;
}
pipe_msg = PIPEMSG_OTHER_ERROR;
rc = VERIFY_DIR;
DPRINTF(("MoveToTrashProcess: sending VERIFY_DIR\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
- write(pipe_fd, &rc, sizeof(int));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, &rc, sizeof(int));
continue;
}
}
to = CreateTrashFilename(baseName, TRUE);
/* move file to the trash directory */
- success = FileManip((Widget)pipe_fd, MOVE_FILE, path, to, TRUE,
+ success = FileManip((Widget) (intptr_t) pipe_fd, MOVE_FILE, path, to, TRUE,
FileOpError, True, TRASH_DIRECTORY);
if (success)
{
pipe_msg = PIPEMSG_DONE;
DPRINTF(("MoveToTrashProcess: sending DONE\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
PipeWriteString(pipe_fd, path);
PipeWriteString(pipe_fd, to);
}
#endif /* SUN_PERF */
/* create a pipe */
- pipe(pipe_fd);
+ if(-1 == pipe(pipe_fd)) {
+ fprintf(stderr,
+ "%s: pipe failed error %d=%s\n",
+ pname, errno, strerror(errno));
+ return;
+ }
/* fork the process that does the actual work */
pid = fork();
int *rc,
Boolean CheckedAlready)
{
- int i, j;
+ int i, j, rv;
char *full_dirname;
char *from, *to;
char *ptr;
pipe_msg = PIPEMSG_DONE;
rc[0] = -1;
DPRINTF(("RestoreProcess: Unable to Resolve local path name\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
- write(pipe_fd, rc, sizeof(int));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, rc, sizeof(int));
return;
}
}
if (to != NULL)
{
- status = RestoreObject((Widget)pipe_fd, MOVE_FILE, from,to,
+ status = RestoreObject((Widget) (intptr_t) pipe_fd, MOVE_FILE, from,to,
TRUE, FileOpError, False, NOT_DESKTOP,CheckedAlready);
/* restore was successful */
if(status == (int) True)
/* send return codes back trough the pipe */
pipe_msg = PIPEMSG_DONE;
DPRINTF(("RestoreProcess: sending DONE\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
- write(pipe_fd, rc, file_count * sizeof(int));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, rc, file_count * sizeof(int));
XtFree(full_dirname);
}
cb_data->msg = msg;
/* create a pipe */
- pipe(pipe_fd);
+ if(-1 == pipe(pipe_fd)) {
+ fprintf(stderr,
+ "%s: pipe failed, error %d=%s\n",
+ pname, errno, strerror(errno));
+ return;
+ }
/* fork the process that does the actual work */
pid = fork();
int del_count,
int *rc)
{
- int i;
+ int i, rv;
short pipe_msg;
/*
/* send return codes back trough the pipe */
pipe_msg = PIPEMSG_DONE;
DPRINTF(("EmptyTrashProcess: sending DONE\n"));
- write(pipe_fd, &pipe_msg, sizeof(short));
- write(pipe_fd, rc, del_count * sizeof(int));
+ rv = write(pipe_fd, &pipe_msg, sizeof(short));
+ rv = write(pipe_fd, rc, del_count * sizeof(int));
}
cb_data->msg = msg;
/* create a pipe */
- pipe(pipe_fd);
+ if(-1 == pipe(pipe_fd)) {
+ fprintf(stderr,
+ "%s: pipe failed, error %d=%s\n",
+ pname, errno, strerror(errno));
+ return;
+ }
/* fork the process that does the actual work */
pid = fork();
char *parentdir,
char *destinationPath)
{
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+ struct statfs statbuf;
+#elif defined(__NetBSD__)
+ struct statvfs statbuf;
+#else
struct stat statbuf;
+#endif
char fname[1024];
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+ if (statfs(parentdir,&statbuf) < 0) /* does not exist */
+#elif defined(__NetBSD__)
+ if (statvfs(parentdir,&statbuf) < 0) /* does not exist */
+#else
if (lstat(parentdir,&statbuf) < 0) /* does not exist */
+#endif
return -1;
/* check if we are root */
if (getuid() == 0)
{
/* if NFS, need to check if server trusts root */
+#if defined(CSRG_BASED)
+ if (!strcmp(statbuf.f_fstypename, "nfs")) /* Root user and nfs */
+#else
if (FileSysType(statbuf.st_dev) < 0) /* Root user and nfs */
+#endif
{
+ int fd = -1;
char *tmpfile;
- tmpfile = tempnam(parentdir,"quang");
- if (creat(tmpfile,O_RDONLY)< 0) /* Create a temporary file */
- return -1;
+ tmpfile = tempnam(parentdir,"dtfile");
+ if (!tmpfile)
+ return -1;
+ if ((fd = creat(tmpfile,O_RDONLY)) < 0) /* Create a temporary file */
+ {
+ free(tmpfile);
+ return -1;
+ }
+ close(fd);
if (remove(tmpfile) < 0) /* Delete the created file */
- return -1;
+ {
+ free(tmpfile);
+ return -1;
+ }
+ free(tmpfile);
}
/* root user can delete anything */
if (first_file)
{
/* check for write permission in this directory */
- if (CheckAccess(destinationPath, W_OK|X_OK) < 0)
+ if (CheckAccess(destinationPath, W_OK|X_OK) < 0) {
+ closedir(dirp);
return -1;
+ }
/* append a '/' to the end of directory name */
fnamep = destinationPath + strlen(destinationPath);
/* recursively check permission on this file */
if (CheckDeletePermissionRecur(destinationPath))
- return -1;
+ {
+ closedir(dirp);
+ return -1;
+ }
+
}
}
+ closedir(dirp);
+
return 0;
}
+#if !defined(CSRG_BASED)
static int
FileSysType(
int dev)
return -2;
return u1.f_tinode;
}
+#endif
static int
RestoreObject(
{
struct stat statsrc,stattar;
Boolean status;
- char *localdir,*chrptr;
+ char *localdir = NULL,*chrptr;
+ int rv;
if(!CheckedAlready)
{
}
if(stat(target,&stattar) >= 0) /* Target exists */
{
- if(CheckDeletePermission(localdir,target))
+ if(CheckDeletePermission(localdir,target)) {
+ free(localdir);
return ((int)False);
- else
+ } else {
+ free(localdir);
return SKIP_FILE;
+ }
}
}
+
+ free(localdir);
return ((int )FileManip((Widget)w, MOVE_FILE, source, target, TRUE,
- FileOpError, False, NOT_DESKTOP));
+ FileOpError, False, NOT_DESKTOP));
}
static void
CreateRestoreDialog(
if(lstat(dirs[1],&s1) < 0)
goto goback;
- fsErase(dirs[1],&status);
+ fsErase(dirs[1],&status,0);
FileList = (char **) XtMalloc(sizeof(char *));
FileList[0] = XtNewString(dirs[0]);
RestoreFromTrash(FileList, (int) 1, NULL, NULL, NULL,True);