|
99 | 99 | REBVAL *method;
|
100 | 100 | REBREQ *req;
|
101 | 101 | REBVAL *arg;
|
| 102 | + REBCNT args = 0; |
102 | 103 | REBVAL *data;
|
103 | 104 | REBVAL *ctx;
|
104 | 105 | REBYTE *temp;
|
|
128 | 129 | Checksum_Open(port, method, ctx_size);
|
129 | 130 | SET_OPEN(req);
|
130 | 131 | }
|
| 132 | + args = Find_Refines(ds, ALL_WRITE_REFS); |
131 | 133 | arg = D_ARG(2);
|
| 134 | + REBYTE *bin = VAL_BIN_DATA(arg); |
| 135 | + REBI64 pos = (REBI64)VAL_INDEX(arg); |
| 136 | + if (args & AM_WRITE_SEEK) { |
| 137 | + pos += Int64(D_ARG(ARG_WRITE_INDEX)); |
| 138 | + if(pos < 0) pos = 0; |
| 139 | + else if (pos > VAL_TAIL(arg)) pos = VAL_TAIL(arg); |
| 140 | + } |
| 141 | + REBI64 part = (REBI64)VAL_TAIL(arg) - pos; |
| 142 | + if (args & AM_WRITE_PART) { |
| 143 | + REBI64 cnt = Int64(D_ARG(ARG_WRITE_LENGTH)); |
| 144 | + if(cnt < 0) { |
| 145 | + cnt = -cnt; |
| 146 | + pos -= cnt; |
| 147 | + if (pos < 0) { |
| 148 | + cnt += pos; |
| 149 | + pos = 0; |
| 150 | + } |
| 151 | + part = cnt; |
| 152 | + } else if (cnt < part) part = cnt; |
| 153 | + } |
| 154 | + if(part <= 0) return R_RET; |
132 | 155 | switch (VAL_WORD_CANON(method)) {
|
133 | 156 | case SYM_MD5:
|
134 |
| - MD5_Update((MD5_CTX*)VAL_BIN(ctx), VAL_BIN_DATA(arg), VAL_TAIL(arg) - VAL_INDEX(arg)); |
| 157 | + MD5_Update((MD5_CTX*)VAL_BIN(ctx), VAL_BIN_SKIP(arg, pos), part); |
135 | 158 | break;
|
136 | 159 | case SYM_SHA1:
|
137 |
| - SHA1_Update((SHA_CTX*)VAL_BIN(ctx), VAL_BIN_DATA(arg), VAL_TAIL(arg) - VAL_INDEX(arg)); |
| 160 | + SHA1_Update((SHA_CTX*)VAL_BIN(ctx), VAL_BIN_SKIP(arg, pos), part); |
138 | 161 | break;
|
139 | 162 | case SYM_SHA256:
|
140 |
| - SHA256_Update((SHA256_CTX*)VAL_BIN(ctx), VAL_BIN_DATA(arg), VAL_TAIL(arg) - VAL_INDEX(arg)); |
| 163 | + SHA256_Update((SHA256_CTX*)VAL_BIN(ctx), VAL_BIN_SKIP(arg, pos), part); |
141 | 164 | break;
|
142 | 165 | }
|
143 | 166 | break;
|
|
176 | 199 | return R_RET;
|
177 | 200 |
|
178 | 201 | case A_OPEN:
|
179 |
| - if (IS_OPEN(req)) return R_RET; |
180 | 202 | if (Checksum_Open(port, method, ctx_size)) {
|
181 | 203 | SET_OPEN(req);
|
182 | 204 | } else {
|
|
0 commit comments