iPXE
Defines | Functions
login_ui.c File Reference

Login UI. More...

#include <string.h>
#include <errno.h>
#include <curses.h>
#include <ipxe/console.h>
#include <ipxe/settings.h>
#include <ipxe/editbox.h>
#include <ipxe/keys.h>
#include <ipxe/ansicol.h>
#include <ipxe/login_ui.h>

Go to the source code of this file.

Defines

#define USERNAME_LABEL_ROW   ( ( LINES / 2U ) - 4U )
#define USERNAME_ROW   ( ( LINES / 2U ) - 2U )
#define PASSWORD_LABEL_ROW   ( ( LINES / 2U ) + 2U )
#define PASSWORD_ROW   ( ( LINES / 2U ) + 4U )
#define LABEL_COL   ( ( COLS / 2U ) - 4U )
#define EDITBOX_COL   ( ( COLS / 2U ) - 10U )
#define EDITBOX_WIDTH   20U

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
int login_ui (void)

Detailed Description

Login UI.

Definition in file login_ui.c.


Define Documentation

#define USERNAME_LABEL_ROW   ( ( LINES / 2U ) - 4U )

Definition at line 43 of file login_ui.c.

Referenced by login_ui().

#define USERNAME_ROW   ( ( LINES / 2U ) - 2U )

Definition at line 44 of file login_ui.c.

Referenced by login_ui().

#define PASSWORD_LABEL_ROW   ( ( LINES / 2U ) + 2U )

Definition at line 45 of file login_ui.c.

Referenced by login_ui().

#define PASSWORD_ROW   ( ( LINES / 2U ) + 4U )

Definition at line 46 of file login_ui.c.

Referenced by login_ui().

#define LABEL_COL   ( ( COLS / 2U ) - 4U )

Definition at line 47 of file login_ui.c.

Referenced by login_ui().

#define EDITBOX_COL   ( ( COLS / 2U ) - 10U )

Definition at line 48 of file login_ui.c.

Referenced by login_ui().

#define EDITBOX_WIDTH   20U

Definition at line 49 of file login_ui.c.

Referenced by login_ui().


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
int login_ui ( void  )

Definition at line 51 of file login_ui.c.

References A_BOLD, attroff(), attron(), color_set, CPAIR_EDIT, CPAIR_NORMAL, CTRL_C, draw_editbox(), ECANCELED, edit_editbox(), EDITBOX_COL, EDITBOX_STARS, EDITBOX_WIDTH, EINPROGRESS, endwin(), erase(), ESC, fetch_string_setting(), getkey(), init_editbox(), initscr(), key, KEY_DOWN, KEY_ENTER, KEY_UP, LABEL_COL, mvprintw, NULL, PASSWORD_LABEL_ROW, PASSWORD_ROW, rc, start_color, store_setting(), strlen(), TAB, USERNAME_LABEL_ROW, and USERNAME_ROW.

Referenced by login_exec().

                      {
        char username[64];
        char password[64];
        struct edit_box username_box;
        struct edit_box password_box;
        struct edit_box *current_box = &username_box;
        int key;
        int rc = -EINPROGRESS;

        /* Fetch current setting values */
        fetch_string_setting ( NULL, &username_setting, username,
                               sizeof ( username ) );
        fetch_string_setting ( NULL, &password_setting, password,
                               sizeof ( password ) );

        /* Initialise UI */
        initscr();
        start_color();
        init_editbox ( &username_box, username, sizeof ( username ), NULL,
                       USERNAME_ROW, EDITBOX_COL, EDITBOX_WIDTH, 0 );
        init_editbox ( &password_box, password, sizeof ( password ), NULL,
                       PASSWORD_ROW, EDITBOX_COL, EDITBOX_WIDTH,
                       EDITBOX_STARS );

        /* Draw initial UI */
        color_set ( CPAIR_NORMAL, NULL );
        erase();
        attron ( A_BOLD );
        mvprintw ( USERNAME_LABEL_ROW, LABEL_COL, "Username:" );
        mvprintw ( PASSWORD_LABEL_ROW, LABEL_COL, "Password:" );
        attroff ( A_BOLD );
        color_set ( CPAIR_EDIT, NULL );
        draw_editbox ( &username_box );
        draw_editbox ( &password_box );

        /* Main loop */
        while ( rc == -EINPROGRESS ) {

                draw_editbox ( current_box );

                key = getkey ( 0 );
                switch ( key ) {
                case KEY_DOWN:
                        current_box = &password_box;
                        break;
                case KEY_UP:
                        current_box = &username_box;
                        break;
                case TAB:
                        current_box = ( ( current_box == &username_box ) ?
                                        &password_box : &username_box );
                        break;
                case KEY_ENTER:
                        if ( current_box == &username_box ) {
                                current_box = &password_box;
                        } else {
                                rc = 0;
                        }
                        break;
                case CTRL_C:
                case ESC:
                        rc = -ECANCELED;
                        break;
                default:
                        edit_editbox ( current_box, key );
                        break;
                }
        }

        /* Terminate UI */
        color_set ( CPAIR_NORMAL, NULL );
        erase();
        endwin();

        if ( rc != 0 )
                return rc;

        /* Store settings */
        if ( ( rc = store_setting ( NULL, &username_setting, username,
                                    strlen ( username ) ) ) != 0 )
                return rc;
        if ( ( rc = store_setting ( NULL, &password_setting, password,
                                    strlen ( password ) ) ) != 0 )
                return rc;

        return 0;
}