Print strerror when a system error occurs; add a new function rsyserr
[rsync/rsync.git] / authenticate.c
index 896366a..842a59e 100644 (file)
@@ -56,7 +56,7 @@ static void gen_challenge(char *addr, char *challenge)
        memset(input, 0, sizeof(input));
 
        strlcpy((char *)input, addr, 17);
-       gettimeofday(&tv, NULL);
+       sys_gettimeofday(&tv);
        SIVAL(input, 16, tv.tv_sec);
        SIVAL(input, 20, tv.tv_usec);
        SIVAL(input, 24, getpid());
@@ -85,14 +85,16 @@ static int get_secret(int module, char *user, char *secret, int len)
        if (fd == -1) return 0;
 
        if (do_stat(fname, &st) == -1) {
-               rprintf(FERROR,"stat(%s) : %s\n", fname, strerror(errno));
-               ok = 0;
-       } else if ((st.st_mode & 06) != 0) {
-               rprintf(FERROR,"secrets file must not be other-accessible\n");
-               ok = 0;
-       } else if (am_root && (st.st_uid != 0)) {
-               rprintf(FERROR,"secrets file must be owned by root when running as root\n");
+               rsyserr(FERROR, errno, "stat(%s)", fname);
                ok = 0;
+       } else if (lp_strict_modes(module)) {
+               if ((st.st_mode & 06) != 0) {
+                       rprintf(FERROR,"secrets file must not be other-accessible (see strict modes option)\n");
+                       ok = 0;
+               } else if (am_root && (st.st_uid != 0)) {
+                       rprintf(FERROR,"secrets file must be owned by root when running as root (see strict modes)\n");
+                       ok = 0;
+               }
        }
        if (!ok) {
                rprintf(FERROR,"continuing without secrets file\n");
@@ -133,7 +135,6 @@ static int get_secret(int module, char *user, char *secret, int len)
 static char *getpassf(char *filename)
 {
        char buffer[100];
-       int len=0;
        int fd=0;
        STRUCT_STAT st;
        int ok = 1;
@@ -149,7 +150,7 @@ static char *getpassf(char *filename)
        }
        
        if (do_stat(filename, &st) == -1) {
-               rprintf(FERROR,"stat(%s) : %s\n", filename, strerror(errno));
+               rsyserr(FERROR, errno, "stat(%s)", filename);
                ok = 0;
        } else if ((st.st_mode & 06) != 0) {
                rprintf(FERROR,"password file must not be other-accessible\n");
@@ -168,10 +169,12 @@ static char *getpassf(char *filename)
        if (envpw) rprintf(FERROR,"RSYNC_PASSWORD environment variable ignored\n");
 
        buffer[sizeof(buffer)-1]='\0';
-       if ( (len=read(fd,buffer,sizeof(buffer)-1)) > 0)
+       if (read(fd,buffer,sizeof(buffer)-1) > 0)
        {
+               char *p = strtok(buffer,"\n\r");
                close(fd);
-               return strdup(strtok(buffer,"\n\r"));
+               if (p) p = strdup(p);
+               return p;
        }       
 
        return NULL;