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