#include <ctype.h>
#include <sys/param.h>
#include <sys/file.h>
-#include <sms.h>
+#include <moira.h>
#include "update.h"
-#include "kludge.h"
+
+#ifndef MIN
+#define MIN(a,b) (((a) < (b))?(a):(b))
+#endif /* MIN */
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 (!have_authorization) {
- reject_call(SMS_PERM);
+ reject_call(MR_PERM);
return(1);
}
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);
- sms_log_error(buf);
+ 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 */
code = errno;
sprintf(buf, "%s: verifying free disk space for %s (get_file)",
error_message(code), pathname);
- sms_log_error(buf);
+ mr_log_error(buf);
/* do all we can to free the space */
(void) unlink(pathname);
(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) {
- code = SMS_MISSINGFILE;
+ code = MR_MISSINGFILE;
com_err(whoami, code, ": expected = %d, found = %d",
checksum, found_checksum);
report_error("checksum error");
if (n_wrote == -1) {
code = errno;
sprintf(buf, "%s: writing file (get_file)", error_message(code));
- sms_log_error(buf);
+ mr_log_error(buf);
string_free(&data);
report_error("reporting write error (get_file)");
close(fd);