Annotation of src/usr.bin/ssh/roaming_common.c, Revision 1.3
1.1 andreas 1: /*
2: * Copyright (c) 2004-2009 AppGate Network Security AB
3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: */
16:
17: #include <sys/types.h>
18: #include <sys/socket.h>
19: #include <sys/uio.h>
20:
21: #include <errno.h>
22: #include <inttypes.h>
23: #include <stdarg.h>
24: #include <unistd.h>
25:
26: #include "atomicio.h"
27: #include "log.h"
28: #include "packet.h"
29: #include "xmalloc.h"
30: #include "cipher.h"
31: #include "buffer.h"
32: #include "roaming.h"
33:
34: static u_int64_t write_bytes = 0;
35: static u_int64_t read_bytes = 0;
36:
37: int resume_in_progress = 0;
38:
39: u_int64_t
40: get_recv_bytes(void)
41: {
42: return read_bytes;
43: }
44:
45: void
46: add_recv_bytes(u_int64_t num)
47: {
48: read_bytes += num;
49: }
50:
51: u_int64_t
52: get_sent_bytes(void)
53: {
54: return write_bytes;
55: }
56:
57: void
1.2 andreas 58: roam_set_bytes(u_int64_t sent, u_int64_t recvd)
1.1 andreas 59: {
1.2 andreas 60: read_bytes = recvd;
1.1 andreas 61: write_bytes = sent;
62: }
63:
64: ssize_t
65: roaming_write(int fd, const void *buf, size_t count, int *cont)
66: {
67: ssize_t ret;
68:
69: ret = write(fd, buf, count);
70: if (ret > 0 && !resume_in_progress) {
71: write_bytes += ret;
72: }
1.3 ! andreas 73: debug3("Wrote %ld bytes for a total of %llu", (long)ret,
! 74: (unsigned long long)write_bytes);
1.1 andreas 75: return ret;
76: }
77:
78: ssize_t
79: roaming_read(int fd, void *buf, size_t count, int *cont)
80: {
81: ssize_t ret = read(fd, buf, count);
82: if (ret > 0) {
83: if (!resume_in_progress) {
84: read_bytes += ret;
85: }
86: }
87: return ret;
88: }
89:
1.2 andreas 90: size_t
91: roaming_atomicio(ssize_t(*f)(int, void*, size_t), int fd, void *buf,
92: size_t count)
1.1 andreas 93: {
1.2 andreas 94: size_t ret = atomicio(f, fd, buf, count);
1.1 andreas 95:
1.2 andreas 96: if (f == vwrite && ret > 0 && !resume_in_progress) {
1.1 andreas 97: write_bytes += ret;
98: } else if (f == read && ret > 0 && !resume_in_progress) {
99: read_bytes += ret;
100: }
101: return ret;
102: }