Annotation of src/usr.bin/rsync/session.c, Revision 1.3
1.3 ! deraadt 1: /* $Id: session.c,v 1.2 2019/02/10 23:24:14 benno Exp $ */
1.1 benno 2: /*
3: * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17: #include <sys/param.h>
18:
19: #include <assert.h>
20: #include <stdint.h>
21: #include <stdlib.h>
22: #include <unistd.h>
23:
24: #include "extern.h"
25:
26: /*
27: * Accept how much we've read, written, and file-size, and print them in
28: * a human-readable fashion (with GB, MB, etc. prefixes).
29: * This only prints as the client.
30: */
31: static void
1.2 benno 32: stats_log(struct sess *sess,
1.1 benno 33: uint64_t tread, uint64_t twrite, uint64_t tsize)
34: {
35: double tr, tw, ts;
36: const char *tru = "B", *twu = "B", *tsu = "B";
37: int trsz = 0, twsz = 0, tssz = 0;
38:
39: assert(sess->opts->verbose);
40: if (sess->opts->server)
41: return;
42:
43: if (tread >= 1024 * 1024 * 1024) {
44: tr = tread / (1024.0 * 1024.0 * 1024.0);
45: tru = "GB";
46: trsz = 3;
47: } else if (tread >= 1024 * 1024) {
48: tr = tread / (1024.0 * 1024.0);
49: tru = "MB";
50: trsz = 2;
51: } else if (tread >= 1024) {
52: tr = tread / 1024.0;
53: tru = "KB";
54: trsz = 1;
55: } else
56: tr = tread;
57:
58: if (twrite >= 1024 * 1024 * 1024) {
59: tw = twrite / (1024.0 * 1024.0 * 1024.0);
60: twu = "GB";
61: twsz = 3;
62: } else if (twrite >= 1024 * 1024) {
63: tw = twrite / (1024.0 * 1024.0);
64: twu = "MB";
65: twsz = 2;
66: } else if (twrite >= 1024) {
67: tw = twrite / 1024.0;
68: twu = "KB";
69: twsz = 1;
70: } else
71: tw = twrite;
72:
73: if (tsize >= 1024 * 1024 * 1024) {
74: ts = tsize / (1024.0 * 1024.0 * 1024.0);
75: tsu = "GB";
76: tssz = 3;
77: } else if (tsize >= 1024 * 1024) {
78: ts = tsize / (1024.0 * 1024.0);
79: tsu = "MB";
80: tssz = 2;
81: } else if (tsize >= 1024) {
82: ts = tsize / 1024.0;
83: tsu = "KB";
84: tssz = 1;
85: } else
86: ts = tsize;
87:
88: LOG1(sess, "Transfer complete: "
89: "%.*lf %s sent, "
90: "%.*lf %s read, "
91: "%.*lf %s file size",
1.2 benno 92: trsz, tr, tru,
93: twsz, tw, twu,
1.1 benno 94: tssz, ts, tsu);
95: }
96:
97: /*
98: * At the end of transmission, we write our statistics if we're the
99: * server, then log only if we're not the server.
100: * Either way, only do this if we're in verbose mode.
101: * Returns zero on failure, non-zero on success.
102: */
103: int
104: sess_stats_send(struct sess *sess, int fd)
105: {
106: uint64_t tw, tr, ts;
107:
108: if (0 == sess->opts->verbose)
109: return 1;
110:
111: tw = sess->total_write;
112: tr = sess->total_read;
113: ts = sess->total_size;
114:
115: if (sess->opts->server) {
1.3 ! deraadt 116: if (!io_write_long(sess, fd, tr)) {
1.1 benno 117: ERRX1(sess, "io_write_long");
118: return 0;
1.3 ! deraadt 119: } else if (!io_write_long(sess, fd, tw)) {
1.1 benno 120: ERRX1(sess, "io_write_long");
121: return 0;
1.3 ! deraadt 122: } else if (!io_write_long(sess, fd, ts)) {
1.1 benno 123: ERRX1(sess, "io_write_long");
124: return 0;
125: }
126: }
127:
128: stats_log(sess, tr, tw, ts);
129: return 1;
130: }
131:
132: /*
133: * At the end of the transmission, we have some statistics to read.
134: * Only do this (1) if we're in verbose mode and (2) if we're the
135: * server.
136: * Then log the findings.
137: * Return zero on failure, non-zero on success.
138: */
139: int
140: sess_stats_recv(struct sess *sess, int fd)
141: {
142: uint64_t tr, tw, ts;
143:
144: if (sess->opts->server || 0 == sess->opts->verbose)
145: return 1;
146:
1.3 ! deraadt 147: if (!io_read_ulong(sess, fd, &tw)) {
1.1 benno 148: ERRX1(sess, "io_read_ulong");
149: return 0;
1.3 ! deraadt 150: } else if (!io_read_ulong(sess, fd, &tr)) {
1.1 benno 151: ERRX1(sess, "io_read_ulong");
152: return 0;
1.3 ! deraadt 153: } else if (!io_read_ulong(sess, fd, &ts)) {
1.1 benno 154: ERRX1(sess, "io_read_ulong");
155: return 0;
156: }
157:
158: stats_log(sess, tr, tw, ts);
159: return 1;
160: }