diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | config.h | 4 | ||||
-rw-r--r-- | main.c | 57 | ||||
-rw-r--r-- | tests/strsep.c | 31 | ||||
-rw-r--r-- | ui.c | 24 | ||||
-rw-r--r-- | ui.h | 2 | ||||
-rw-r--r-- | ui_nwindow.c | 42 | ||||
-rw-r--r-- | ui_nwindow.h | 4 |
8 files changed, 118 insertions, 47 deletions
@@ -3,4 +3,5 @@ /tests/consumer /tests/semtest /tests/mqtest +/tests/strsep *.swp @@ -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 @@ -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; +} @@ -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); @@ -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; |