+static S3Status s3store_list_handler(int isTruncated,
+ const char *nextMarker,
+ int contentsCount,
+ const S3ListBucketContent *contents,
+ int commonPrefixesCount,
+ const char **commonPrefixes,
+ void *callbackData)
+{
+ struct list_info *info = (struct list_info *)callbackData;
+ if (contentsCount > 0) {
+ g_free(info->last_entry);
+ info->last_entry = g_strdup(contents[contentsCount - 1].key);
+ }
+ info->truncated = isTruncated;
+ return S3StatusOK;
+}
+
+static char *s3store_lookup_last(gpointer s, const char *prefix)
+{
+ S3Store *store = (S3Store *)s;
+ struct list_info info = {0, NULL, FALSE};
+
+ struct S3ListBucketHandler handler;
+ handler.responseHandler.propertiesCallback
+ = s3store_properties_callback;
+ handler.responseHandler.completeCallback = s3store_response_callback;
+ handler.listBucketCallback = s3store_list_handler;
+
+ char *marker = NULL;
+
+ do {
+ S3_list_bucket(&store->bucket, prefix, marker, NULL, 1024, NULL,
+ &handler, &info);
+ g_free(marker);
+ marker = g_strdup(info.last_entry);
+ g_print("Last key: %s\n", info.last_entry);
+ } while (info.truncated);
+
+ g_free(marker);
+
+ return info.last_entry;
+}
+
+static gpointer s3store_new(const gchar *path)