lintian doesn't like orphan packages with uploaders...
[debian/amanda] / device-src / s3.h
index b3d3b39ba880a3435c2414d1a0c4b67572df55fa..49cb00a6593ec2140d9b6e07b5e9b29590f26b85 100644 (file)
@@ -1,21 +1,22 @@
 /*
- * Copyright (c) 2005-2008 Zmanda Inc.  All Rights Reserved.
- * 
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License version 2.1 as 
- * published by the Free Software Foundation.
- * 
- * This library is distributed in the hope that it will be useful, but
+ * Copyright (c) 2008-2012 Zmanda, Inc.  All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
- * License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA.
- * 
- * Contact information: Zmanda Inc., 465 S Mathlida Ave, Suite 300
- * Sunnyvale, CA 94086, USA, or: http://www.zmanda.com
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ * Contact information: Zmanda Inc., 465 S. Mathilda Ave., Suite 300
+ * Sunnyvale, CA 94085, USA, or: http://www.zmanda.com
  */
 
 #ifndef __S3_H__
  * Data types
  */
 
+typedef enum {
+   S3_API_S3,
+   S3_API_SWIFT_1,
+   S3_API_SWIFT_2,
+   S3_API_OAUTH2,
+   S3_API_CASTOR
+} S3_api;
+
 /* An opaque handle.  S3Handles should only be accessed from a single
  * thread at any given time, although it is fine to use different handles
  * in different threads simultaneously. */
@@ -115,7 +124,7 @@ typedef curl_progress_callback s3_progress_func;
 /* This preprocessor magic will enumerate constants named S3_ERROR_XxxYyy for
  * each of the errors in parentheses.
  *
- * see http://docs.amazonwebservices.com/AmazonS3/2006-03-01/ErrorCodeList.html
+ * see http://docs.amazonwebservices.com/AmazonS3/latest/API/ErrorResponses.html
  * for Amazon's breakdown of error responses.
  */
 #define S3_ERROR_LIST \
@@ -153,6 +162,7 @@ typedef curl_progress_callback s3_progress_func;
     S3_ERROR(MissingSecurityHeader), \
     S3_ERROR(NoLoggingStatusForKey), \
     S3_ERROR(NoSuchBucket), \
+    S3_ERROR(NoSuchEntity), \
     S3_ERROR(NoSuchKey), \
     S3_ERROR(NotImplemented), \
     S3_ERROR(NotSignedUp), \
@@ -165,6 +175,12 @@ typedef curl_progress_callback s3_progress_func;
     S3_ERROR(UnexpectedContent), \
     S3_ERROR(UnresolvableGrantByEmailAddress), \
     S3_ERROR(Unknown), \
+    S3_ERROR(Unauthorized), \
+    S3_ERROR(Created), \
+    S3_ERROR(Accepted), \
+    S3_ERROR(Forbidden), \
+    S3_ERROR(Conflict), \
+    S3_ERROR(AuthenticationRequired), \
     S3_ERROR(END)
 
 typedef enum {
@@ -198,7 +214,7 @@ s3_curl_location_compat(void);
  *
  * @note This doesn't guarantee that bucket name is entirely valid,
  * just that using it as one (or more) subdomain(s) of s3.amazonaws.com
- * won't fail; that would prevent the reporting of useful messages from 
+ * won't fail; that would prevent the reporting of useful messages from
  * the service.
  *
  * @param bucket: the bucket name
@@ -209,7 +225,7 @@ s3_bucket_location_compat(const char *bucket);
 
 /* Initialize S3 operation
  *
- * If an error occurs in this function, diagnostic information is 
+ * If an error occurs in this function, diagnostic information is
  * printed to stderr.
  *
  * @returns: false if an error occurred
@@ -226,11 +242,41 @@ s3_init(void);
  * @param secret_key: the secret key for Amazon Web Services
  * @param user_token: the user token for Amazon DevPay
  * @param bucket_location: the location constraint for buckets
+ * @param storage_class: the storage class for new objects
+ * @param ca_info: the path to pass to libcurl as the certificate authority.
+ *                 see curl_easy_setopt() CURLOPT_CAINFO for more
  * @returns: the new S3Handle
  */
 S3Handle *
-s3_open(const char * access_key, const char *secret_key, const char * user_token, 
-        const char * bucket_location);
+s3_open(const char * access_key, const char *secret_key,
+       const char *swift_account_id, const char *swift_access_key,
+       const char *host,
+        const char *service_path, gboolean use_subdomain,
+        const char * user_token,
+        const char * bucket_location, const char * storage_class,
+       const char * ca_info, const char * server_side_encryption,
+       const char *proxy,
+       const S3_api s3_api,
+       const char *username,
+       const char *password,
+       const char *tenant_id,
+       const char *tenant_name,
+       const char *client_id,
+       const char *client_secret,
+       const char *refresh_token,
+       const gboolean reuse_connection,
+        const char *reps,
+        const char *reps_bucket);
+
+/* latest step of setting up the S3Handle.
+ *
+ * Must be done after all properties are set.
+ *
+ * @param hdl: the S3Handle to set up.
+ * @returns: false if an error occured
+ */
+gboolean
+s3_open2(S3Handle *hdl);
 
 /* Deallocate an S3Handle
  *
@@ -256,7 +302,7 @@ s3_reset(S3Handle *hdl);
  * NULL, that result will not be returned.  Caller is not responsible for
  * freeing any returned strings, although the results are only valid until
  * the next call to an S3 function with this handle.
- * 
+ *
  * @param hdl: the S3Handle object
  * @param message: (result) the error message, or NULL if none exists
  * @param response_code: (result) the HTTP response code (or 0 if none exists)
@@ -293,6 +339,24 @@ s3_verbose(S3Handle *hdl,
 gboolean
 s3_use_ssl(S3Handle *hdl, gboolean use_ssl);
 
+/* Control the throttling of S3 uploads.  Only supported with curl >= 7.15.5.
+ *
+ * @param hdl: the S3Handle object
+ * @param max_send_speed: max speed (bytes/sec) at which to send
+ * @returns: true if the setting is valid
+ */
+gboolean
+s3_set_max_send_speed(S3Handle *hdl, guint64 max_send_speed);
+
+/* Control the throttling of S3 downloads.  Only supported with curl >= 7.15.5.
+ *
+ * @param hdl: the S3Handle object
+ * @param max_recv_speed: max speed (bytes/sec) at which to receive
+ * @returns: true if the setting is valid
+ */
+gboolean
+s3_set_max_recv_speed(S3Handle *hdl, guint64 max_recv_speed);
+
 /* Get the error information from the last operation on this handle,
  * formatted as a string.
  *
@@ -305,7 +369,7 @@ char *
 s3_strerror(S3Handle *hdl);
 
 /* Perform an upload.
- * 
+ *
  * When this function returns, KEY and BUFFER remain the
  * responsibility of the caller.
  *
@@ -334,7 +398,7 @@ s3_upload(S3Handle *hdl,
           s3_progress_func progress_func,
           gpointer progress_data);
 
-/* List all of the files matching the pseudo-glob C{PREFIX*DELIMITER*}, 
+/* List all of the files matching the pseudo-glob C{PREFIX*DELIMITER*},
  * returning only that portion which matches C{PREFIX*DELIMITER}.  S3 supports
  * this particular semantics, making it quite efficient.  The returned list
  * should be freed by the caller.
@@ -344,6 +408,7 @@ s3_upload(S3Handle *hdl,
  * @param prefix: the prefix
  * @param delimiter: delimiter (any length string)
  * @param list: (output) the list of files
+ * @param total_size: (output) sum of size of files 
  * @returns: FALSE if an error occurs
  */
 gboolean
@@ -351,7 +416,8 @@ s3_list_keys(S3Handle *hdl,
               const char *bucket,
               const char *prefix,
               const char *delimiter,
-              GSList **list);
+              GSList **list,
+              guint64 *total_size);
 
 /* Read an entire file, passing the contents to write_func buffer
  * by buffer.
@@ -388,6 +454,19 @@ s3_delete(S3Handle *hdl,
           const char *bucket,
           const char *key);
 
+/* Delete multiple file.
+ *
+ * @param hdl: the S3Handle object
+ * @param bucket: the bucket to delete from
+ * @param key: the key array to delete
+ * @returns: 0 on sucess, 1 if multi_delete is not supported, 2 if an error
+ *           occurs; a non-existent file is I{not} considered an error.
+ */
+int
+s3_multi_delete(S3Handle *hdl,
+                const char *bucket,
+                const char **key);
+
 /* Create a bucket.
  *
  * @param hdl: the S3Handle object
@@ -396,7 +475,31 @@ s3_delete(S3Handle *hdl,
  */
 gboolean
 s3_make_bucket(S3Handle *hdl,
-               const char *bucket);
+               const char *bucket,
+              const char *project_id);
+
+/* Check if a bucket exists.
+ *
+ * @param hdl: the S3Handle object
+ * @param bucket: the bucket to create
+ * @returns: FALSE if an error occur
+ */
+gboolean
+s3_is_bucket_exists(S3Handle *hdl,
+                    const char *bucket,
+                   const char *project_id);
+
+/* Delete a bucket
+ *
+ * @note A bucket can not be deleted if it still contains keys
+ *
+ * @param hdl: the S3Handle object
+ * @param bucket: the bucket to delete
+ * @returns: FALSE if an error occurs
+ */
+gboolean
+s3_delete_bucket(S3Handle *hdl,
+                 const char *bucket);
 
 /* Attempt a RefreshAWSSecurityToken on a token; if it succeeds, the old
  * token will be freed and replaced by the new. If it fails, the old