Annotation of src/usr.bin/ssh/roaming_common.c, Revision 1.2
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.2 ! andreas 73: debug("Wrote %ld bytes for a total of %lld", (long)ret, write_bytes);
1.1 andreas 74: return ret;
75: }
76:
77: ssize_t
78: roaming_read(int fd, void *buf, size_t count, int *cont)
79: {
80: ssize_t ret = read(fd, buf, count);
81: if (ret > 0) {
82: if (!resume_in_progress) {
83: read_bytes += ret;
84: }
85: }
86: return ret;
87: }
88:
1.2 ! andreas 89: size_t
! 90: roaming_atomicio(ssize_t(*f)(int, void*, size_t), int fd, void *buf,
! 91: size_t count)
1.1 andreas 92: {
1.2 ! andreas 93: size_t ret = atomicio(f, fd, buf, count);
1.1 andreas 94:
1.2 ! andreas 95: if (f == vwrite && ret > 0 && !resume_in_progress) {
1.1 andreas 96: write_bytes += ret;
97: } else if (f == read && ret > 0 && !resume_in_progress) {
98: read_bytes += ret;
99: }
100: return ret;
101: }