diff --git a/Makefile b/Makefile index 9340e2a..bee0cf0 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ GIT ?= git MASTODONT_DIR = mastodont-c/ MASTODONT = $(MASTODONT_DIR)libmastodont.a CFLAGS += -Wall -I $(MASTODONT_DIR)include/ -Wno-unused-variable -Wno-ignored-qualifiers -I/usr/include/ -I $(MASTODONT_DIR)/libs $(shell pkg-config --cflags libcurl libpcre2-8) `perl -MExtUtils::Embed -e ccopts` -LDFLAGS = -L$(MASTODONT_DIR) -lmastodont $(shell pkg-config --libs libcurl libpcre2-8) -lfcgi -lpthread `perl -MExtUtils::Embed -e ldopts` +LDFLAGS += -L$(MASTODONT_DIR) -lmastodont $(shell pkg-config --libs libcurl libpcre2-8) -lfcgi -lpthread `perl -MExtUtils::Embed -e ldopts` SRC = $(wildcard src/*.c) OBJ = $(patsubst %.c,%.o,$(SRC)) HEADERS = $(wildcard src/*.h) config.h @@ -45,7 +45,7 @@ $(TARGET): $(HEADERS) $(OBJ) $(CC) -o $(TARGET) $(OBJ) $(PAGES_C_OBJ) $(LDFLAGS) filec: src/file-to-c/main.o - $(CC) -o filec $< + $(CC) $(LDFLAGS) -o filec $< emojitoc: scripts/emoji-to.o $(CC) -o emojitoc $< $(LDFLAGS) diff --git a/src/account.c b/src/account.c index 5c67bf7..631e21b 100644 --- a/src/account.c +++ b/src/account.c @@ -58,14 +58,14 @@ static char* accounts_page(HV* session_hv, XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); if (acct) - XPUSHs(newRV_noinc((SV*)perlify_account(acct))); + mXPUSHs(newRV_noinc((SV*)perlify_account(acct))); else ARG_UNDEFINED(); if (rel) - XPUSHs(newRV_noinc((SV*)perlify_relationship(rel))); + mXPUSHs(newRV_noinc((SV*)perlify_relationship(rel))); else ARG_UNDEFINED(); if (accts && accts_len) - XPUSHs(newRV_noinc((SV*)perlify_accounts(accts, accts_len))); + mXPUSHs(newRV_noinc((SV*)perlify_accounts(accts, accts_len))); else ARG_UNDEFINED(); // perlapi doesn't specify if a string length of 0 calls strlen so calling just to be safe... @@ -158,13 +158,13 @@ static char* account_statuses_cb(HV* session_hv, PERL_STACK_INIT; XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); - XPUSHs(newRV_noinc((SV*)perlify_account(acct))); + mXPUSHs(newRV_noinc((SV*)perlify_account(acct))); if (rel) - XPUSHs(newRV_noinc((SV*)perlify_relationship(rel))); + mXPUSHs(newRV_noinc((SV*)perlify_relationship(rel))); else ARG_UNDEFINED(); if (statuses && statuses_len) - XPUSHs(newRV_noinc((SV*)perlify_statuses(statuses, statuses_len))); + mXPUSHs(newRV_noinc((SV*)perlify_statuses(statuses, statuses_len))); else ARG_UNDEFINED(); PERL_STACK_SCALAR_CALL("account::content_statuses"); @@ -203,13 +203,13 @@ static char* account_scrobbles_cb(HV* session_hv, PERL_STACK_INIT; XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); - XPUSHs(newRV_noinc((SV*)perlify_account(acct))); + mXPUSHs(newRV_noinc((SV*)perlify_account(acct))); if (rel) - XPUSHs(newRV_noinc((SV*)perlify_relationship(rel))); + mXPUSHs(newRV_noinc((SV*)perlify_relationship(rel))); else ARG_UNDEFINED(); if (scrobbles && scrobbles_len) - XPUSHs(newRV_noinc((SV*)perlify_scrobbles(scrobbles, scrobbles_len))); + mXPUSHs(newRV_noinc((SV*)perlify_scrobbles(scrobbles, scrobbles_len))); else ARG_UNDEFINED(); PERL_STACK_SCALAR_CALL("account::content_scrobbles"); diff --git a/src/base_page.c b/src/base_page.c index 420cb1d..4ef0ed9 100644 --- a/src/base_page.c +++ b/src/base_page.c @@ -74,14 +74,13 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* else mXPUSHs(newRV_noinc((SV*)perlify_session(ssn))); XPUSHs(newRV_noinc((SV*)template_files)); - XPUSHs(sv_2mortal(newSVpv(page->content, 0))); + mXPUSHs(newSVpv(page->content, 0)); if (notifs && notifs_len) { - AV* notifs_av = perlify_notifications(notifs, notifs_len); - mXPUSHs(newRV_inc((SV*)notifs_av)); + mXPUSHs(newRV_noinc((SV*)perlify_notifications(notifs, notifs_len))); } - else XPUSHs(&PL_sv_undef); + else ARG_UNDEFINED(); // Run function PERL_STACK_SCALAR_CALL("base_page"); @@ -89,7 +88,6 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* send_result(req, NULL, "text/html", dup, 0); - mstdnt_cleanup_notifications(notifs, notifs_len); mastodont_storage_cleanup(&storage); Safefree(dup); diff --git a/src/conversations.c b/src/conversations.c index 361e9ff..2dd686e 100644 --- a/src/conversations.c +++ b/src/conversations.c @@ -50,7 +50,7 @@ void content_chats(PATH_ARGS) XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); if (chats) - XPUSHs(newRV_noinc((SV*)perlify_chats(chats, chats_len))); + mXPUSHs(newRV_noinc((SV*)perlify_chats(chats, chats_len))); else ARG_UNDEFINED(); PERL_STACK_SCALAR_CALL("chat::content_chats"); diff --git a/src/emoji.c b/src/emoji.c index 58b0d79..3a7025a 100644 --- a/src/emoji.c +++ b/src/emoji.c @@ -112,7 +112,7 @@ char* construct_emoji_picker(char* status_id, size_t* size) { av_store(av, i, newSVpv(emojis[i], 0)); } - XPUSHs(newRV_noinc((SV*)av)); + mXPUSHs(newRV_noinc((SV*)av)); PERL_STACK_SCALAR_CALL("emojis::emoji_picker"); char* dup = PERL_GET_STACK_EXIT; diff --git a/src/global_perl.h b/src/global_perl.h index 476f160..74e3bb9 100644 --- a/src/global_perl.h +++ b/src/global_perl.h @@ -26,7 +26,7 @@ #define hvstores_str(hv, key, val) hv_stores((hv), key, ((val) ? newSVpv((val), 0) : &PL_sv_undef)) #define hvstores_int(hv, key, val) hv_stores((hv), key, newSViv((val))) #define hvstores_ref(hv, key, val) hv_stores((hv), key, \ - ((val) ? newRV_inc((SV* const)(val)) : &PL_sv_undef)) + ((val) ? newRV_noinc((SV* const)(val)) : &PL_sv_undef)) /* Seeing all this shit littered in Treebird's code made me decide to write some macros */ #define PERL_STACK_INIT perl_lock(); \ @@ -59,7 +59,7 @@ extern pthread_mutex_t perllock_mutex; #define perl_unlock() ;; #endif -#define ARG_UNDEFINED() do { XPUSHs(&PL_sv_undef); } while (0) +#define ARG_UNDEFINED() do { mXPUSHs(&PL_sv_undef); } while (0) void init_template_files(pTHX); void cleanup_template_files(); diff --git a/src/lists.c b/src/lists.c index 225133c..93108cf 100644 --- a/src/lists.c +++ b/src/lists.c @@ -56,7 +56,7 @@ void content_lists(PATH_ARGS) XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); if (lists) - XPUSHs(newRV_noinc((SV*)perlify_lists(lists, lists_len))); + mXPUSHs(newRV_noinc((SV*)perlify_lists(lists, lists_len))); PERL_STACK_SCALAR_CALL("lists::content_lists"); diff --git a/src/login.c b/src/login.c index 077ca11..a5ce912 100644 --- a/src/login.c +++ b/src/login.c @@ -209,7 +209,7 @@ void content_login(PATH_ARGS) XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); if (storage.error || oauth_store.error) - XPUSHs(newSVpv(storage.error ? storage.error : oauth_store.error, 0)); + mXPUSHs(newSVpv(storage.error ? storage.error : oauth_store.error, 0)); PERL_STACK_SCALAR_CALL("login::content_login"); diff --git a/src/main.c b/src/main.c index 801b6aa..6df0d1a 100644 --- a/src/main.c +++ b/src/main.c @@ -51,14 +51,14 @@ // Allow dynamic loading for Perl static void xs_init (pTHX); - -EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); +void boot_DynaLoader (pTHX_ CV* cv); #ifdef DEBUG static int quit = 0; static void exit_treebird(PATH_ARGS) { quit = 1; + exit(1); } #endif @@ -221,17 +221,22 @@ void cgi_start(mastodont_t* api) } #endif -EXTERN_C void xs_init(pTHX) +void xs_init(pTHX) { - char *file = __FILE__; - newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); + static const char file[] = __FILE__; + dXSUB_SYS; + PERL_UNUSED_CONTEXT; + + newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); } int main(int argc, char **argv, char **env) { // Global init mastodont_global_curl_init(); +#ifndef SINGLE_THREADED FCGX_Init(); +#endif // Initialize Perl PERL_SYS_INIT3(&argc, &argv, &env); @@ -242,6 +247,7 @@ int main(int argc, char **argv, char **env) perl_parse(my_perl, xs_init, (sizeof(perl_argv) / sizeof(perl_argv[0])) - 1, perl_argv, (char**)NULL); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; + PL_perl_destruct_level = 2; perl_run(my_perl); init_template_files(aTHX); diff --git a/src/notifications.c b/src/notifications.c index 51f4166..9eeecc7 100644 --- a/src/notifications.c +++ b/src/notifications.c @@ -61,7 +61,7 @@ void content_notifications(PATH_ARGS) XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); if (notifs) - XPUSHs(newRV_noinc((SV*)perlify_notifications(notifs, notifs_len))); + mXPUSHs(newRV_noinc((SV*)perlify_notifications(notifs, notifs_len))); // ARGS PERL_STACK_SCALAR_CALL("notifications::content_notifications"); diff --git a/src/search.c b/src/search.c index b46dadc..71fb3d9 100644 --- a/src/search.c +++ b/src/search.c @@ -70,6 +70,7 @@ void content_search_all(PATH_ARGS) redirect(req, REDIRECT_303, url); break; } + free(url); curl_free(query); return; } @@ -80,7 +81,7 @@ void content_search_all(PATH_ARGS) HV* session_hv = perlify_session(ssn); XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); - XPUSHs(newRV_noinc((SV*)perlify_search_results(&results))); + mXPUSHs(newRV_noinc((SV*)perlify_search_results(&results))); PERL_STACK_SCALAR_CALL("search::content_search"); @@ -95,7 +96,7 @@ void content_search_all(PATH_ARGS) }; render_base_page(&b, req, ssn, api); - + mstdnt_cleanup_search_results(&results); mastodont_storage_cleanup(&storage); Safefree(dup); @@ -127,7 +128,8 @@ void content_search_statuses(PATH_ARGS) HV* session_hv = perlify_session(ssn); XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); - XPUSHs(newRV_noinc((SV*)perlify_search_results(&results))); + mXPUSHs(newRV_noinc((SV*)perlify_search_results(&results))); + PERL_STACK_SCALAR_CALL("search::content_search_statuses"); // Duplicate so we can free the TMPs @@ -172,7 +174,7 @@ void content_search_accounts(PATH_ARGS) HV* session_hv = perlify_session(ssn); XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); - XPUSHs(newRV_noinc((SV*)perlify_search_results(&results))); + mXPUSHs(newRV_noinc((SV*)perlify_search_results(&results))); PERL_STACK_SCALAR_CALL("search::content_search_accounts"); @@ -190,6 +192,7 @@ void content_search_accounts(PATH_ARGS) mstdnt_cleanup_search_results(&results); mastodont_storage_cleanup(&storage); + Safefree(dup); } void content_search_hashtags(PATH_ARGS) @@ -217,6 +220,7 @@ void content_search_hashtags(PATH_ARGS) mstdnt_cleanup_search_results(&results); mastodont_storage_cleanup(&storage); +// Safefree(dup); } HV* perlify_search_results(struct mstdnt_search_results* results) diff --git a/src/status.c b/src/status.c index e092e38..ac125f6 100644 --- a/src/status.c +++ b/src/status.c @@ -318,9 +318,9 @@ void content_status_interactions(FCGX_Request* req, XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); if (accts) - XPUSHs(newRV_noinc((SV*)perlify_accounts(accts, accts_len))); + mXPUSHs(newRV_noinc((SV*)perlify_accounts(accts, accts_len))); else ARG_UNDEFINED(); - XPUSHs(newSVpv(label, 0)); + mXPUSHs(newSVpv(label, 0)); PERL_STACK_SCALAR_CALL("account::status_interactions"); @@ -367,20 +367,20 @@ void content_status(PATH_ARGS, uint8_t flags) HV* session_hv = perlify_session(ssn); XPUSHs(newRV_noinc((SV*)session_hv)); XPUSHs(newRV_noinc((SV*)template_files)); - XPUSHs(newRV_noinc((SV*)perlify_status(&status))); + mXPUSHs(newRV_noinc((SV*)perlify_status(&status))); if (statuses_before) - XPUSHs(newRV_noinc((SV*)perlify_statuses(statuses_before, stat_before_len))); + mXPUSHs(newRV_noinc((SV*)perlify_statuses(statuses_before, stat_before_len))); else ARG_UNDEFINED(); if (statuses_after) - XPUSHs(newRV_noinc((SV*)perlify_statuses(statuses_after, stat_after_len))); + mXPUSHs(newRV_noinc((SV*)perlify_statuses(statuses_after, stat_after_len))); else ARG_UNDEFINED(); if (picker) { - XPUSHs(newSVpv(picker, picker_len)); + mXPUSHs(newSVpv(picker, picker_len)); } else ARG_UNDEFINED(); PERL_STACK_SCALAR_CALL("status::content_status"); diff --git a/src/timeline.c b/src/timeline.c index 3802db4..ab4293b 100644 --- a/src/timeline.c +++ b/src/timeline.c @@ -47,11 +47,11 @@ void content_timeline(REQUEST_T req, XPUSHs(newRV_noinc((SV*)template_files)); if (statuses) - XPUSHs(newRV_noinc((SV*)perlify_statuses(statuses, statuses_len))); + mXPUSHs(newRV_noinc((SV*)perlify_statuses(statuses, statuses_len))); else ARG_UNDEFINED(); if (header_text) - XPUSHs(newSVpv(header_text, 0)); + mXPUSHs(newSVpv(header_text, 0)); else ARG_UNDEFINED(); mXPUSHi(show_post_box);