new: locale implementation and signal handler

This commit is contained in:
ngn 2024-08-01 02:02:13 +03:00
parent 33e59c6644
commit 4bb4496bdc
4 changed files with 104 additions and 17 deletions

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-31 23:21+0300\n" "POT-Creation-Date: 2024-08-01 01:59+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -72,56 +72,69 @@ msgstr ""
msgid "Please answer with y/n" msgid "Please answer with y/n"
msgstr "" msgstr ""
#: src/main.c:74 #: src/main.c:48
msgid "Received a segfault"
msgstr ""
#: src/main.c:93
msgid "Failed to access the root directory, are you running as root?" msgid "Failed to access the root directory, are you running as root?"
msgstr "" msgstr ""
#: src/main.c:76 #: src/main.c:95
#, fuzzy, c-format #, fuzzy, c-format
msgid "Bad root directory (%s): %s" msgid "Bad root directory (%s): %s"
msgstr "Havuz dizini kullanmak başarısız oldu: %s" msgstr "Havuz dizini kullanmak başarısız oldu: %s"
#: src/main.c:84 #: src/main.c:103
#, c-format #, c-format
msgid "Bad datadir (%s): %s" msgid "Bad datadir (%s): %s"
msgstr "" msgstr ""
#: src/main.c:89 #: src/main.c:108
#, c-format #, c-format
msgid "Bad tmpdir (%s): %s" msgid "Bad tmpdir (%s): %s"
msgstr "" msgstr ""
#: src/main.c:96 #: src/main.c:115
#, fuzzy #, fuzzy
msgid "Failed to add pool " msgid "Failed to add pool "
msgstr "Havuzları sekronize etmek başarısız oldu: %s" msgstr "Havuzları sekronize etmek başarısız oldu: %s"
#: src/main.c:109 #: src/main.c:127
msgid "Failed to lock, matt is already running"
msgstr ""
#: src/main.c:131
#, fuzzy
msgid "Failed to lock, are you root?"
msgstr "Havuzları sekronize etmek başarısız oldu: %s"
#: src/main.c:142
msgid "Command not found: " msgid "Command not found: "
msgstr "" msgstr ""
#: src/main.c:111 #: src/main.c:144
#, c-format #, c-format
msgid "MatterLinux package manager (version %s)" msgid "MatterLinux package manager (version %s)"
msgstr "" msgstr ""
#: src/main.c:112 #: src/main.c:145
msgid "Usage: " msgid "Usage: "
msgstr "" msgstr ""
#: src/main.c:114 #: src/main.c:147
msgid "Here is a list of available commands:" msgid "Here is a list of available commands:"
msgstr "" msgstr ""
#: src/main.c:120 #: src/main.c:153
msgid "To list different options, use commands with " msgid "To list different options, use commands with "
msgstr "" msgstr ""
#: src/main.c:121 #: src/main.c:154
msgid "Here is a list of available global options:" msgid "Here is a list of available global options:"
msgstr "" msgstr ""
#: src/main.c:124 src/main.c:125 src/cmd/info.c:42 src/cmd/info.c:43 #: src/main.c:157 src/main.c:158 src/cmd/info.c:42 src/cmd/info.c:43
#: src/cmd/info.c:44 src/cmd/install.c:25 src/cmd/install.c:26 #: src/cmd/info.c:44 src/cmd/install.c:25 src/cmd/install.c:26
#: src/cmd/list.c:13 src/cmd/list.c:14 src/cmd/remove.c:20 src/cmd/remove.c:21 #: src/cmd/list.c:13 src/cmd/list.c:14 src/cmd/remove.c:20 src/cmd/remove.c:21
#: src/cmd/update.c:29 #: src/cmd/update.c:29
@ -129,7 +142,7 @@ msgstr ""
msgid " " msgid " "
msgstr "" msgstr ""
#: src/main.c:127 #: src/main.c:160
msgid "" msgid ""
"Licensed under GPLv3, see https://www.gnu.org/licenses/ for more information" "Licensed under GPLv3, see https://www.gnu.org/licenses/ for more information"
msgstr "" msgstr ""

28
src/lock.c Normal file
View File

@ -0,0 +1,28 @@
#include "lock.h"
#include <fcntl.h>
#include <libmp/util.h>
#include <string.h>
#include <unistd.h>
lock_st lock(lm_ctx_t *ctx) {
if (NULL == ctx->data)
return LOCK_ERROR;
char lock_file[strlen(ctx->data) + 10];
join(lock_file, ctx->data, "lock");
if (exists(lock_file))
return ALREADY_LOCKED;
if (creat(lock_file, 0600) == -1)
return LOCK_ERROR;
return LOCK_SUCCESS;
}
void unlock(lm_ctx_t *ctx) {
if (NULL == ctx->data)
return;
char lock_file[strlen(ctx->data) + 10];
join(lock_file, ctx->data, "lock");
unlink(lock_file);
}

11
src/lock.h Normal file
View File

@ -0,0 +1,11 @@
#pragma once
#include <libmp/all.h>
typedef enum lock_state {
ALREADY_LOCKED = 1,
LOCK_SUCCESS = 2,
LOCK_ERROR = 3,
} lock_st;
lock_st lock(lm_ctx_t *ctx);
void unlock(lm_ctx_t *ctx);

View File

@ -26,6 +26,8 @@
#include <libmp/ctx.h> #include <libmp/ctx.h>
#include <libmp/error.h> #include <libmp/error.h>
#include <libmp/util.h> #include <libmp/util.h>
#include <locale.h>
#include <signal.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -33,10 +35,28 @@
#include "cmd.h" #include "cmd.h"
#include "config.h" #include "config.h"
#include "intl.h" #include "intl.h"
#include "lock.h"
#include "log.h" #include "log.h"
#include "util.h" #include "util.h"
lm_ctx_t ctx;
void handler(int sig) {
unlock(&ctx);
printf("\e[?25h\n");
if (SIGSEGV == sig)
error(_("Received a segfault"));
exit(1);
}
int main(int argc, char *argv[], char *envp[]) { int main(int argc, char *argv[], char *envp[]) {
signal(SIGSEGV, handler);
signal(SIGINT, handler);
setbuf(stdout, NULL);
setlocale(LC_ALL, "");
textdomain("matt");
cmd_t commands[] = { cmd_t commands[] = {
{.name = "info", .desc = "show information about a single package", .func = cmd_info }, {.name = "info", .desc = "show information about a single package", .func = cmd_info },
{.name = "list", .desc = "list all the installed packages", .func = cmd_list }, {.name = "list", .desc = "list all the installed packages", .func = cmd_list },
@ -51,7 +71,6 @@ int main(int argc, char *argv[], char *envp[]) {
args_t *args = NULL; args_t *args = NULL;
bool ret = false; bool ret = false;
config_t config; config_t config;
lm_ctx_t ctx;
set_env(envp); set_env(envp);
lm_ctx_init(&ctx); lm_ctx_init(&ctx);
@ -100,10 +119,24 @@ int main(int argc, char *argv[], char *envp[]) {
} }
for (int i = 0; i < sizeof(commands) / sizeof(cmd_t); i++) { for (int i = 0; i < sizeof(commands) / sizeof(cmd_t); i++) {
if (eq(commands[i].name, args->list[0].value)) { if (!eq(commands[i].name, args->list[0].value))
ret = commands[i].func(&ctx, &config, args); continue;
switch (lock(&ctx)) {
case ALREADY_LOCKED:
error(_("Failed to lock, matt is already running"));
goto end; goto end;
case LOCK_ERROR:
error(_("Failed to lock, are you root?"));
goto end;
default:
break;
} }
ret = commands[i].func(&ctx, &config, args);
goto end;
} }
error(_("Command not found: " FG_BOLD "%s"), args->list[0].value); error(_("Command not found: " FG_BOLD "%s"), args->list[0].value);
@ -130,6 +163,8 @@ help:
goto end; goto end;
end: end:
unlock(&ctx);
free(full_datadir); free(full_datadir);
free(full_tmpdir); free(full_tmpdir);