#ifdef PAKFIRE_PRIVATE
+#include <pakfire/ctx.h>
+#include <pakfire/pakfire.h>
extern const char* pakfire_scriptlet_types[13];
struct pakfire_scriptlet;
-int pakfire_scriptlet_create(struct pakfire_scriptlet** scriptlet, struct pakfire* pakfire,
- const char* type, const char* data, size_t size);
+int pakfire_scriptlet_create(struct pakfire_scriptlet** scriptlet,
+ struct pakfire_ctx* ctx, const char* type, const char* data, size_t size);
struct pakfire_scriptlet* pakfire_scriptlet_ref(struct pakfire_scriptlet* scriptlet);
struct pakfire_scriptlet* pakfire_scriptlet_unref(struct pakfire_scriptlet* scriptlet);
const char* pakfire_scriptlet_get_type(struct pakfire_scriptlet* scriptlet);
const char* pakfire_scriptlet_get_data(struct pakfire_scriptlet* scriptlet, size_t* size);
-int pakfire_scriptlet_execute(struct pakfire_scriptlet* scriptlet);
+int pakfire_scriptlet_execute(struct pakfire_scriptlet* scriptlet, struct pakfire* pakfire);
-#endif
+#endif /* PAKFIRE_PRIVATE */
#endif /* PAKFIRE_SCRIPTLET_H */
#include <stdlib.h>
#include <string.h>
+#include <pakfire/ctx.h>
#include <pakfire/jail.h>
#include <pakfire/logging.h>
+#include <pakfire/pakfire.h>
#include <pakfire/scriptlet.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
};
struct pakfire_scriptlet {
- struct pakfire* pakfire;
+ struct pakfire_ctx* ctx;
int nrefs;
// Type
// Allocate space for data
scriptlet->data = malloc(size);
if (!scriptlet->data)
- return 1;
+ return -errno;
// Copy data
memcpy(scriptlet->data, data, size);
static void pakfire_scriptlet_free(struct pakfire_scriptlet* scriptlet) {
if (scriptlet->data)
free(scriptlet->data);
-
- pakfire_unref(scriptlet->pakfire);
+ if (scriptlet->ctx)
+ pakfire_ctx_unref(scriptlet->ctx);
free(scriptlet);
}
-int pakfire_scriptlet_create(struct pakfire_scriptlet** scriptlet, struct pakfire* pakfire,
- const char* type, const char* data, size_t size) {
- if (!type || !data) {
- errno = EINVAL;
- return 1;
- }
+int pakfire_scriptlet_create(struct pakfire_scriptlet** scriptlet,
+ struct pakfire_ctx* ctx, const char* type, const char* data, size_t size) {
+ int r;
+
+ // Check inputs
+ if (!type || !data)
+ return -EINVAL;
// Do we know this type?
- if (!pakfire_scriptlet_valid_type(type)) {
- errno = ENOTSUP;
- return 1;
- }
+ if (!pakfire_scriptlet_valid_type(type))
+ return -ENOTSUP;
+ // Allocate some memory
struct pakfire_scriptlet* s = calloc(1, sizeof(*s));
if (!s)
- return 1;
+ return -errno;
+
+ // Store reference to the context
+ s->ctx = pakfire_ctx_ref(ctx);
- // Store reference to Pakfire
- s->pakfire = pakfire_ref(pakfire);
+ // Initialize the reference counter
s->nrefs = 1;
// Set type
- pakfire_string_set(s->type, type);
+ r = pakfire_string_set(s->type, type);
+ if (r)
+ goto ERROR;
- int r = pakfire_scriptlet_set(s, data, size);
- if (r) {
- pakfire_scriptlet_free(s);
- return 1;
- }
+ // Store the payload
+ r = pakfire_scriptlet_set(s, data, size);
+ if (r)
+ goto ERROR;
+ // Return the pointer
*scriptlet = s;
+
return 0;
+
+ERROR:
+ pakfire_scriptlet_free(s);
+
+ return r;
};
struct pakfire_scriptlet* pakfire_scriptlet_ref(struct pakfire_scriptlet* scriptlet) {
return 0;
}
-int pakfire_scriptlet_execute(struct pakfire_scriptlet* scriptlet) {
+int pakfire_scriptlet_execute(struct pakfire_scriptlet* scriptlet, struct pakfire* pakfire) {
// Detect what kind of script this is and run it
if (pakfire_scriptlet_is_shell_script(scriptlet))
- return pakfire_jail_run_script(scriptlet->pakfire,
- scriptlet->data, scriptlet->size, NULL, 0);
+ return pakfire_jail_run_script(pakfire, scriptlet->data, scriptlet->size, NULL, 0);
- ERROR(scriptlet->pakfire, "Scriptlet is of an unknown kind\n");
- errno = ENOTSUP;
- return 1;
+ CTX_ERROR(scriptlet->ctx, "Scriptlet is of an unknown kind\n");
+ return -ENOTSUP;
}