00001
00027 #ifndef LIBS3_H
00028 #define LIBS3_H
00029
00030 #include <stdint.h>
00031 #include <sys/select.h>
00032
00033
00034 #ifdef __cplusplus
00035 extern "C" {
00036 #endif
00037
00038
00123 #define S3_HOSTNAME "s3.amazonaws.com"
00124
00125
00130 #define S3_MAX_BUCKET_NAME_SIZE 255
00131
00135 #define S3_MAX_KEY_SIZE 1024
00136
00137
00142 #define S3_MAX_METADATA_SIZE 2048
00143
00144
00148 #define S3_METADATA_HEADER_NAME_PREFIX "x-amz-meta-"
00149
00150
00158 #define S3_MAX_METADATA_COUNT \
00159 (S3_MAX_METADATA_SIZE / (sizeof(S3_METADATA_HEADER_NAME_PREFIX "nv") - 1))
00160
00161
00167 #define S3_MAX_ACL_GRANT_COUNT 100
00168
00169
00174 #define S3_MAX_GRANTEE_EMAIL_ADDRESS_SIZE 128
00175
00176
00181 #define S3_MAX_GRANTEE_USER_ID_SIZE 128
00182
00183
00188 #define S3_MAX_GRANTEE_DISPLAY_NAME_SIZE 128
00189
00190
00196 #define S3_MAX_AUTHENTICATED_QUERY_STRING_SIZE \
00197 (sizeof("https://" S3_HOSTNAME "/") + (S3_MAX_KEY_SIZE * 3) + \
00198 sizeof("?AWSAccessKeyId=") + 32 + sizeof("&Expires=") + 32 + \
00199 sizeof("&Signature=") + 28 + 1)
00200
00201
00207 #define S3_INIT_WINSOCK 1
00208
00209
00214 #define S3_INIT_ALL (S3_INIT_WINSOCK)
00215
00216
00226 typedef enum
00227 {
00228 S3StatusOK ,
00229
00234 S3StatusInternalError ,
00235 S3StatusOutOfMemory ,
00236 S3StatusInterrupted ,
00237 S3StatusInvalidBucketNameTooLong ,
00238 S3StatusInvalidBucketNameFirstCharacter ,
00239 S3StatusInvalidBucketNameCharacter ,
00240 S3StatusInvalidBucketNameCharacterSequence ,
00241 S3StatusInvalidBucketNameTooShort ,
00242 S3StatusInvalidBucketNameDotQuadNotation ,
00243 S3StatusQueryParamsTooLong ,
00244 S3StatusFailedToInitializeRequest ,
00245 S3StatusMetaDataHeadersTooLong ,
00246 S3StatusBadMetaData ,
00247 S3StatusBadContentType ,
00248 S3StatusContentTypeTooLong ,
00249 S3StatusBadMD5 ,
00250 S3StatusMD5TooLong ,
00251 S3StatusBadCacheControl ,
00252 S3StatusCacheControlTooLong ,
00253 S3StatusBadContentDispositionFilename ,
00254 S3StatusContentDispositionFilenameTooLong ,
00255 S3StatusBadContentEncoding ,
00256 S3StatusContentEncodingTooLong ,
00257 S3StatusBadIfMatchETag ,
00258 S3StatusIfMatchETagTooLong ,
00259 S3StatusBadIfNotMatchETag ,
00260 S3StatusIfNotMatchETagTooLong ,
00261 S3StatusHeadersTooLong ,
00262 S3StatusKeyTooLong ,
00263 S3StatusUriTooLong ,
00264 S3StatusXmlParseFailure ,
00265 S3StatusEmailAddressTooLong ,
00266 S3StatusUserIdTooLong ,
00267 S3StatusUserDisplayNameTooLong ,
00268 S3StatusGroupUriTooLong ,
00269 S3StatusPermissionTooLong ,
00270 S3StatusTargetBucketTooLong ,
00271 S3StatusTargetPrefixTooLong ,
00272 S3StatusTooManyGrants ,
00273 S3StatusBadGrantee ,
00274 S3StatusBadPermission ,
00275 S3StatusXmlDocumentTooLarge ,
00276 S3StatusNameLookupError ,
00277 S3StatusFailedToConnect ,
00278 S3StatusServerFailedVerification ,
00279 S3StatusConnectionFailed ,
00280 S3StatusAbortedByCallback ,
00281
00285 S3StatusErrorAccessDenied ,
00286 S3StatusErrorAccountProblem ,
00287 S3StatusErrorAmbiguousGrantByEmailAddress ,
00288 S3StatusErrorBadDigest ,
00289 S3StatusErrorBucketAlreadyExists ,
00290 S3StatusErrorBucketAlreadyOwnedByYou ,
00291 S3StatusErrorBucketNotEmpty ,
00292 S3StatusErrorCredentialsNotSupported ,
00293 S3StatusErrorCrossLocationLoggingProhibited ,
00294 S3StatusErrorEntityTooSmall ,
00295 S3StatusErrorEntityTooLarge ,
00296 S3StatusErrorExpiredToken ,
00297 S3StatusErrorIncompleteBody ,
00298 S3StatusErrorIncorrectNumberOfFilesInPostRequest ,
00299 S3StatusErrorInlineDataTooLarge ,
00300 S3StatusErrorInternalError ,
00301 S3StatusErrorInvalidAccessKeyId ,
00302 S3StatusErrorInvalidAddressingHeader ,
00303 S3StatusErrorInvalidArgument ,
00304 S3StatusErrorInvalidBucketName ,
00305 S3StatusErrorInvalidDigest ,
00306 S3StatusErrorInvalidLocationConstraint ,
00307 S3StatusErrorInvalidPayer ,
00308 S3StatusErrorInvalidPolicyDocument ,
00309 S3StatusErrorInvalidRange ,
00310 S3StatusErrorInvalidSecurity ,
00311 S3StatusErrorInvalidSOAPRequest ,
00312 S3StatusErrorInvalidStorageClass ,
00313 S3StatusErrorInvalidTargetBucketForLogging ,
00314 S3StatusErrorInvalidToken ,
00315 S3StatusErrorInvalidURI ,
00316 S3StatusErrorKeyTooLong ,
00317 S3StatusErrorMalformedACLError ,
00318 S3StatusErrorMalformedXML ,
00319 S3StatusErrorMaxMessageLengthExceeded ,
00320 S3StatusErrorMaxPostPreDataLengthExceededError ,
00321 S3StatusErrorMetadataTooLarge ,
00322 S3StatusErrorMethodNotAllowed ,
00323 S3StatusErrorMissingAttachment ,
00324 S3StatusErrorMissingContentLength ,
00325 S3StatusErrorMissingSecurityElement ,
00326 S3StatusErrorMissingSecurityHeader ,
00327 S3StatusErrorNoLoggingStatusForKey ,
00328 S3StatusErrorNoSuchBucket ,
00329 S3StatusErrorNoSuchKey ,
00330 S3StatusErrorNotImplemented ,
00331 S3StatusErrorNotSignedUp ,
00332 S3StatusErrorOperationAborted ,
00333 S3StatusErrorPermanentRedirect ,
00334 S3StatusErrorPreconditionFailed ,
00335 S3StatusErrorRedirect ,
00336 S3StatusErrorRequestIsNotMultiPartContent ,
00337 S3StatusErrorRequestTimeout ,
00338 S3StatusErrorRequestTimeTooSkewed ,
00339 S3StatusErrorRequestTorrentOfBucketError ,
00340 S3StatusErrorSignatureDoesNotMatch ,
00341 S3StatusErrorSlowDown ,
00342 S3StatusErrorTemporaryRedirect ,
00343 S3StatusErrorTokenRefreshRequired ,
00344 S3StatusErrorTooManyBuckets ,
00345 S3StatusErrorUnexpectedContent ,
00346 S3StatusErrorUnresolvableGrantByEmailAddress ,
00347 S3StatusErrorUserKeyMustBeSpecified ,
00348 S3StatusErrorUnknown ,
00349
00354 S3StatusHttpErrorMovedTemporarily ,
00355 S3StatusHttpErrorBadRequest ,
00356 S3StatusHttpErrorForbidden ,
00357 S3StatusHttpErrorNotFound ,
00358 S3StatusHttpErrorConflict ,
00359 S3StatusHttpErrorUnknown
00360 } S3Status;
00361
00362
00373 typedef enum
00374 {
00375 S3ProtocolHTTPS = 0,
00376 S3ProtocolHTTP = 1
00377 } S3Protocol;
00378
00379
00392 typedef enum
00393 {
00394 S3UriStyleVirtualHost = 0,
00395 S3UriStylePath = 1
00396 } S3UriStyle;
00397
00398
00411 typedef enum
00412 {
00413 S3GranteeTypeAmazonCustomerByEmail = 0,
00414 S3GranteeTypeCanonicalUser = 1,
00415 S3GranteeTypeAllAwsUsers = 2,
00416 S3GranteeTypeAllUsers = 3,
00417 S3GranteeTypeLogDelivery = 4
00418 } S3GranteeType;
00419
00420
00436 typedef enum
00437 {
00438 S3PermissionRead = 0,
00439 S3PermissionWrite = 1,
00440 S3PermissionReadACP = 2,
00441 S3PermissionWriteACP = 3,
00442 S3PermissionFullControl = 4
00443 } S3Permission;
00444
00445
00459 typedef enum
00460 {
00461 S3CannedAclPrivate = 0,
00462 S3CannedAclPublicRead = 1,
00463 S3CannedAclPublicReadWrite = 2,
00464 S3CannedAclAuthenticatedRead = 3
00465 } S3CannedAcl;
00466
00467
00476 typedef struct S3RequestContext S3RequestContext;
00477
00478
00483 typedef struct S3NameValue
00484 {
00488 const char *name;
00489
00493 const char *value;
00494 } S3NameValue;
00495
00496
00503 typedef struct S3ResponseProperties
00504 {
00509 const char *requestId;
00510
00515 const char *requestId2;
00516
00522 const char *contentType;
00523
00531 uint64_t contentLength;
00532
00536 const char *server;
00537
00544 const char *eTag;
00545
00554 int64_t lastModified;
00555
00560 int metaDataCount;
00561
00568 const S3NameValue *metaData;
00569 } S3ResponseProperties;
00570
00571
00578 typedef struct S3AclGrant
00579 {
00583 S3GranteeType granteeType;
00593 union
00594 {
00599 struct
00600 {
00605 char emailAddress[S3_MAX_GRANTEE_EMAIL_ADDRESS_SIZE];
00606 } amazonCustomerByEmail;
00611 struct
00612 {
00616 char id[S3_MAX_GRANTEE_USER_ID_SIZE];
00620 char displayName[S3_MAX_GRANTEE_DISPLAY_NAME_SIZE];
00621 } canonicalUser;
00622 } grantee;
00626 S3Permission permission;
00627 } S3AclGrant;
00628
00629
00636 typedef struct S3BucketContext
00637 {
00641 const char *bucketName;
00642
00646 S3Protocol protocol;
00647
00652 S3UriStyle uriStyle;
00653
00657 const char *accessKeyId;
00658
00662 const char *secretAccessKey;
00663 } S3BucketContext;
00664
00665
00671 typedef struct S3ListBucketContent
00672 {
00676 const char *key;
00677
00682 int64_t lastModified;
00683
00688 const char *eTag;
00689
00693 uint64_t size;
00694
00699 const char *ownerId;
00700
00705 const char *ownerDisplayName;
00706 } S3ListBucketContent;
00707
00708
00714 typedef struct S3PutProperties
00715 {
00720 const char *contentType;
00721
00727 const char *md5;
00728
00733 const char *cacheControl;
00734
00742 const char *contentDispositionFilename;
00743
00749 const char *contentEncoding;
00750
00756 int64_t expires;
00757
00762 S3CannedAcl cannedAcl;
00763
00767 int metaDataCount;
00768
00774 const S3NameValue *metaData;
00775 } S3PutProperties;
00776
00777
00782 typedef struct S3GetConditions
00783 {
00790 int64_t ifModifiedSince;
00791
00798 int64_t ifNotModifiedSince;
00799
00806 const char *ifMatchETag;
00807
00814 const char *ifNotMatchETag;
00815 } S3GetConditions;
00816
00817
00823 typedef struct S3ErrorDetails
00824 {
00829 const char *message;
00830
00834 const char *resource;
00835
00840 const char *furtherDetails;
00841
00846 int extraDetailsCount;
00847
00853 S3NameValue *extraDetails;
00854 } S3ErrorDetails;
00855
00856
00874 typedef S3Status (S3ResponsePropertiesCallback)
00875 (const S3ResponseProperties *properties, void *callbackData);
00876
00877
00894 typedef void (S3ResponseCompleteCallback)(S3Status status,
00895 const S3ErrorDetails *errorDetails,
00896 void *callbackData);
00897
00898
00917 typedef S3Status (S3ListServiceCallback)(const char *ownerId,
00918 const char *ownerDisplayName,
00919 const char *bucketName,
00920 int64_t creationDateSeconds,
00921 void *callbackData);
00922
00923
00954 typedef S3Status (S3ListBucketCallback)(int isTruncated,
00955 const char *nextMarker,
00956 int contentsCount,
00957 const S3ListBucketContent *contents,
00958 int commonPrefixesCount,
00959 const char **commonPrefixes,
00960 void *callbackData);
00961
00962
00981 typedef int (S3PutObjectDataCallback)(int bufferSize, char *buffer,
00982 void *callbackData);
00983
00984
01003 typedef S3Status (S3GetObjectDataCallback)(int bufferSize, const char *buffer,
01004 void *callbackData);
01005
01006
01016 typedef struct S3ResponseHandler
01017 {
01023 S3ResponsePropertiesCallback *propertiesCallback;
01024
01031 S3ResponseCompleteCallback *completeCallback;
01032 } S3ResponseHandler;
01033
01034
01039 typedef struct S3ListServiceHandler
01040 {
01044 S3ResponseHandler responseHandler;
01045
01050 S3ListServiceCallback *listServiceCallback;
01051 } S3ListServiceHandler;
01052
01053
01058 typedef struct S3ListBucketHandler
01059 {
01063 S3ResponseHandler responseHandler;
01064
01071 S3ListBucketCallback *listBucketCallback;
01072 } S3ListBucketHandler;
01073
01074
01079 typedef struct S3PutObjectHandler
01080 {
01084 S3ResponseHandler responseHandler;
01085
01092 S3PutObjectDataCallback *putObjectDataCallback;
01093 } S3PutObjectHandler;
01094
01095
01100 typedef struct S3GetObjectHandler
01101 {
01105 S3ResponseHandler responseHandler;
01106
01114 S3GetObjectDataCallback *getObjectDataCallback;
01115 } S3GetObjectHandler;
01116
01117
01154 S3Status S3_initialize(const char *userAgentInfo, int flags);
01155
01156
01162 void S3_deinitialize();
01163
01164
01171 const char *S3_get_status_name(S3Status status);
01172
01173
01213 S3Status S3_validate_bucket_name(const char *bucketName, S3UriStyle uriStyle);
01214
01215
01242 S3Status S3_convert_acl(char *aclXml, char *ownerId, char *ownerDisplayName,
01243 int *aclGrantCountReturn, S3AclGrant *aclGrants);
01244
01245
01256 int S3_status_is_retryable(S3Status status);
01257
01258
01281 S3Status S3_create_request_context(S3RequestContext **requestContextReturn);
01282
01283
01292 void S3_destroy_request_context(S3RequestContext *requestContext);
01293
01294
01308 S3Status S3_runall_request_context(S3RequestContext *requestContext);
01309
01310
01329 S3Status S3_runonce_request_context(S3RequestContext *requestContext,
01330 int *requestsRemainingReturn);
01331
01332
01363 S3Status S3_get_request_context_fdsets(S3RequestContext *requestContext,
01364 fd_set *readFdSet, fd_set *writeFdSet,
01365 fd_set *exceptFdSet, int *maxFd);
01366
01367
01382 int64_t S3_get_request_context_timeout(S3RequestContext *requestContext);
01383
01384
01414 S3Status S3_generate_authenticated_query_string
01415 (char *buffer, const S3BucketContext *bucketContext,
01416 const char *key, int64_t expires, const char *resource);
01417
01418
01439 void S3_list_service(S3Protocol protocol, const char *accessKeyId,
01440 const char *secretAccessKey,
01441 S3RequestContext *requestContext,
01442 const S3ListServiceHandler *handler,
01443 void *callbackData);
01444
01445
01478 void S3_test_bucket(S3Protocol protocol, S3UriStyle uriStyle,
01479 const char *accessKeyId, const char *secretAccessKey,
01480 const char *bucketName, int locationConstraintReturnSize,
01481 char *locationConstraintReturn,
01482 S3RequestContext *requestContext,
01483 const S3ResponseHandler *handler, void *callbackData);
01484
01485
01506 void S3_create_bucket(S3Protocol protocol, const char *accessKeyId,
01507 const char *secretAccessKey, const char *bucketName,
01508 S3CannedAcl cannedAcl, const char *locationConstraint,
01509 S3RequestContext *requestContext,
01510 const S3ResponseHandler *handler, void *callbackData);
01511
01512
01532 void S3_delete_bucket(S3Protocol protocol, S3UriStyle uriStyle,
01533 const char *accessKeyId, const char *secretAccessKey,
01534 const char *bucketName, S3RequestContext *requestContext,
01535 const S3ResponseHandler *handler, void *callbackData);
01536
01537
01558 void S3_list_bucket(const S3BucketContext *bucketContext,
01559 const char *prefix, const char *marker,
01560 const char *delimiter, int maxkeys,
01561 S3RequestContext *requestContext,
01562 const S3ListBucketHandler *handler, void *callbackData);
01563
01564
01589 void S3_put_object(const S3BucketContext *bucketContext, const char *key,
01590 uint64_t contentLength,
01591 const S3PutProperties *putProperties,
01592 S3RequestContext *requestContext,
01593 const S3PutObjectHandler *handler, void *callbackData);
01594
01595
01630 void S3_copy_object(const S3BucketContext *bucketContext,
01631 const char *key, const char *destinationBucket,
01632 const char *destinationKey,
01633 const S3PutProperties *putProperties,
01634 int64_t *lastModifiedReturn, int eTagReturnSize,
01635 char *eTagReturn, S3RequestContext *requestContext,
01636 const S3ResponseHandler *handler, void *callbackData);
01637
01638
01660 void S3_get_object(const S3BucketContext *bucketContext, const char *key,
01661 const S3GetConditions *getConditions,
01662 uint64_t startByte, uint64_t byteCount,
01663 S3RequestContext *requestContext,
01664 const S3GetObjectHandler *handler, void *callbackData);
01665
01666
01681 void S3_head_object(const S3BucketContext *bucketContext, const char *key,
01682 S3RequestContext *requestContext,
01683 const S3ResponseHandler *handler, void *callbackData);
01684
01699 void S3_delete_object(const S3BucketContext *bucketContext, const char *key,
01700 S3RequestContext *requestContext,
01701 const S3ResponseHandler *handler, void *callbackData);
01702
01703
01734 void S3_get_acl(const S3BucketContext *bucketContext, const char *key,
01735 char *ownerId, char *ownerDisplayName,
01736 int *aclGrantCountReturn, S3AclGrant *aclGrants,
01737 S3RequestContext *requestContext,
01738 const S3ResponseHandler *handler, void *callbackData);
01739
01740
01766 void S3_set_acl(const S3BucketContext *bucketContext, const char *key,
01767 const char *ownerId, const char *ownerDisplayName,
01768 int aclGrantCount, const S3AclGrant *aclGrants,
01769 S3RequestContext *requestContext,
01770 const S3ResponseHandler *handler, void *callbackData);
01771
01772
01813 void S3_get_server_access_logging(const S3BucketContext *bucketContext,
01814 char *targetBucketReturn,
01815 char *targetPrefixReturn,
01816 int *aclGrantCountReturn,
01817 S3AclGrant *aclGrants,
01818 S3RequestContext *requestContext,
01819 const S3ResponseHandler *handler,
01820 void *callbackData);
01821
01822
01852 void S3_set_server_access_logging(const S3BucketContext *bucketContext,
01853 const char *targetBucket,
01854 const char *targetPrefix, int aclGrantCount,
01855 const S3AclGrant *aclGrants,
01856 S3RequestContext *requestContext,
01857 const S3ResponseHandler *handler,
01858 void *callbackData);
01859
01860
01861 #ifdef __cplusplus
01862 }
01863 #endif
01864
01865 #endif