-rw-r--r-- | rsync/emit.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/rsync/emit.c b/rsync/emit.c new file mode 100644 index 0000000..bdfc6d1 --- a/dev/null +++ b/rsync/emit.c | |||
@@ -0,0 +1,131 @@ | |||
1 | /*= -*- c-basic-offset: 4; indent-tabs-mode: nil; -*- | ||
2 | * | ||
3 | * librsync -- dynamic caching and delta update in HTTP | ||
4 | * $Id$ | ||
5 | * | ||
6 | * Copyright (C) 2000, 2001 by Martin Pool <mbp@samba.org> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU Lesser General Public License | ||
10 | * as published by the Free Software Foundation; either version 2.1 of | ||
11 | * the License, or (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, but | ||
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * Lesser General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU Lesser General Public | ||
19 | * License along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | ||
22 | |||
23 | |||
24 | /* | ||
25 | * [almost sobbing] They don't sleep | ||
26 | * anymore on the beach. They don't | ||
27 | * sleep on the beach anymore. | ||
28 | */ | ||
29 | |||
30 | /* | ||
31 | * TODO: Pluggable encoding formats: | ||
32 | * | ||
33 | * - gdiff-style | ||
34 | * - rsync 24 | ||
35 | * - ed (text) | ||
36 | * - Delta HTTP | ||
37 | */ | ||
38 | |||
39 | |||
40 | #include <config_rsync.h> | ||
41 | |||
42 | #include <assert.h> | ||
43 | #include <stdlib.h> | ||
44 | #include <stdio.h> | ||
45 | |||
46 | #include "rsync.h" | ||
47 | #include "command.h" | ||
48 | #include "protocol.h" | ||
49 | #include "trace.h" | ||
50 | #include "emit.h" | ||
51 | #include "prototab.h" | ||
52 | #include "netint.h" | ||
53 | #include "sumset.h" | ||
54 | #include "job.h" | ||
55 | |||
56 | |||
57 | /* | ||
58 | * Write the magic for the start of a delta. | ||
59 | */ | ||
60 | void | ||
61 | rs_emit_delta_header(rs_job_t *job) | ||
62 | { | ||
63 | rs_trace("emit DELTA magic"); | ||
64 | rs_squirt_n4(job, RS_DELTA_MAGIC); | ||
65 | } | ||
66 | |||
67 | |||
68 | |||
69 | /* Write a LITERAL command. */ | ||
70 | void | ||
71 | rs_emit_literal_cmd(rs_job_t *job, int len) | ||
72 | { | ||
73 | int cmd; | ||
74 | int param_len; | ||
75 | |||
76 | switch (param_len = rs_int_len(len)) { | ||
77 | case 1: | ||
78 | cmd = RS_OP_LITERAL_N1; | ||
79 | break; | ||
80 | case 2: | ||
81 | cmd = RS_OP_LITERAL_N2; | ||
82 | break; | ||
83 | case 4: | ||
84 | cmd = RS_OP_LITERAL_N4; | ||
85 | break; | ||
86 | default: | ||
87 | rs_fatal("What?"); | ||
88 | } | ||
89 | |||
90 | rs_trace("emit LITERAL_N%d(len=%d), cmd_byte=%#x", param_len, len, cmd); | ||
91 | rs_squirt_byte(job, cmd); | ||
92 | rs_squirt_netint(job, len, param_len); | ||
93 | |||
94 | job->stats.lit_cmds++; | ||
95 | job->stats.lit_bytes += len; | ||
96 | job->stats.lit_cmdbytes += 1 + param_len; | ||
97 | } | ||
98 | |||
99 | |||
100 | /** Write a COPY command. */ | ||
101 | void | ||
102 | rs_emit_copy_cmd(rs_job_t *job, rs_long_t where, rs_long_t len) | ||
103 | { | ||
104 | int cmd; | ||
105 | rs_stats_t *stats = &job->stats; | ||
106 | |||
107 | cmd = RS_OP_COPY_N4_N4; | ||
108 | |||
109 | rs_trace("emit COPY_N4_N4(where=%.0f, len=%.0f), cmd_byte=%#x", | ||
110 | (double) where, (double) len, cmd); | ||
111 | rs_squirt_byte(job, cmd); | ||
112 | rs_squirt_netint(job, where, 4); | ||
113 | rs_squirt_netint(job, len, 4); | ||
114 | |||
115 | stats->copy_cmds++; | ||
116 | stats->copy_bytes += len; | ||
117 | stats->copy_cmdbytes += 1 + 4 + 4; | ||
118 | |||
119 | /* TODO: All the stats */ | ||
120 | } | ||
121 | |||
122 | |||
123 | /** Write an END command. */ | ||
124 | void | ||
125 | rs_emit_end_cmd(rs_job_t *job) | ||
126 | { | ||
127 | int cmd = RS_OP_END; | ||
128 | |||
129 | rs_trace("emit END, cmd_byte=%#x", cmd); | ||
130 | rs_squirt_byte(job, cmd); | ||
131 | } | ||