20634f2454859580a7a51343d19499058603458f
[debian/amanda] / device-src / s3-util.h
1 /*
2  * Copyright (c) 2005-2008 Zmanda Inc.  All Rights Reserved.
3  * 
4  * This library is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License version 2.1 as 
6  * published by the Free Software Foundation.
7  * 
8  * This library is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
10  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
11  * License for more details.
12  * 
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this library; if not, write to the Free Software Foundation,
15  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
16  * 
17  * Contact information: Zmanda Inc., 465 S Mathlida Ave, Suite 300
18  * Sunnyvale, CA 94086, USA, or: http://www.zmanda.com
19  */
20
21 #ifndef __S3_UTIL_H__
22 #define __S3_UTIL_H__
23
24 #ifdef HAVE_REGEX_H
25 #  ifdef HAVE_SYS_TYPES_H
26 #  include <sys/types.h>
27 #  endif
28 #include <regex.h>
29 #endif
30 #include <glib.h>
31
32 /*
33  * Constants
34  */
35
36 /* number of raw bytes in MD5 hash */
37 #define S3_MD5_HASH_BYTE_LEN 16
38 /* length of an MD5 hash encoded as base64 (not including terminating NULL) */
39 #define S3_MD5_HASH_B64_LEN 25
40 /* length of an MD5 hash encoded as hexadecimal (not including terminating NULL) */
41 #define S3_MD5_HASH_HEX_LEN 32
42
43 /*
44  * Types
45  */
46
47 #ifndef HAVE_REGEX_H
48 typedef GRegex* regex_t;
49
50 typedef gint regoff_t;
51 typedef struct
52 {
53     regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
54     regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
55 } regmatch_t;
56
57 typedef enum
58 {
59     REG_NOERROR = 0,      /* Success.  */
60     REG_NOMATCH          /* Didn't find a match (for regexec).  */
61 } reg_errcode_t;
62 #endif
63
64 /*
65  * Functions
66  */
67
68 #ifndef USE_GETTEXT
69 /* we don't use gettextize, so hack around this ... */
70 #define _(str) (str)
71 #endif
72
73 /*
74  * Wrapper around regexec to handle programmer errors.
75  * Only returns if the regexec returns 0 (match) or REG_NOMATCH.
76  * See regexec(3) documentation for the rest.
77  */
78 int
79 s3_regexec_wrap(regex_t *regex,
80            const char *str,
81            size_t nmatch,
82            regmatch_t pmatch[],
83            int eflags);
84
85
86 #ifndef HAVE_AMANDA_H
87 char*
88 find_regex_substring(const char* base_string,
89            const regmatch_t match);
90 #endif
91
92 /* 
93  * Encode bytes using Base-64
94  *
95  * @note: GLib 2.12+ has a function for this (g_base64_encode) 
96  *     but we support much older versions. gnulib does as well, but its
97  *     hard to use correctly (see its notes).
98  *
99  * @param to_enc: The data to encode.
100  * @returns:  A new, null-terminated string or NULL if to_enc is NULL.
101  */
102 gchar*
103 s3_base64_encode(const GByteArray *to_enc);
104
105 /* 
106  * Encode bytes using hexadecimal
107  *
108  * @param to_enc: The data to encode.
109  * @returns:  A new, null-terminated string or NULL if to_enc is NULL.
110  */
111 gchar*
112 s3_hex_encode(const GByteArray *to_enc);
113
114 /* 
115  * Compute the MD5 hash of a blob of data.
116  *
117  * @param to_hash: The data to compute the hash for.
118  * @returns:  A new GByteArray containing the MD5 hash of data or 
119  * NULL if to_hash is NULL.
120  */
121 GByteArray*
122 s3_compute_md5_hash(const GByteArray *to_hash);
123
124 #endif