]> andersk Git - moira.git/blame - update/send_file.c
no longer use special execute_comd.c
[moira.git] / update / send_file.c
CommitLineData
de56407f 1/*
2 * $Source$
3 * $Header$
4 */
5
6#ifndef lint
7static char *rcsid_send_file_c = "$Header$";
8#endif lint
9
10#include <stdio.h>
7100d074 11#include <com_err.h>
12#include <gdb.h>
13#include <dcm.h>
14#include <sms.h>
de56407f 15#include <sys/file.h>
7100d074 16#include <sys/stat.h>
17#include <update.h>
18
de56407f 19
20extern CONNECTION conn;
21extern int errno;
22char buf[BUFSIZ];
de56407f 23
24/*
25 * syntax:
26 * (already sent) pathname file_size checksum
27 * <<< (int)code can we send it?
28 * >>> data
29 * <<< 0
30 * >>> data
31 * <<< 0
32 * ....
33 * >>> data (last block)
34 * <<< 0 (on final write, close, sync, checksum)
35 *
36 * returns:
37 * 0 on success
38 * 1 on error (file not found, etc)
39 */
40
41int
7100d074 42send_file(pathname, target_path)
43char *pathname;
44char *target_path;
de56407f 45{
7100d074 46 int n, fd, code, n_to_send;
de56407f 47 STRING data;
7100d074 48 struct stat statb;
49
50 string_alloc(&data, UPDATE_BUFSIZ);
de56407f 51
7100d074 52 /* send file over */
de56407f 53 fd = open(pathname, O_RDONLY, 0);
7100d074 54 if (fd < 0) {
55 com_err(whoami, errno, "unable to open %s for read", pathname);
56 return(SMS_OCONFIG);
57 }
58 if (fstat(fd, &statb)) {
59 com_err(whoami, errno, "unable to stat %s", pathname);
60 close(fd);
61 return(SMS_OCONFIG);
62 }
63 n_to_send = statb.st_size;
64
65 sprintf(STRING_DATA(data), "XFER_002 %d %d %s",
66 n_to_send, checksum_file(pathname), target_path);
67 code = send_object(conn, (char *)&data, STRING_T);
68 if (code) {
69 com_err(whoami, code, " sending XFER_002 request");
70 close(fd);
71 return(code);
de56407f 72 }
7100d074 73 code = receive_object(conn, (char *)&n, INTEGER_T);
74 if (code) {
75 com_err(whoami, code, " getting reply from XFER_002 request");
76 close(fd);
77 return(code);
78 }
79 if (n) {
80 com_err(whoami, n, " transfer request (XFER_002) rejected");
81 close(fd);
82 return(n);
83 }
84
de56407f 85 code = receive_object(conn, (char *)&n, INTEGER_T);
86 if (code) {
87 com_err(whoami, connection_errno(conn), ": lost connection");
de56407f 88 close(fd);
7100d074 89 return(code);
de56407f 90 }
91 if (n) {
7100d074 92 com_err(whoami, n, " from remote server: can't update %s",
de56407f 93 pathname);
de56407f 94 close(fd);
7100d074 95 return(n);
de56407f 96 }
77ac78dc 97
de56407f 98 while (n_to_send > 0) {
99#ifdef DEBUG
100 printf("n_to_send = %d\n", n_to_send);
101#endif /* DEBUG */
102 n = read(fd, STRING_DATA(data), UPDATE_BUFSIZ);
103 if (n < 0) {
7100d074 104 com_err(whoami, errno, " reading %s for transmission", pathname);
de56407f 105 close(fd);
7100d074 106 return(SMS_ABORTED);
de56407f 107 }
108 MAX_STRING_SIZE(data) = n;
109 code = send_object(conn, (char *)&data, STRING_T);
110 if (code) {
7100d074 111 com_err(whoami, connection_errno(conn), " transmitting file %s",
112 pathname);
de56407f 113 close(fd);
7100d074 114 return(code);
de56407f 115 }
116 n_to_send -= n;
117 code = receive_object(conn, (char *)&n, INTEGER_T);
118 if (code) {
7100d074 119 com_err(whoami, connection_errno(conn),
120 " awaiting ACK remote server during transmission of %s",
121 pathname);
de56407f 122 close(fd);
7100d074 123 return(code);
de56407f 124 }
125 if (n) {
7100d074 126 com_err(whoami, n, " from remote server during transmission of %s",
127 pathname);
de56407f 128 close(fd);
7100d074 129 return(n);
de56407f 130 }
131 }
77ac78dc 132 if (statb.st_size == 0) {
133 code = receive_object(conn, (char *)&n, INTEGER_T);
134 if (code) {
135 com_err(whoami, connection_errno(conn),
136 " awaiting ACK remote server after transmission of %s",
137 pathname);
138 close(fd);
139 return(code);
140 }
141 if (n) {
142 com_err(whoami, n, " from remote server after transmission of %s",
143 pathname);
144 close(fd);
145 return(n);
146 }
147 }
de56407f 148 close(fd);
7100d074 149 return(SMS_SUCCESS);
de56407f 150}
This page took 0.077398 seconds and 5 git commands to generate.