+ case SILC_PARAM_DELETE:
+ {
+ int n = va_arg(ap, int);
+
+ if (!process)
+ break;
+
+ if (n == -1) {
+ /* Move all data from tail to data area */
+ if (dst->data != dst->tail) {
+ memmove(dst->data, dst->tail, silc_buffer_taillen(dst));
+ memset(dst->end - silc_buffer_len(dst), 0, silc_buffer_len(dst));
+ silc_buffer_push_tail(dst, silc_buffer_len(dst));
+ }
+ break;
+ }
+
+ if (n > silc_buffer_len(dst))
+ goto fail;
+
+ memmove(dst->data, dst->data + n, (silc_buffer_len(dst) - n) +
+ silc_buffer_taillen(dst));
+ memset(dst->end - n, 0, n);
+ silc_buffer_push_tail(dst, silc_buffer_len(dst) - n);
+
+ break;
+ }
+