aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--config.h4
-rw-r--r--main.c57
-rw-r--r--tests/strsep.c31
-rw-r--r--ui.c24
-rw-r--r--ui.h2
-rw-r--r--ui_nwindow.c42
-rw-r--r--ui_nwindow.h4
8 files changed, 118 insertions, 47 deletions
diff --git a/.gitignore b/.gitignore
index 3e2ffcd..cc27b30 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@
/tests/consumer
/tests/semtest
/tests/mqtest
+/tests/strsep
*.swp
diff --git a/config.h b/config.h
index a559771..4f39307 100644
--- a/config.h
+++ b/config.h
@@ -7,7 +7,11 @@
#define SEM_GUI "/naskpass-gui"
#define SEM_INP "/naskpass-input"
+#define SEM_BSY "/naskpass-busy"
#define MSQ_PWD "/naskpass-passwd"
+#define MSQ_INF "/naskpass-info"
+
+#define IPC_MQSIZ 128
#ifdef _VERSION
#define VERSION _VERSION
diff --git a/main.c b/main.c
index b4a4fdb..6bcfb00 100644
--- a/main.c
+++ b/main.c
@@ -18,9 +18,17 @@
#include "ui.h"
#include "config.h"
+#define MSG(msg_idx) msg_arr[msg_idx]
-static sem_t *sp_ui, *sp_input;
-static mqd_t mq_passwd;
+
+static sem_t *sp_ui, *sp_input, *sp_busy;
+static mqd_t mq_passwd, mq_info;
+
+enum msg_index {
+ MSG_BUSY_FD = 0,
+ MSG_BUSY
+};
+static const char *msg_arr[] = { "Please wait, got a piped password ..", "Please wait, busy .." };
static void
@@ -77,6 +85,7 @@ void sigfunc(int signal)
case SIGINT:
sem_trywait(sp_ui);
sem_trywait(sp_input);
+ sem_trywait(sp_busy);
break;
}
}
@@ -86,7 +95,7 @@ main(int argc, char **argv)
{
int ret = EXIT_FAILURE, ffd = -1, c_status, opt, i_sval;
pid_t child;
- char pbuf[MAX_PASSWD_LEN+1];
+ char pbuf[IPC_MQSIZ+1];
char *fifo_path = NULL;
char *crypt_cmd = NULL;
struct timespec ts_sem_input;
@@ -97,7 +106,7 @@ main(int argc, char **argv)
signal(SIGKILL, sigfunc);
mq_attr.mq_flags = 0;
- mq_attr.mq_msgsize = MAX_PASSWD_LEN;
+ mq_attr.mq_msgsize = IPC_MQSIZ;
mq_attr.mq_maxmsg = 3;
mq_attr.mq_curmsgs = 0;
@@ -105,9 +114,16 @@ main(int argc, char **argv)
fprintf(stderr, "%s: clock get time error: %d (%s)\n", argv[0], errno, strerror(errno));
goto error;
}
- if ( (sp_ui = sem_open(SEM_GUI, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 0)) == SEM_FAILED ||
- (sp_input = sem_open(SEM_INP, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 0)) == SEM_FAILED ||
-(mq_passwd = mq_open(MSQ_PWD, O_NONBLOCK | O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG, &mq_attr)) == (mqd_t) -1 ) {
+
+ sp_ui = sem_open(SEM_GUI, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 0);
+ sp_input = sem_open(SEM_INP, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 0);
+ sp_busy = sem_open(SEM_BSY, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 0);
+ mq_passwd = mq_open(MSQ_PWD, O_NONBLOCK | O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG, &mq_attr);
+ mq_info = mq_open(MSQ_INF, O_NONBLOCK | O_CREAT | O_EXCL | O_RDWR, S_IRWXU | S_IRWXG, &mq_attr);
+
+ if ( sp_ui == SEM_FAILED || sp_input == SEM_FAILED || sp_busy == SEM_FAILED ||
+ mq_passwd == (mqd_t) -1 || mq_info == (mqd_t) -1 ) {
+
if ( errno == EEXIST ) {
fprintf(stderr, "%s: already started?\n", argv[0]);
} else {
@@ -115,19 +131,8 @@ main(int argc, char **argv)
}
goto error;
}
- if ( mq_getattr(mq_passwd, &mq_attr) == 0 ) {
- mq_attr.mq_maxmsg = 2;
- mq_attr.mq_msgsize = MAX_PASSWD_LEN;
- if ( mq_setattr(mq_passwd, &mq_attr, NULL) != 0 ) {
- fprintf(stderr, "%s: can not SET message queue attributes: %d (%s)\n", argv[0], errno, strerror(errno));
- goto error;
- }
- } else {
- fprintf(stderr, "%s: can not GET message queue attributes: %d (%s)\n", argv[0], errno, strerror(errno));
- goto error;
- }
- memset(pbuf, '\0', MAX_PASSWD_LEN+1);
+ memset(pbuf, '\0', IPC_MQSIZ+1);
while ((opt = getopt(argc, argv, "hf:c:")) != -1) {
switch (opt) {
case 'h':
@@ -172,11 +177,15 @@ main(int argc, char **argv)
fclose(stdout);
/* Master process: mainloop (read passwd from message queue or fifo and exec cryptcreate */
while ( (sem_getvalue(sp_ui, &i_sval) == 0 && i_sval > 0) || (sem_getvalue(sp_input, &i_sval) == 0 && i_sval > 0) ) {
- if (read(ffd, pbuf, MAX_PASSWD_LEN) >= 0) {
+ if (read(ffd, pbuf, IPC_MQSIZ) >= 0) {
+ sem_post(sp_busy);
+ mq_send(mq_info, MSG(MSG_BUSY_FD), strlen(MSG(MSG_BUSY_FD)), 0);
if (run_cryptcreate(pbuf, crypt_cmd) != 0) {
fprintf(stderr, "cryptcreate error\n");
}
- } else if ( mq_receive(mq_passwd, pbuf, MAX_PASSWD_LEN, NULL) >= 0 ) {
+ } else if ( mq_receive(mq_passwd, pbuf, IPC_MQSIZ, NULL) >= 0 ) {
+ sem_post(sp_busy);
+ mq_send(mq_info, MSG(MSG_BUSY), strlen(MSG(MSG_BUSY)), 0);
if (run_cryptcreate(pbuf, crypt_cmd) != 0) {
fprintf(stderr, "cryptcreate error\n");
}
@@ -185,7 +194,7 @@ main(int argc, char **argv)
usleep(100000);
}
wait(&c_status);
- memset(pbuf, '\0', MAX_PASSWD_LEN+1);
+ memset(pbuf, '\0', IPC_MQSIZ+1);
} else {
/* fork error */
perror("fork");
@@ -199,9 +208,13 @@ error:
if (fifo_path != NULL) free(fifo_path);
sem_close(sp_ui);
sem_close(sp_input);
+ sem_close(sp_busy);
mq_close(mq_passwd);
+ mq_close(mq_info);
sem_unlink(SEM_GUI);
sem_unlink(SEM_INP);
+ sem_unlink(SEM_BSY);
mq_unlink(MSQ_PWD);
+ mq_unlink(MSQ_INF);
exit(ret);
}
diff --git a/tests/strsep.c b/tests/strsep.c
new file mode 100644
index 0000000..aa8e1ad
--- /dev/null
+++ b/tests/strsep.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+int main(int argc, char **argv)
+{
+ int i = 0;
+ char *tok, *p_tok;
+ char **arr;
+
+ if (argc != 4) {
+ fprintf(stderr, "usage: %s [ARR_SIZ] [DELIM] [STRING]\n", argv[0]);
+ exit(1);
+ }
+
+ arr = calloc(atoi(argv[1]), sizeof(char *));
+ p_tok = argv[3];
+ while ( (tok = strsep(&p_tok, argv[2])) != NULL ) {
+ arr[i] = tok;
+ i++;
+ }
+
+ i = 0;
+ while ( arr[i] != NULL ) {
+ printf("ARRAY[%d]: %s\n", i, arr[i]);
+ i++;
+ }
+ return 0;
+}
diff --git a/ui.c b/ui.c
index 99167a5..55c7103 100644
--- a/ui.c
+++ b/ui.c
@@ -46,8 +46,8 @@ static pthread_cond_t cnd_update = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t mtx_update = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t mtx_busy = PTHREAD_MUTEX_INITIALIZER;
static sem_t sem_rdy;
-static sem_t *sp_ui, *sp_input;
-static mqd_t mq_passwd;
+static sem_t /* TUI active? */ *sp_ui, /* Textfield input available? */ *sp_input;
+static mqd_t mq_passwd, mq_info;
void
@@ -261,19 +261,20 @@ do_ui(void)
struct statusbar *higher, *lower;
struct txtwindow *infownd;
char key = '\0';
- char *title = NULL;
+ char *title = NULL, mq_msg[IPC_MQSIZ+1];
int i_sval = -1, ret = DOUI_ERR;
asprintf(&title, "/* %s-%s */", PKGNAME, VERSION);
sp_ui = sem_open(SEM_GUI, 0, 0, 0);
sp_input = sem_open(SEM_INP, 0, 0, 0);
mq_passwd = mq_open(MSQ_PWD, O_WRONLY, 0, NULL);
- if ( sem_init(&sem_rdy, 0, 0) == -1 || !sp_ui || !sp_input || mq_passwd == (mqd_t)-1 ) {
- perror("init semaphore");
+ mq_info = mq_open(MSQ_INF, O_RDONLY, 0, NULL);
+ if ( sem_init(&sem_rdy, 0, 0) == -1 || !sp_ui || !sp_input || mq_passwd == (mqd_t)-1 || mq_info == (mqd_t)-1 ) {
+ perror("init semaphore/messageq");
goto error;
}
init_ui();
- pw_input = init_input((unsigned int)(max_x / 2)-PASSWD_XRELPOS, (unsigned int)(max_y / 2)-PASSWD_YRELPOS, PASSWD_WIDTH, "PASSWORD: ", MAX_PASSWD_LEN, COLOR_PAIR(3), COLOR_PAIR(2));
+ pw_input = init_input((unsigned int)(max_x / 2)-PASSWD_XRELPOS, (unsigned int)(max_y / 2)-PASSWD_YRELPOS, PASSWD_WIDTH, "PASSWORD: ", IPC_MQSIZ, COLOR_PAIR(3), COLOR_PAIR(2));
heartbeat = init_anic(0, 0, A_BOLD | COLOR_PAIR(1), "[%c]");
higher = init_statusbar(0, max_x, A_BOLD | COLOR_PAIR(3), NULL);
lower = init_statusbar(max_y - 1, max_x, COLOR_PAIR(3), lower_statusbar_update);
@@ -284,8 +285,8 @@ do_ui(void)
register_statusbar(lower);
register_anic(heartbeat);
register_txtwindow(infownd);
- set_txtwindow_title(infownd, "WARNUNG");
- set_txtwindow_text(infownd, "String0...............\nString1..................\nString2.....");
+ set_txtwindow_title(infownd, "WARNING");
+ set_txtwindow_text(infownd, "String0---------------#\nString1--------------------#\nString2-----#");
activate_input(wnd_main, pw_input);
set_statusbar_text(higher, title);
if (run_ui_thrd() != 0) {
@@ -301,7 +302,11 @@ do_ui(void)
continue;
}
pthread_mutex_lock(&mtx_busy);
- if ( process_key(key, pw_input, wnd_main) == false ) sem_trywait(sp_ui);
+ if ( process_key(key, pw_input, wnd_main) == false ) {
+ memset(mq_msg, '\0', IPC_MQSIZ+1);
+ mq_receive(mq_info, mq_msg, IPC_MQSIZ+1, 0);
+ sem_trywait(sp_ui);
+ }
activate_input(wnd_main, pw_input);
do_ui_update(false);
pthread_mutex_unlock(&mtx_busy);
@@ -320,6 +325,7 @@ do_ui(void)
free_ui();
ret = DOUI_OK;
mq_close(mq_passwd);
+ mq_close(mq_info);
error:
if (title) free(title);
if (sp_ui) sem_close(sp_ui);
diff --git a/ui.h b/ui.h
index 2174812..fcca2a2 100644
--- a/ui.h
+++ b/ui.h
@@ -4,8 +4,6 @@
#include <ncurses.h>
#include <stdint.h>
-#define MAX_PASSWD_LEN 128
-
#define UICB_OK 0
#define UICB_ERR_UNDEF 1
#define UICB_ERR_CB 2
diff --git a/ui_nwindow.c b/ui_nwindow.c
index 0b6e13b..b21bb29 100644
--- a/ui_nwindow.c
+++ b/ui_nwindow.c
@@ -16,21 +16,30 @@ init_txtwindow(unsigned int x, unsigned int y, unsigned int width, unsigned int
a->height = height;
a->scrollable = false;
a->title_len = INITIAL_TITLE_LEN;
- a->text_len = INITIAL_TEXT_LEN;
a->title = calloc(a->title_len+1, sizeof(char));
- a->text = calloc(a->text_len+1, sizeof(char));
+ a->text = NULL;
a->attrs = attrs;
a->text_attrs = text_attrs;
a->window_func = cb_update;
return (a);
}
-void
-free_txtwindow(struct txtwindow *a)
+static void
+__free_text(struct txtwindow *a)
{
if (a->text) {
+ if (a->text[0]) {
+ free(a->text[0]);
+ }
free(a->text);
+ a->text = NULL;
}
+}
+
+void
+free_txtwindow(struct txtwindow *a)
+{
+ __free_text(a);
if (a->title) {
free(a->title);
}
@@ -64,6 +73,11 @@ print_wnd(struct txtwindow *a)
attron(a->text_attrs);
mvprintw(y-2, (float)x+(float)(w/2)-(float)(a->title_len*2/3), "[ %s ]", a->title);
/* print windows text */
+ i = 0;
+ while ( a->text[i] ) {
+ mvprintw(y+i, x, a->text[i]);
+ i++;
+ }
attroff(a->text_attrs);
}
@@ -96,21 +110,24 @@ __do_textcpy(char **p_dest, size_t sz_dest, const char *p_src, size_t sz_src)
return sz_src;
}
+/* seperate a String with NEWLINES into an array */
static char **
__do_textadjust(struct txtwindow *a, char *text)
{
int i = 0, rows = (int)(strlen(text) / a->width)+1;
char **adj_text = calloc(rows+1, sizeof(char *));
- char *p_strtok = strdupa(text), *tok;
+ char *p_strtok, *tok;
const char sep[] = "\n";
- printf("___[%d],[%d],[%lu],[%s]\n", rows, a->width, (long unsigned int) strlen(text), text);
if (rows > a->height) goto error;
- adj_text[0] = text;
+ p_strtok = strdup(text);
while ( (tok = strsep(&p_strtok, sep)) && rows-- >= 0 ) {
+ if (strlen(tok) > a->width) {
+ strcpy(tok+a->width-3, "...");
+ *(tok+a->width) = '\0';
+ }
+ adj_text[i] = tok;
i++;
- fprintf(stdout, "___[%p , %p],[%s],[%d]\n", p_strtok, tok, tok, rows);
-// adj_text[i] =
}
return adj_text;
error:
@@ -121,9 +138,12 @@ error:
void
set_txtwindow_text(struct txtwindow *a, char *text)
{
- char **fmt_text = __do_textadjust(a, text), **curline = fmt_text;
+ char **fmt_text = __do_textadjust(a, text);
- //a->text_len = __do_textcpy(&a->text, a->text_len, text, strlen(text));
+ if (fmt_text) {
+ __free_text(a);
+ a->text = fmt_text;
+ }
}
void
diff --git a/ui_nwindow.h b/ui_nwindow.h
index 614644c..ee2b810 100644
--- a/ui_nwindow.h
+++ b/ui_nwindow.h
@@ -5,7 +5,6 @@
#define INITIAL_TITLE_LEN 32
-#define INITIAL_TEXT_LEN 128
struct txtwindow {
unsigned int y;
@@ -15,8 +14,7 @@ struct txtwindow {
bool scrollable;
char *title;
size_t title_len;
- char *text;
- size_t text_len;
+ char **text;
int (*window_func)(WINDOW *, struct txtwindow *);
chtype attrs;
chtype text_attrs;