]> andersk Git - moira.git/blame - update/send_file.c
cant_fix takes an argument
[moira.git] / update / send_file.c
CommitLineData
de56407f 1/*
2 * $Source$
3 * $Header$
4 */
546bc43b 5/* (c) Copyright 1988 by the Massachusetts Institute of Technology. */
6/* For copying and distribution information, please see the file */
7/* <mit-copyright.h>. */
de56407f 8
9#ifndef lint
10static char *rcsid_send_file_c = "$Header$";
7da203a3 11#endif
de56407f 12
546bc43b 13#include <mit-copyright.h>
de56407f 14#include <stdio.h>
7100d074 15#include <com_err.h>
16#include <gdb.h>
2ad0a777 17#include <moira.h>
de56407f 18#include <sys/file.h>
7100d074 19#include <sys/stat.h>
d599d457 20#include <des.h>
21#include <krb.h>
7100d074 22#include <update.h>
f9cccf91 23#ifdef POSIX
1acd555f 24#include <fcntl.h>
f9cccf91 25#endif
de56407f 26
27extern CONNECTION conn;
28extern int errno;
29char buf[BUFSIZ];
d599d457 30extern C_Block session;
af30a831 31extern char *whoami;
de56407f 32
33/*
34 * syntax:
35 * (already sent) pathname file_size checksum
36 * <<< (int)code can we send it?
37 * >>> data
38 * <<< 0
39 * >>> data
40 * <<< 0
41 * ....
42 * >>> data (last block)
43 * <<< 0 (on final write, close, sync, checksum)
44 *
45 * returns:
46 * 0 on success
47 * 1 on error (file not found, etc)
48 */
49
50int
d599d457 51send_file(pathname, target_path, encrypt)
7100d074 52char *pathname;
53char *target_path;
d599d457 54int encrypt;
de56407f 55{
d599d457 56 int n, fd, code, n_to_send, i;
de56407f 57 STRING data;
d599d457 58 unsigned char dst[UPDATE_BUFSIZ + 8], *src;
7100d074 59 struct stat statb;
d599d457 60 des_key_schedule sched;
61 des_cblock ivec;
de56407f 62
7100d074 63 /* send file over */
de56407f 64 fd = open(pathname, O_RDONLY, 0);
7100d074 65 if (fd < 0) {
66 com_err(whoami, errno, "unable to open %s for read", pathname);
2ad0a777 67 return(MR_OCONFIG);
7100d074 68 }
69 if (fstat(fd, &statb)) {
70 com_err(whoami, errno, "unable to stat %s", pathname);
71 close(fd);
2ad0a777 72 return(MR_OCONFIG);
7100d074 73 }
74 n_to_send = statb.st_size;
75
d599d457 76 string_alloc(&data, UPDATE_BUFSIZ);
77 sprintf(STRING_DATA(data), "XFER_00%c %d %d %s",
78 (encrypt ? '3' : '2'), n_to_send,
79 checksum_file(pathname), target_path);
7100d074 80 code = send_object(conn, (char *)&data, STRING_T);
81 if (code) {
585b298c 82 com_err(whoami, connection_errno(conn), " sending XFER request");
7100d074 83 close(fd);
585b298c 84 return(connection_errno(conn));
de56407f 85 }
7100d074 86 code = receive_object(conn, (char *)&n, INTEGER_T);
87 if (code) {
585b298c 88 com_err(whoami, connection_errno(conn),
89 " getting reply from XFER request");
7100d074 90 close(fd);
585b298c 91 return(connection_errno(conn));
7100d074 92 }
93 if (n) {
d599d457 94 com_err(whoami, n, " transfer request (XFER) rejected");
7100d074 95 close(fd);
96 return(n);
97 }
98
de56407f 99 code = receive_object(conn, (char *)&n, INTEGER_T);
100 if (code) {
101 com_err(whoami, connection_errno(conn), ": lost connection");
de56407f 102 close(fd);
585b298c 103 return(connection_errno(conn));
de56407f 104 }
105 if (n) {
7100d074 106 com_err(whoami, n, " from remote server: can't update %s",
de56407f 107 pathname);
de56407f 108 close(fd);
7100d074 109 return(n);
de56407f 110 }
77ac78dc 111
d599d457 112 if (encrypt) {
113#ifdef DEBUG
114 printf("Session key %02x %02x %02x %02x %02x %02x %02x %02x\n",
115 session[0], session[1], session[2], session[3],
116 session[4], session[5], session[6], session[7]);
117#endif /* DEBUG */
118 des_key_sched(session, sched);
f9cccf91 119#ifdef POSIX
120 memmove(ivec, session, sizeof(ivec));
121#else
d599d457 122 bcopy(session, ivec, sizeof(ivec));
f9cccf91 123#endif
d599d457 124 }
125
de56407f 126 while (n_to_send > 0) {
127#ifdef DEBUG
128 printf("n_to_send = %d\n", n_to_send);
129#endif /* DEBUG */
130 n = read(fd, STRING_DATA(data), UPDATE_BUFSIZ);
131 if (n < 0) {
7100d074 132 com_err(whoami, errno, " reading %s for transmission", pathname);
de56407f 133 close(fd);
2ad0a777 134 return(MR_ABORTED);
de56407f 135 }
136 MAX_STRING_SIZE(data) = n;
d599d457 137 if (encrypt) {
138 src = (unsigned char *)STRING_DATA(data);
f9cccf91 139#ifdef POSIX
140 memmove(dst, src, n);
141#else
d599d457 142 bcopy(src, dst, n);
f9cccf91 143#endif
144 memset(dst + n, 0, 7);
d599d457 145 /* encrypt! */
146 des_pcbc_encrypt(dst, src, n, sched, ivec, 0);
147 /* save vector to continue chaining */
148 for (i = 0; i < 8; i++)
149 ivec[i] = dst[n - 8 + i] ^ src[n - 8 + i];
150 /* round up to multiple of 8 */
151 data.length = (data.length + 7) & 0xfffffff8;
152 }
de56407f 153 code = send_object(conn, (char *)&data, STRING_T);
154 if (code) {
7100d074 155 com_err(whoami, connection_errno(conn), " transmitting file %s",
156 pathname);
de56407f 157 close(fd);
585b298c 158 return(connection_errno(conn));
de56407f 159 }
160 n_to_send -= n;
161 code = receive_object(conn, (char *)&n, INTEGER_T);
162 if (code) {
7100d074 163 com_err(whoami, connection_errno(conn),
164 " awaiting ACK remote server during transmission of %s",
165 pathname);
de56407f 166 close(fd);
585b298c 167 return(connection_errno(conn));
de56407f 168 }
169 if (n) {
7100d074 170 com_err(whoami, n, " from remote server during transmission of %s",
171 pathname);
de56407f 172 close(fd);
7100d074 173 return(n);
de56407f 174 }
175 }
77ac78dc 176 if (statb.st_size == 0) {
177 code = receive_object(conn, (char *)&n, INTEGER_T);
178 if (code) {
179 com_err(whoami, connection_errno(conn),
180 " awaiting ACK remote server after transmission of %s",
181 pathname);
182 close(fd);
585b298c 183 return(connection_errno(conn));
77ac78dc 184 }
185 if (n) {
186 com_err(whoami, n, " from remote server after transmission of %s",
187 pathname);
188 close(fd);
189 return(n);
190 }
191 }
de56407f 192 close(fd);
2ad0a777 193 return(MR_SUCCESS);
de56407f 194}
This page took 0.115175 seconds and 5 git commands to generate.