extern CONNECTION conn;
char buf[BUFSIZ];
-extern int code, errno;
+extern int code, errno, uid;
extern int have_authorization, have_file, done;
*/
int
-get_file(pathname, file_size, checksum)
+get_file(pathname, file_size, checksum, mode)
char *pathname;
int file_size;
int checksum;
+ int mode;
{
int fd, n_written;
int found_checksum;
}
if (done) /* re-initialize data */
initialize();
+ if (setreuid(0, uid) < 0) {
+ com_err(whoami, errno, "Unable to setuid to %d\n", uid);
+ exit(1);
+ }
/* unlink old file */
- (void) unlink(pathname);
+ if (!config_lookup("noclobber"))
+ (void) unlink(pathname);
/* open file descriptor */
- fd = open(pathname, O_CREAT|O_EXCL|O_WRONLY, 0700);
+ fd = open(pathname, O_CREAT|O_EXCL|O_WRONLY, mode);
if (fd == -1) {
code = errno;
sprintf(buf, "%s: creating file %s (get_file)",
error_message(code), pathname);
mr_log_error(buf);
report_error("reporting file creation error (get_file)");
+ if (setuid(0) < 0) {
+ com_err(whoami, errno, "Unable to setuid back to %d\n", 0);
+ exit(1);
+ }
return(1);
}
/* check to see if we've got the disk space */
(void) ftruncate(fd, 0);
(void) close(fd);
report_error("reporting test-write error (get_file)");
+ if (setuid(0) < 0) {
+ com_err(whoami, errno, "Unable to setuid back to %d\n", 0);
+ exit(1);
+ }
return(1);
}
n_written += n_wrote;
if (n_got == -1) {
/* get_block has already printed a message */
unlink(pathname);
+ if (setuid(0) < 0) {
+ com_err(whoami, errno, "Unable to setuid back to %d\n", 0);
+ exit(1);
+ }
return(1);
}
n_written += n_got;
if (code) {
code = connection_errno(conn);
report_error("reading file (get_file)");
+ if (setuid(0) < 0) {
+ com_err(whoami, errno, "Unable to setuid back to %d\n", 0);
+ exit(1);
+ }
return(1);
}
fsync(fd);
ftruncate(fd, file_size);
fsync(fd);
close(fd);
+ if (setuid(0) < 0) {
+ com_err(whoami, errno, "Unable to setuid back to %d\n", 0);
+ exit(1);
+ }
/* validate checksum */
found_checksum = checksum_file(pathname);
if (checksum != found_checksum) {