[BACK]Return to session.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / rsync

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: }