Branch data Line data Source code
1 : : /* $OpenBSD: uuencode.c,v 1.27 2013/05/17 00:13:14 djm Exp $ */
2 : : /*
3 : : * Copyright (c) 2000 Markus Friedl. All rights reserved.
4 : : *
5 : : * Redistribution and use in source and binary forms, with or without
6 : : * modification, are permitted provided that the following conditions
7 : : * are met:
8 : : * 1. Redistributions of source code must retain the above copyright
9 : : * notice, this list of conditions and the following disclaimer.
10 : : * 2. Redistributions in binary form must reproduce the above copyright
11 : : * notice, this list of conditions and the following disclaimer in the
12 : : * documentation and/or other materials provided with the distribution.
13 : : *
14 : : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15 : : * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 : : * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 : : * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18 : : * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 : : * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 : : * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 : : * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 : : * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 : : */
25 : :
26 : : #include "includes.h"
27 : :
28 : : #include <sys/types.h>
29 : : #include <netinet/in.h>
30 : : #include <resolv.h>
31 : : #include <stdio.h>
32 : : #include <stdlib.h>
33 : :
34 : : #include "xmalloc.h"
35 : : #include "uuencode.h"
36 : :
37 : : /*
38 : : * Encode binary 'src' of length 'srclength', writing base64-encoded text
39 : : * to 'target' of size 'targsize'. Will always nul-terminate 'target'.
40 : : * Returns the number of bytes stored in 'target' or -1 on error (inc.
41 : : * 'targsize' too small).
42 : : */
43 : : int
44 : 165 : uuencode(const u_char *src, u_int srclength,
45 : : char *target, size_t targsize)
46 : : {
47 : 165 : return __b64_ntop(src, srclength, target, targsize);
48 : : }
49 : :
50 : : /*
51 : : * Decode base64-encoded 'src' into buffer 'target' of 'targsize' bytes.
52 : : * Will skip leading and trailing whitespace. Returns the number of bytes
53 : : * stored in 'target' or -1 on error (inc. targsize too small).
54 : : */
55 : : int
56 : 9172 : uudecode(const char *src, u_char *target, size_t targsize)
57 : : {
58 : : int len;
59 : : char *encoded, *p;
60 : :
61 : : /* copy the 'readonly' source */
62 : 9172 : encoded = xstrdup(src);
63 : : /* skip whitespace and data */
64 [ - + ]: 9172 : for (p = encoded; *p == ' ' || *p == '\t'; p++)
65 : : ;
66 [ + + ][ + - ]: 3702715 : for (; *p != '\0' && *p != ' ' && *p != '\t'; p++)
67 : : ;
68 : : /* and remove trailing whitespace because __b64_pton needs this */
69 : 9172 : *p = '\0';
70 : 9172 : len = __b64_pton(encoded, target, targsize);
71 : 9172 : free(encoded);
72 : 9172 : return len;
73 : : }
74 : :
75 : : void
76 : 5 : dump_base64(FILE *fp, const u_char *data, u_int len)
77 : : {
78 : : char *buf;
79 : : int i, n;
80 : :
81 [ - + ]: 5 : if (len > 65536) {
82 : : fprintf(fp, "dump_base64: len > 65536\n");
83 : 5 : return;
84 : : }
85 : 5 : buf = xmalloc(2*len);
86 : 10 : n = uuencode(data, len, buf, 2*len);
87 [ + + ]: 2113 : for (i = 0; i < n; i++) {
88 : 2108 : fprintf(fp, "%c", buf[i]);
89 [ + + ]: 2108 : if (i % 70 == 69)
90 : : fprintf(fp, "\n");
91 : : }
92 [ + - ]: 5 : if (i % 70 != 69)
93 : : fprintf(fp, "\n");
94 : 5 : free(buf);
95 : : }
|