iPXE
login_ui.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  *
19  * You can also choose to distribute this program under the terms of
20  * the Unmodified Binary Distribution Licence (as given in the file
21  * COPYING.UBDL), provided that you have satisfied its requirements.
22  */
23 
24 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25 
26 /** @file
27  *
28  * Login UI
29  *
30  */
31 
32 #include <string.h>
33 #include <errno.h>
34 #include <curses.h>
35 #include <ipxe/console.h>
36 #include <ipxe/settings.h>
37 #include <ipxe/editbox.h>
38 #include <ipxe/keys.h>
39 #include <ipxe/ansicol.h>
40 #include <ipxe/login_ui.h>
41 
42 /* Screen layout */
43 #define USERNAME_LABEL_ROW ( ( LINES / 2U ) - 4U )
44 #define USERNAME_ROW ( ( LINES / 2U ) - 2U )
45 #define PASSWORD_LABEL_ROW ( ( LINES / 2U ) + 2U )
46 #define PASSWORD_ROW ( ( LINES / 2U ) + 4U )
47 #define LABEL_COL ( ( COLS / 2U ) - 4U )
48 #define EDITBOX_COL ( ( COLS / 2U ) - 10U )
49 #define EDITBOX_WIDTH 20U
50 
51 int login_ui ( void ) {
52  char username[64];
53  char password[64];
54  struct edit_box username_box;
55  struct edit_box password_box;
56  struct edit_box *current_box = &username_box;
57  int key;
58  int rc = -EINPROGRESS;
59 
60  /* Fetch current setting values */
61  fetch_string_setting ( NULL, &username_setting, username,
62  sizeof ( username ) );
63  fetch_string_setting ( NULL, &password_setting, password,
64  sizeof ( password ) );
65 
66  /* Initialise UI */
67  initscr();
68  start_color();
69  init_editbox ( &username_box, username, sizeof ( username ), NULL,
71  init_editbox ( &password_box, password, sizeof ( password ), NULL,
73  EDITBOX_STARS );
74 
75  /* Draw initial UI */
77  erase();
78  attron ( A_BOLD );
79  mvprintw ( USERNAME_LABEL_ROW, LABEL_COL, "Username:" );
80  mvprintw ( PASSWORD_LABEL_ROW, LABEL_COL, "Password:" );
81  attroff ( A_BOLD );
83  draw_editbox ( &username_box );
84  draw_editbox ( &password_box );
85 
86  /* Main loop */
87  while ( rc == -EINPROGRESS ) {
88 
89  draw_editbox ( current_box );
90 
91  key = getkey ( 0 );
92  switch ( key ) {
93  case KEY_DOWN:
94  current_box = &password_box;
95  break;
96  case KEY_UP:
97  current_box = &username_box;
98  break;
99  case TAB:
100  current_box = ( ( current_box == &username_box ) ?
101  &password_box : &username_box );
102  break;
103  case KEY_ENTER:
104  if ( current_box == &username_box ) {
105  current_box = &password_box;
106  } else {
107  rc = 0;
108  }
109  break;
110  case CTRL_C:
111  case ESC:
112  rc = -ECANCELED;
113  break;
114  default:
115  edit_editbox ( current_box, key );
116  break;
117  }
118  }
119 
120  /* Terminate UI */
122  erase();
123  endwin();
124 
125  if ( rc != 0 )
126  return rc;
127 
128  /* Store settings */
129  if ( ( rc = store_setting ( NULL, &username_setting, username,
130  strlen ( username ) ) ) != 0 )
131  return rc;
132  if ( ( rc = store_setting ( NULL, &password_setting, password,
133  strlen ( password ) ) ) != 0 )
134  return rc;
135 
136  return 0;
137 }
int getkey(unsigned long timeout)
Get single keypress.
Definition: getkey.c:71
MuCurses header file.
#define KEY_ENTER
Definition: keys.h:88
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
Login UI.
Editable text box widget.
int erase(void)
Completely clear the screen.
Definition: clear.c:97
Error codes.
static int attroff(int attrs)
Definition: curses.h:508
#define CPAIR_EDIT
Editable text.
Definition: ansicol.h:49
#define start_color()
Definition: curses.h:396
int endwin(void)
Finalise console environment.
Definition: wininit.c:31
#define mvprintw(y, x, fmt,...)
Definition: curses.h:648
int store_setting(struct settings *settings, const struct setting *setting, const void *data, size_t len)
Store value of setting.
Definition: settings.c:618
#define EDITBOX_WIDTH
Definition: login_ui.c:49
#define ECANCELED
Operation canceled.
Definition: errno.h:343
#define CPAIR_NORMAL
Normal text.
Definition: ansicol.h:40
#define PASSWORD_ROW
Definition: login_ui.c:46
#define KEY_DOWN
Down arrow.
Definition: keys.h:66
#define KEY_UP
Up arrow.
Definition: keys.h:65
WINDOW * initscr(void)
Initialise console environment.
Definition: wininit.c:17
#define CTRL_C
Definition: keys.h:20
static int edit_editbox(struct edit_box *box, int key) __nonnull
Edit text box widget.
Definition: editbox.h:57
#define TAB
Definition: keys.h:46
int fetch_string_setting(struct settings *settings, const struct setting *setting, char *data, size_t len)
Fetch value of string setting.
Definition: settings.c:845
#define ESC
Escape character.
Definition: ansiesc.h:92
An editable text box widget.
Definition: editbox.h:16
User interaction.
#define EINPROGRESS
Operation in progress.
Definition: errno.h:418
Configuration settings.
void init_editbox(struct edit_box *box, char *buf, size_t len, WINDOW *win, unsigned int row, unsigned int col, unsigned int width, unsigned int flags)
Initialise text box widget.
Definition: editbox.c:50
#define EDITBOX_COL
Definition: login_ui.c:48
size_t strlen(const char *src)
Get length of string.
Definition: string.c:213
#define USERNAME_ROW
Definition: login_ui.c:44
void draw_editbox(struct edit_box *box)
Draw text box widget.
Definition: editbox.c:69
Show stars instead of contents (for password widgets)
Definition: editbox.h:36
#define PASSWORD_LABEL_ROW
Definition: login_ui.c:45
Key definitions.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
#define USERNAME_LABEL_ROW
Definition: login_ui.c:43
#define color_set(cpno, opts)
Definition: curses.h:240
#define LABEL_COL
Definition: login_ui.c:47
#define A_BOLD
Definition: curses.h:138
int login_ui(void)
Definition: login_ui.c:51
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
String functions.
union @375 key
Sense key.
Definition: scsi.h:18
ANSI colours.
static int attron(int attrs)
Definition: curses.h:512