]> andersk Git - moira.git/blobdiff - update/send_file.c
Build without krb4 if it's unavailable.
[moira.git] / update / send_file.c
index 5e12ef81d6e42fbd7638ec8c6bae924ccfe0b5e3..49127f41b2f02b5c58013f4245e304440d73fa0a 100644 (file)
 #include <string.h>
 #include <unistd.h>
 
+#ifdef HAVE_KRB4
 #include <des.h>
-#include <gdb.h>
+#endif
 #include <update.h>
 
 RCSID("$Header$");
 
-extern CONNECTION conn;
-char buf[BUFSIZ];
-extern C_Block session;
-extern char *whoami;
+#ifdef HAVE_KRB4
+extern des_cblock session;
+#endif
 
 /*
  * syntax:
@@ -45,14 +45,16 @@ extern char *whoami;
  *  1 on error (file not found, etc)
  */
 
-int send_file(char *pathname, char *target_path, int encrypt)
+int mr_send_file(int conn, char *pathname, char *target_path, int encrypt)
 {
   int n, fd, code, n_to_send, i;
-  STRING data;
-  unsigned char dst[UPDATE_BUFSIZ + 8], *src;
+  char data[UPDATE_BUFSIZ], enc[UPDATE_BUFSIZ];
+  long response;
   struct stat statb;
+#ifdef HAVE_KRB4
   des_key_schedule sched;
   des_cblock ivec;
+#endif
 
   /* send file over */
   fd = open(pathname, O_RDONLY, 0);
@@ -69,118 +71,124 @@ int send_file(char *pathname, char *target_path, int encrypt)
     }
   n_to_send = statb.st_size;
 
-  string_alloc(&data, UPDATE_BUFSIZ);
-  sprintf(STRING_DATA(data), "XFER_00%c %d %d %s",
-         (encrypt ? '3' : '2'), n_to_send,
+  sprintf(data, "XFER_00%c %d %d %s", (encrypt ? '3' : '2'), n_to_send,
          checksum_file(pathname), target_path);
-  code = send_object(conn, (char *)&data, STRING_T);
+  code = send_string(conn, data, strlen(data) + 1);
   if (code)
     {
-      com_err(whoami, connection_errno(conn), " sending XFER request");
+      com_err(whoami, code, "sending XFER request");
       close(fd);
-      return connection_errno(conn);
+      return code;
     }
-  code = receive_object(conn, (char *)&n, INTEGER_T);
+  code = recv_int(conn, &response);
   if (code)
     {
-      com_err(whoami, connection_errno(conn),
-             " getting reply from XFER request");
+      com_err(whoami, code, "getting reply from XFER request");
       close(fd);
-      return connection_errno(conn);
+      return code;
     }
-  if (n)
+  if (response)
     {
-      com_err(whoami, n, " transfer request (XFER) rejected");
+      com_err(whoami, response, "transfer request (XFER) rejected");
       close(fd);
-      return n;
+      return response;
     }
 
-  code = receive_object(conn, (char *)&n, INTEGER_T);
+  code = recv_int(conn, &response);
   if (code)
     {
-      com_err(whoami, connection_errno(conn), ": lost connection");
+      com_err(whoami, code, ": lost connection");
       close(fd);
-      return connection_errno(conn);
+      return code;
     }
-  if (n)
+  if (response)
     {
-      com_err(whoami, n, " from remote server: can't update %s", pathname);
+      com_err(whoami, response, " from remote server: can't update %s",
+             pathname);
       close(fd);
-      return n;
+      return response;
     }
 
   if (encrypt)
     {
+#ifdef HAVE_KRB4
       des_key_sched(session, sched);
       memmove(ivec, session, sizeof(ivec));
+#else
+      /* The session key only gets stored if auth happens in krb4 to
+         begin with. If you don't have krb4, you can't possibly be
+         coming up with a valid session key. */
+      return MR_NO_KRB4;
+#endif
     }
 
   while (n_to_send > 0)
     {
-      n = read(fd, STRING_DATA(data), UPDATE_BUFSIZ);
+      n = read(fd, data, sizeof(data));
       if (n < 0)
        {
-         com_err(whoami, errno, " reading %s for transmission", pathname);
+         com_err(whoami, errno, "reading %s for transmission", pathname);
          close(fd);
          return MR_ABORTED;
        }
-      MAX_STRING_SIZE(data) = n;
       if (encrypt)
        {
-         src = (unsigned char *)STRING_DATA(data);
-         memmove(dst, src, n);
-         memset(dst + n, 0, 7);
-         /* encrypt! */
-         des_pcbc_encrypt(dst, src, n, sched, ivec, 0);
+#ifdef HAVE_KRB4
+         memset(data + n, 0, sizeof(data) -n);
+         des_pcbc_encrypt(data, enc, (n + 7) & ~7, sched, ivec, 0);
          /* save vector to continue chaining */
          for (i = 0; i < 8; i++)
-           ivec[i] = dst[n - 8 + i] ^ src[n - 8 + i];
+           ivec[i] = data[n - 8 + i] ^ enc[n - 8 + i];
          /* round up to multiple of 8 */
-         data.length = (data.length + 7) & 0xfffffff8;
+         n = (n + 7) & ~7;
+         code = send_string(conn, enc, n);
+#endif
        }
-      code = send_object(conn, (char *)&data, STRING_T);
+      else
+       code = send_string(conn, data, n);
       if (code)
        {
-         com_err(whoami, connection_errno(conn), " transmitting file %s",
-                 pathname);
+         com_err(whoami, code, "transmitting file %s", pathname);
          close(fd);
-         return connection_errno(conn);
+         return code;
        }
+
       n_to_send -= n;
-      code = receive_object(conn, (char *)&n, INTEGER_T);
+      code = recv_int(conn, &response);
       if (code)
        {
-         com_err(whoami, connection_errno(conn),
-                 " awaiting ACK remote server during transmission of %s",
+         com_err(whoami, code, "awaiting ACK during transmission of %s",
                  pathname);
          close(fd);
-         return connection_errno(conn);
+         return code;
        }
-      if (n)
+      if (response)
        {
-         com_err(whoami, n, " from remote server during transmission of %s",
+         com_err(whoami, response,
+                 "from remote server during transmission of %s",
                  pathname);
          close(fd);
-         return n;
+         return response;
        }
     }
+
   if (statb.st_size == 0)
     {
-      code = receive_object(conn, (char *)&n, INTEGER_T);
+      code = recv_int(conn, &response);
       if (code)
        {
-         com_err(whoami, connection_errno(conn),
-                 " awaiting ACK remote server after transmission of %s",
+         com_err(whoami, code, "awaiting ACK after transmission of %s",
                  pathname);
          close(fd);
-         return connection_errno(conn);
+         return code;
        }
-      if (n)
+      if (response)
        {
-         com_err(whoami, n, " from remote server after transmission of %s",
+         com_err(whoami, response,
+                 "from remote server after transmission of %s",
                  pathname);
          close(fd);
-         return n;
+         return response;
        }
     }
   close(fd);
This page took 0.224891 seconds and 4 git commands to generate.