]> andersk Git - moira.git/blame - update/send_file.c
posixifcation from miki
[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$";
11#endif lint
12
546bc43b 13#include <mit-copyright.h>
de56407f 14#include <stdio.h>
7100d074 15#include <com_err.h>
16#include <gdb.h>
17#include <dcm.h>
2ad0a777 18#include <moira.h>
de56407f 19#include <sys/file.h>
7100d074 20#include <sys/stat.h>
d599d457 21#include <des.h>
22#include <krb.h>
7100d074 23#include <update.h>
f9cccf91 24#ifdef POSIX
25#include <sys/fcntl.h>
26#endif
de56407f 27
28extern CONNECTION conn;
29extern int errno;
30char buf[BUFSIZ];
d599d457 31extern C_Block session;
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) {
d599d457 82 com_err(whoami, code, " sending XFER request");
7100d074 83 close(fd);
84 return(code);
de56407f 85 }
7100d074 86 code = receive_object(conn, (char *)&n, INTEGER_T);
87 if (code) {
d599d457 88 com_err(whoami, code, " getting reply from XFER request");
7100d074 89 close(fd);
90 return(code);
91 }
92 if (n) {
d599d457 93 com_err(whoami, n, " transfer request (XFER) rejected");
7100d074 94 close(fd);
95 return(n);
96 }
97
de56407f 98 code = receive_object(conn, (char *)&n, INTEGER_T);
99 if (code) {
100 com_err(whoami, connection_errno(conn), ": lost connection");
de56407f 101 close(fd);
7100d074 102 return(code);
de56407f 103 }
104 if (n) {
7100d074 105 com_err(whoami, n, " from remote server: can't update %s",
de56407f 106 pathname);
de56407f 107 close(fd);
7100d074 108 return(n);
de56407f 109 }
77ac78dc 110
d599d457 111 if (encrypt) {
112#ifdef DEBUG
113 printf("Session key %02x %02x %02x %02x %02x %02x %02x %02x\n",
114 session[0], session[1], session[2], session[3],
115 session[4], session[5], session[6], session[7]);
116#endif /* DEBUG */
117 des_key_sched(session, sched);
f9cccf91 118#ifdef POSIX
119 memmove(ivec, session, sizeof(ivec));
120#else
d599d457 121 bcopy(session, ivec, sizeof(ivec));
f9cccf91 122#endif
d599d457 123 }
124
de56407f 125 while (n_to_send > 0) {
126#ifdef DEBUG
127 printf("n_to_send = %d\n", n_to_send);
128#endif /* DEBUG */
129 n = read(fd, STRING_DATA(data), UPDATE_BUFSIZ);
130 if (n < 0) {
7100d074 131 com_err(whoami, errno, " reading %s for transmission", pathname);
de56407f 132 close(fd);
2ad0a777 133 return(MR_ABORTED);
de56407f 134 }
135 MAX_STRING_SIZE(data) = n;
d599d457 136 if (encrypt) {
137 src = (unsigned char *)STRING_DATA(data);
f9cccf91 138#ifdef POSIX
139 memmove(dst, src, n);
140#else
d599d457 141 bcopy(src, dst, n);
f9cccf91 142#endif
143 memset(dst + n, 0, 7);
d599d457 144 /* encrypt! */
145 des_pcbc_encrypt(dst, src, n, sched, ivec, 0);
146 /* save vector to continue chaining */
147 for (i = 0; i < 8; i++)
148 ivec[i] = dst[n - 8 + i] ^ src[n - 8 + i];
149 /* round up to multiple of 8 */
150 data.length = (data.length + 7) & 0xfffffff8;
151 }
de56407f 152 code = send_object(conn, (char *)&data, STRING_T);
153 if (code) {
7100d074 154 com_err(whoami, connection_errno(conn), " transmitting file %s",
155 pathname);
de56407f 156 close(fd);
7100d074 157 return(code);
de56407f 158 }
159 n_to_send -= n;
160 code = receive_object(conn, (char *)&n, INTEGER_T);
161 if (code) {
7100d074 162 com_err(whoami, connection_errno(conn),
163 " awaiting ACK remote server during transmission of %s",
164 pathname);
de56407f 165 close(fd);
7100d074 166 return(code);
de56407f 167 }
168 if (n) {
7100d074 169 com_err(whoami, n, " from remote server during transmission of %s",
170 pathname);
de56407f 171 close(fd);
7100d074 172 return(n);
de56407f 173 }
174 }
77ac78dc 175 if (statb.st_size == 0) {
176 code = receive_object(conn, (char *)&n, INTEGER_T);
177 if (code) {
178 com_err(whoami, connection_errno(conn),
179 " awaiting ACK remote server after transmission of %s",
180 pathname);
181 close(fd);
182 return(code);
183 }
184 if (n) {
185 com_err(whoami, n, " from remote server after transmission of %s",
186 pathname);
187 close(fd);
188 return(n);
189 }
190 }
de56407f 191 close(fd);
2ad0a777 192 return(MR_SUCCESS);
de56407f 193}
This page took 0.11255 seconds and 5 git commands to generate.