Path: utzoo!attcan!utgpu!cs.utexas.edu!tut.cis.ohio-state.edu!ucsd!pacbell.com!pacbell!pcbox!pjc From: pjc@pcbox.UUCP (Paul J. Condie) Newsgroups: alt.sources Subject: menu(1) part 12 of 14 Keywords: menu Message-ID: <446@pcbox.UUCP> Date: 26 Dec 90 20:15:41 GMT Organization: Yet Another Box - Casto Valley, Ca. Lines: 1409 #!/bin/sh # this is part 12 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file utilities.d/libgeti.d/GetInput.3X continued # CurArch=12 if test ! -r s2_seq_.tmp then echo "Please unpack part 1 first!" exit 1; fi ( read Scheck if test "$Scheck" != $CurArch then echo "Please unpack part $Scheck next!" exit 1; else exit 0; fi ) < s2_seq_.tmp || exit 1 echo "x - Continuing file utilities.d/libgeti.d/GetInput.3X" sed 's/^X//' << 'SHAR_EOF' >> utilities.d/libgeti.d/GetInput.3X X This is validated against the file /usr/lib/acct/holidays by default. Modify GetInput.h to change default. X GT_Today - date must be greater than todays date. X GE_Today - greater than or equal to todays date. X LT_Today - less than todays date. X LE_Today - less than or equal to todays date. X.fi X.TP XTIME XA time field. X.br XValid mask characters: X.nf X HH hours (01-12) X MM minutes (00-59) X SS seconds (00-59) X TT tenths (00-99) X II military hours (00-24) X.fi XSome examples: X.nf X HH:MM X HH:MM:SS X HH:MM:SS:TT X II:MM X II:MM:SS X II:MM:SS:TT X.fi X.TP XSET XThis field type specifies a set of values that are acceptable in the input Xfield. XThe acceptable values within the set are specified in the \fIFldRange\fP Xargument. XThe user selects one of the set values specified in the field range by Xpressing the space bar, which will toggle through the set values, Xor by pressing the first character in the desired value. X XThe format of the FldRange can only be comma separated values X(ex. "CA,ID,TX"). XRange values, such as "1-5", don't work. You would have to say "1,2,3,4,5". X.br XThe FldLength is automatically set to the longest set value in the FldRange. X.TP XMENU XThis field type is similar to the SET type. The difference is when the user Xattempts to type something in the field a pop-up menu of available choices Xare displyed, as specified in field_range. XThe user makes a selection by hi-lighting the choice and pressing return. X.br XSee SET type for specifying the FldRange. XThe limit is ten items in the FldRange. X.TP XPROTECT XThis X's out the field so what is typed on the keyboard can not be seen on Xthe screen. Useful for password entry. X.RE X. \ --------------------------------- X.TP XFldAdjust XIndicates whether to adjust the text right or left within the field Xand whether or not to zero or blank fill the field. X.RS 6 X.TP 15 XNOFILL Xno action. X.TP XRTADJ_ZFILL Xright adjust, zero fill X.TP XRTADJ_BFILL Xright adjust, blank fill X.TP XLFADJ_ZFILL Xleft adjust, zero fill X.TP XLFADJ_BFILL Xleft adjust, blank fill X.RE X. \ --------------------------------- X.TP 6 XFldType XThis argument describes the memory variable that is to hold Xthe input data. The address that you loaded into "&Fld". X.RS 6 X.TP 10 XCHAR Xcharacter field X.TP XINT Xinteger X.TP XSHORT Xshort integer X.TP XLONG Xlong integer X.TP XDOUBLE Xdouble X.TP XFLOAT Xfloating point X.TP XMONEY Xdouble which accepts only two decimal positions. X.RE X. \ --------------------------------- X.TP 11 XFldExit X.RS 6 X.TP 10 XAUTONEXT XGetInput() will exit, with the value of KEY_RETURN, when the last character Xin the field is keyed in. X.TP XNOAUTO XWill not exit field until a accept key (see defining keyboard keys) is pressed. X.RE X. \ --------------------------------- X.TP XMustEnter X.RS 6 X.TP 12 XMUSTENTER XThis is a must enter field and the value of FldMin must be Xentered before exiting field. X.TP XNOMUST XNot a must enter field. X.RE X. \ --------------------------------- X.RE X.TP 6 XErrRow XIndicates what row/column to display an error message if one occurs. XThe row specified is for stdscr. XIf a optional column is to be specified on where to start the message, the Xformat would be for example 2302 where 23 is the row and 02 is the column. XOtherwise, a default of column zero is used. XGetInput will do a clrtoeol() before displaying the error message, therefore, Xthe entire row must be given over to GetInput. XIf this row is outside the boundary of the window unpredictable results will Xoccur, for example, winch() will return garbage. X.TP XMsgRow XIndicates what row to display help messages. XThe row specified is for stdscr. XIf a optional column is to be specified on where to start the message, the Xformat would be for example 2202 where 22 is the row and 02 is the column. XOtherwise, a default of column zero is used. XGetInput will do a clrtoeol() before displaying the message, therefore, Xthe entire row must be given over to GetInput. XIf this row is outside the boundary of the window unpredictable results will Xoccur, for example, winch() will return garbage. X.RS 6 X.TP 10 XNULL XNo active message line. Only if PromptMsg == NOMSG. X.RE X.TP X*PromptMsg XPrompt message to be displayed. The prompt message is always displayed Xto stdscr, regardless of the win specified. X.RS 6 X.TP 10 XNOMSG XNo message to be displayed. X.RE X.TP XHelpFile XFile name containing on-line help messages. Current directory Xis searched first for helpfile and then getenv("HELPDIR") directory is Xsearched. X.RS 6 X.TP 10 XNOHELP XNo help file is available for this field. X X.PP XThe default helpfile (GetInput.hlp) is shown below. Where this file is Xinstalled will vary from machine to machine. X X.nf X\fBGETINPUT\fP X .TITLE GETINPUT Help XMover Keys: X KEY_RETURN (^m) Traverse forwards through the fields. X KEY_DOWN (^j) Traverse forwards through the fields. X KEY_UP (^k) Traverse backwards through the fields. X KEY_TAB (^i) Fast forward through the fields. X KEY_BTAB Fast reverse through the fields. XField Editing Keys: X KEY_BEG (^b) Place cursor at beginning of field. X KEY_END (^e) Place cursor at end of input in field. X KEY_RIGHT (^l) Forward space within the field. X KEY_LEFT (^h) Backspace within the field (non-destructive). X KEY_BACKSPACE (^h) Same as KEY_LEFT. X KEY_EOL (^d) Delete from cursor to end of field. X KEY_DL (^c) Clear field and home cursor. X KEY_DC (^x) Delete a character. X KEY_IC (^t) Toggle between type-over and insert mode. XOther Keys: X KEY_HELP (?) Display help screen. X KEY_REFRESH (^r) Redraw the screen. X KEY_ACCEPT (^a) Accept all input and exit screen. X KEY_CANCEL (esc) Cancel all input and exit screen. X KEY_SAVE (^f) Save screen to a file. X KEY_PRINT (^p) Print screen to lp. X\fBGETINPUT\fP X X X X\fBpopmenu\fP X.TITLE Pop-Up Menu Help XSELECTING OPTIONS: X To select an option press the "up arrow key", X "k", "down arrow key", "j" to place bar on X option and press "return". X X KEY_CANCEL (esc) - Cancel selection. X\fBpopmenu\fP X X X X\fBhelp\fP X.TITLE Using Help XHelp displays consist of a description displayed in a window. XIf the description doesn't fit in the window, the Up Arrow and XDown Arrow keys can be used to view a few more lines of the Xdisplay. Exiting the help system will return the display to Xthe state it was in when you asked for help. X X The following keys are active in help: X KEY_CANCEL (esc) Exit help. X KEY_DOWN (^j) View a few more lines. X KEY_UP (^k) View the previous lines. X KEY_BEG (^b) Display first page. X KEY_END (^e) Display last page. X KEY_TOC (^t) Display table of contents. X\fBhelp\fP X.fi X.RE X.TP XHelpTag XTag in help file where messages are to be found. The tag Xsurrounds the help message. For example: X.nf X Xhelptag X[ .TITLE Title line goes here. ] XI put any help message for the user between the tags. XIt can be any length as it will be displayed one screen Xat a time. XThe following screen attributes may be used: X\\S = Standout X\\B = Bold X\\U = Underline X\\D = Dim X\\R = Reverse video X\\L = Blink X\\N = Normal (reset) X X\\BThis text is in bold face. \\NBack in normal mode. Xhelptag X XThe \fITABLE_OF_CONTENTS\fP tagname is a special tag describing what Xis to be contained in the table of contents menu. The following is the Xsyntax for this tagname. XTABLE_OF_CONTENTS Xhelpfile tagname description XTABLE_OF_CONTENTS X.fi X.RS 6 X.TP 10 XNOTAG XNo tag. Should only be used if (HelpFile == NOHELP). X.RE X.SH EXAMPLE X.nf X#include X#include "GetInput.h" X Xmain () X{ X union FldUnion Fld; X char name[20], tempstring[50]; X int exitcode; X X initscr (); X cbreak (); X noecho (); X nonl (); X keypad (stdscr, TRUE); X X name[0] = '\\0'; X Fld.strVal = name; X exitcode = GetInput (stdscr, 2, 0, &Fld, A_REVERSE, NOMASK, X NORANGE, 20, 0, UPPER_AN, NOFILL, CHAR, X NOAUTO, MUSTENTER, 21, 20, X "Please enter your name.", NOHELP, NOTAG); X X Fld.strVal = tempstring; X exitcode = GetInput (stdscr, 4, 0, &Fld, A_BOLD, "HH:MM:SS:TT", X NORANGE, 6, 6, TIME, NOFILL, CHAR, AUTONEXT, X NOMUST, 20, 21, "Time Field HH:MM:SS:TT", X "myhelpfile", "field2"); X X Fld.strVal = tempstring; X exitcode = GetInput (stdscr, 8, 0, &Fld, A_NORMAL, X "(999) 999-9999", NORANGE, 10, 5, NUMERIC, X RTADJ_ZFILL, CHAR, NOAUTO, MUSTENTER, 20, NULL, X NOMSG, NOHELP, NOTAG); X X Fld.strVal = tempstring; X exitcode = GetInput (stdscr, 9, 1, &Fld, A_REVERSE, NOMASK, X "CA, NV, ID", 2, 2, SET, NOFILL, CHAR, NOAUTO, X NOMUST, 20, 20, "Select your state.", NOHELP, X NOTAG); X endwin (); X} X.fi X.SH AUTHOR XIrving Griesman (original author) X.br XEnhanced & Maintained by Paul J. Condie X.br X{ihnp4,lll-crg,qantel,pyramid}!ptsfa!pbody!pcbox!pjc X X.SH FILES XGetInput.hlp - default GetInput help file. X X.SH DIAGNOSTICS XGetInput returns the the decimal value of the key pressed from the getch() Xfunction. If the key pressed has an associated curses key GetInput returns Xthe value of the curses key. See Defining keyboard keys. X X.SH SEE ALSO Xmenu(1), curses(3X), popmenu(3). X X.SH WARNING XPutting a field on the same row as your message row or error row may cause Xunpredictable results. This is not recommended. X X.SH BUGS XThere is a bug in curses when you call getch() which this routine does. XWhen in keypad() mode and an ESC character is read, curses Xdoes a timed read (1 second) waiting for other characters to appear. if Xsome other characters are received within the one second time interval, Xcurses attempts to match the received string with a caps string defined for the terminal (i.e. ESC[A, ESC[B are arrow keys for a vt100 type terminal) Xand then returns a #defined int value which can be tested for easily. XIn some cases untrapped alarm calls occur. The solution is to trap (ignore) Xalarm calls. X.PP XOn a mustenter field with a fldmin specified a control key (i.e. KEY_DOWN, etc.) Xwill exit the Xfield if that is the first key the user presses. Once the user has tried Xto input a value in the field even if he clears the field the control key Xwill not exit until fldmin is inputed. X X.nf XThe following example does not turn the reverse video off when you leave the field on the sun. Xrc = GetInput (stdscr, 0, 1, &Fld, A_REVERSE, "VVVVVV.VVVVV.VV.VV.V", X NORANGE, 16, 6, UPPER_AN, NOFILL, CHAR, NOAUTO, MUSTENTER, X ERRROW, MSGROW, "Please enter niu location.", "cfgsrn.hlp", NOTAG); X.fi X X.PP XA core dump of (DisPrmpt at line 37) indicates the string was not null terminated. SHAR_EOF echo "File utilities.d/libgeti.d/GetInput.3X is complete" chmod 0644 utilities.d/libgeti.d/GetInput.3X || echo "restore of utilities.d/libgeti.d/GetInput.3X fails" echo "x - extracting utilities.d/libgeti.d/RingMenu.3 (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/RingMenu.3 && X. \ @(#)RingMenu.3 1.1 DeltaDate 1/22/90 ExtrDate 1/22/90 X.po 6 X.TH RINGMENU 3L X.SH NAME XRingMenu \- Produce a Ring Menu. X X.SH SYNOPSIS X.B "int RingMenu ( win, line, optNum, title, optTable )" X.B "WINDOW *win ;" X.B "unsigned short line, optNum ;" X.B "char *title, *optTable[][2] ;" X X.SH DESCRIPTION XRingMenu accepts a two dimensional pointers arrary, optTable, as specification to display a ring Xmenu. OptTable[][0] is the option name, while optTable[][1] is the description for the option. The Xlast pair of entry in OpTable must be NULL to signify the end of the menu. The optNumth option is Xhighlighted, or the first item will be highlighted if optNum is 0. The ring menu will be displayed on Xwindow win on line number line. Description for option is displayed on the line+1 line. An option- Xal title may be displayed to the left of the ring menu or NULL may be passed if no title is desired.. X XUser may use the arrow keys, or the equivalent control keys to move the highlighted option, and then Xhit the RETURN key to select the desired option. Or a capital letter match may also select a particu- Xlar option, there is no need to hit RETURN in this case. X XRingMenu accepts at most 20 options. X X.SH AUTHOR XSam S. Lok X X.SH RETURN VALUES XThe position number of the selected option. The first option being 1. X X.SH DIAGNOSTICS XNone. X X.SH EXAMPLES X short option = 1 ; X X static char *emp_menu[][2] = { /* The menu */ X { "Query", "Query existing employee" }, X { "Add", "Add new employee" }, X { "Change", "Update existing employee" }, X { "Delete", "Delete existing employee" }, X { "Print", "Screen dump to printer" }, X { "Exit", "Return to menu" }, X { NULL, NULL } X } ; X X option = RingMenu( stdscr, ERRLINE, option, "Employee:", emp_menu ) ; X X.SH FILES XNone. X X.SH SEE ALSO Xmenu(1L), popmenu(3L), GetInput(3L). X X.SH WARNINGS XRingMenu ignores options more than 20. XRingMenu.c makes uses of GetInput(3L)'s GetInput.h, keys.h, ShowHelp() and ScrnPrnt(), other- Xwise, it is very much self contained. SHAR_EOF chmod 0444 utilities.d/libgeti.d/RingMenu.3 || echo "restore of utilities.d/libgeti.d/RingMenu.3 fails" echo "x - extracting utilities.d/libgeti.d/ShowHelp.3 (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/ShowHelp.3 && X. \ %W% DeltaDate %G% ExtrDate %H% X.po 6 X.TH SHOWHELP 3 "libgeti" X X.SH NAME XShowHelp \- creates and displays a help window using curses X X.SH SYNOPSIS X.B "void ShowHelp (help_file_name, tag, error_row) X.br X.B "char help_file_name[];" X.br X.B "char tag[];" X.br X.B "int error_row;" X X.SH \s9DESCRIPTION\s0 X.B ShowHelp Xsearches the \fIhelp_file_name\fP for the specified \fItag\fP, creates and Xcenters a curses window on the screen. Then displays the content of the tag Xin the window. The size of the help window is automatically adjusted to the Xsize of message to be displayed. X X.SS ARGUMENTS X.TP 6 Xhelp_file_name XThe unix file name containing the help message to be displayed. X.TP 6 Xtag XThe tag in the help file that contains the help message to be displayed. X.TP 6 Xerror_row XThe row on the screen (stdscr) to display any error messages. X X.SH HELP FILE SYNTAX XA help file may consist of multiple help tags. Any text found outside a helptag Xis ignored. See the following example. X X.nf X\fBhelptag\fP X[ .TITLE A optional Title line goes here. ] XI put any help message for the user between the tags. XIt can be any length as it will be displayed one screen Xat a time. XThe following screen attributes may be used: X\\S = Standout X\\B = Bold X\\U = Underline X\\D = Dim X\\R = Reverse video X\\L = Blink X\\N = Normal (reset) X X\\BThis text is in bold face. \\NBack in normal mode. X\fBhelptag\fP X X XThe \fITABLE_OF_CONTENTS\fP tagname is a special tag describing what Xis to be contained in the table of contents menu. The following is the Xsyntax for this tagname. XTABLE_OF_CONTENTS Xhelpfile tagname description XTABLE_OF_CONTENTS X X X\fBhelp\fP X .TITLE Using Help XHelp displays consist of a description displayed in a window. XIf the description doesn't fit in the window, the Up Arrow and XDown Arrow keys can be used to view a few more lines of the Xdisplay. Exiting the help system will return the display to Xthe state it was in when you asked for help. X X The following keys are active in help: X KEY_CANCEL (esc) Exit help. X KEY_DOWN (^j) View a few more lines. X KEY_UP (^k) View the previous lines. X KEY_BEG (^b) Display first page. X KEY_END (^e) Display last page. X KEY_TOC (^t) Display table of contents. X\fBhelp\fP X.fi X X.SH AUTHOR XPaul J. Condie 2/89 X.br X{ihnp4,lll-crg,qantel,pyramid}!ptsfa!pbody!pcbox!pjc X X.SH SEE ALSO Xcurses(3X). SHAR_EOF chmod 0644 utilities.d/libgeti.d/ShowHelp.3 || echo "restore of utilities.d/libgeti.d/ShowHelp.3 fails" echo "x - extracting utilities.d/libgeti.d/drawbox.3 (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/drawbox.3 && X. \ @(#)drawbox.3 1.2 DeltaDate 1/22/90 ExtrDate 1/22/90 X.po 6 X.TH DRAWBOX 3 "libgeti" X X.SH NAME Xdrawbox \- draws a box in a curses window X X.SH SYNOPSIS X.B #define DumbLine 1 X.br X.B #define StandoutLine 2 X.br X.B #define SingleLine 3 /* alternate character line */ X.br X.B #define MosaicLine 4 /* alternate character line */ X.br X.B #define DiamondLine 5 /* alternate character line */ X.br X.B #define DotLine 6 /* alternate character line */ X.br X.B #define PlusLine 7 /* alternate character line */ X Xextern int KeyHelp; X X.B "void drawbox (win, from_row, from_col, to_row, to_col, trythis, trythat, vscroll, help\fI, percent\fP)" X.br X.B "WINDOW *win;" X.br X.B "int from_row;" X.br X.B "int from_col;" X.br X.B "int to_row;" X.br X.B "int to_col;" X.br X.B "int trythis;" X.br X.B "int trythat;" X.br X.B "int vscroll;" X.br X.B "int help;" X.br X.B "\fIfloat percent;\fP" X X.SH DESCRIPTION X.B Drawbox Xdraws a box within a curses window. This is similar to the box(3X) function Xin curses, but provides more flexibility in where to draw the box and what Xthe box should look like. X X.SS ARGUMENTS X.TP 6 Xwin XThe curses window to draw the box in. X.TP 6 Xfrom_row, from_col, to_row, to_col XDimensions of the box. Upper left corner and lower right corner of the box. XTo draw a box around the whole window (like box(3) does) Xtry: \fI1,1, LINES,COLS\fP as the box dimensions. X.TP 6 Xtrythis XWhat line type to try first. Any one of the #defines shown above. XIf the terminal Xdoes not support alternate character lines then drawbox will \fItrythat\fP line. X.TP 6 Xtrythat XWhat line to use if trythis doesn't work. This should not be a Xalternate character line. X.TP 6 Xvscroll XIf TRUE vertical scroll bars will be drawn in the right side of the box. X.TP 6 Xhelp XIf TRUE the help key (KeyHelp) will be displayed in the lower right corner Xof the box to indicate help is available. X.TP 6 Xpercent XAn optional decimal value between 0.0 and 1.0 to indicate the position of the Xvertical scroll bars in the right side of the box. Any other value or an Xundefined value will put the scoll bar at the bottom. X X.SH AUTHOR XPaul J. Condie 7/87 X.br X{ihnp4,lll-crg,qantel,pyramid}!ptsfa!pbody!pcbox!pjc X X.SH EXAMPLE X.nf X#include X X Xmain () X{ X drawbox (stdscr, 1,1, LINES,COLS, SingleLine, StandoutLine, TRUE, TRUE, 0.5); X} X.fi X X.SH SEE ALSO Xcurses(3X). SHAR_EOF chmod 0644 utilities.d/libgeti.d/drawbox.3 || echo "restore of utilities.d/libgeti.d/drawbox.3 fails" echo "x - extracting utilities.d/libgeti.d/popmenu.3 (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/popmenu.3 && X.po 6 X.TH POPMENU 3 "libgeti" X X.SH NAME Xpopmenu \- runs a popup type menu X X.SH SYNOPSIS X.B #define NEWMENU 0 X.br X.B #define CREATEMENU -2 X.br X.B #define DIMWINDOW -1 X.br X.br X.B extern int KeyHelp; X.br X.B extern int KeyCancel; X.br X.B extern int KeyUp; X.br X.B extern int KeyDown; X.br X X.B "int popmenu (menu_id, searchStr)" X.br X.B "int menu_id;" X.br X.B "char *searchStr;" X X.SH \s9DESCRIPTION\s0 X.B Popmenu Xis a generic curses popup menu program. The synopsis of popmenu will vary Xdepending on whether you are initializing a new menu or running Xa previously defined menu. The above synopsis will run menu (menu_id) Xthat you have previously defined. X.PP XAn optional search string,\fI*searchStr\fP, is needed as the Xsecond parameter in order for \fIpopmenu\fP to perform initial start-up Xsearch. If (char *)NULL is passed, no start-up search will be done Xand the first or last selected option will be the default option. X.PP XPopmenu will return the number (counting from the top of the menu) Xof the item selected. If the user selected the second item in the menu Xthen \fIpopmenu\fP will return (2). X.br XA negative return value indicates the user canceled the selection. X.PP XAfter you run a menu you will need to touchwin(stdscr); wrefresh(stdscr); Xin order to remove the popmenu from the screen. X.PP XThe KeyCancel defines the key where the user does not want to make any Xchoice. The KeyHelp defines what key is to display the help. The KeyUp and XKeyDown inaddition to the curses arrow key move the select bar up and down. XKeyIC is used to toggle between \fIfull\fP and \fIfirst\fP character matching Xschemes. X X.SH DEFINE NEW MENU X.B "popmenu (action, menu_id, row, column, title, helpfile, win_size, sizeof( option_base ), option_base, mtype )" X.br X.B "int action;" X.br X.B "int menu_id;" X.br X.B "int row;" X.br X.B "int column;" X.br X.B "char *title;" X.br X.B "char *helpfile;" X.br X.B "int win_size;" X.br X.B "char *option_base;" X.br X or X.br X.B "char **option_base;" X.br X.B "int mtype;" X X.SS ARGUMENTS X.TP 6 Xaction XNEWMENU - tells popmenu that you want to initialize a new menu. XIf one already exists for this menu_id it will be deleted and then recreated Xfrom the new list. X.br X XCREATEMENU - If a menu already exists for this menu_id then this flag has Xno effect. Otherwise, it initializes a new menu from the list provided. X XDIMWINDOW - Dims the reverse video box around the menu. X.br Xpopmenu (DIMWINDOW, menu_id); X.TP 6 Xmenu_id XA unique identifier that you chose to be assiciated with a menu. XYou use this identifier to run the menu. X.TP 6 Xrow, column XThe upper left corner of where you want the menu box to popup at. X.TP 6 Xtitle XTitle to be centered on the first row of the menu. If title is null no title Xwill be displayed. X.TP 6 Xhelpfile XThe helpfile name that contains help text to be displayed when the uses presses Xthe help key. If a helpfile is supplied a "?" is displayed in the lower Xright hand corner of the menu. Set to null if no help file is provided. X.br XThe help file should be in a format corresponding to GetInput(3), see XGetInput(3X) for more information. Popmenu is hard-coded to look for X\fIhelptag\fP "popmenu" in the helpfile. X.TP 6 Xwin_size XThe length of the pop-up window. This may be less than the number of Xoptions, so that popmenu() will only display X.I win_size Xnumber of options on the screen. A window size of 6 or the number of options, Xwhichever is less, is used if this field is set to 0. Note that this field Xshould not be set to be more than 22, which is the normal screen size (24) Xminus 2 for the borders. X.TP 6 Xsizeof( option_base[0] ) or 0 XIs an integer telling popmenu() the size of one option array element. It can Xalso be set to X.I zero(0) Xif (char **) array is passed as the next argument, X.I popmenu Xwill figure out the increment as the size of a char pointer. X.TP 6 Xoption_base XThis is a (char *) to an array which store Xthe options you want to appear in the menu. This array can be either a Xtwo dimensional char array, or a structure array, or even an array of pointers. XThe first char string in each array element up to the first NULL character is Xused to be displayed as options. The rest of the field may just be table Xlook-up items. Also, The last element must be NULL to signify the end of the Xtable. X.TP 6 Xmtype X.I mtype Xis either TRUE or FALSE. When TRUE, \fIpopmenu\fP performs full length, Xnon-case-sensitive option matching, otherwise, a first character only Xmatching scheme will be used. X.PP XFor menus that has to be built dynamically during run time, Xthere are benefit of preparing your option table either way. With a pre-set Xchar array storing the menu entries, cpu usage is optimized in the expense of Xmemory; while using char *array will optimize memory usage but has to allocate Xmemory on the fly. Menus built at compiled time are about equal with either Xmethod. X X.SH CREDITS XPaul J. Condie 7/87 (original author) X.br X{ihnp4,lll-crg,qantel,pyramid}!ptsfa!pbody!pcbox!pjc X XSam S. Lok enhancements X X.SH EXAMPLE X.nf X#include X X#define NEWMENU 0 X Xint KeyHelp = 23; /* control w */ Xint KeyCancel = 27; /* ESC */ Xint KeyDown; Xint KeyUp; X Xmain () X{ X int option; /* the option the user selected */ X static char mymenu[][7] = { X "QUERY", "ADD", "DELETE", (char *)NULL }; X static char *yourmenu[] = { X "QUERY", "ADD", "DELETE", (char *)NULL }; X X X /* define a new menu */ X popmenu(NEWMENU, 1, 5,10, "Title", "", 3, sizeof( mymenu[0] ), mymenu, TRUE ); X popmenu(NEWMENU, 2, 7,15, "Title", "", 0, 0, yourmenu, TRUE ); X X /* run the menu */ X option = popmenu (1, "c"); X option = popmenu (2, (char *)NULL); X X /* remove the menu from the screen */ X touchwin (stdscr); X wrefresh (stdscr); X} X.fi X X.SH SEE ALSO Xcurses(3X), GetInput(3X). SHAR_EOF chmod 0644 utilities.d/libgeti.d/popmenu.3 || echo "restore of utilities.d/libgeti.d/popmenu.3 fails" echo "x - extracting utilities.d/libgeti.d/GetInput.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/libgeti.d/GetInput.hlp && XGETINPUT X.TITLE GETINPUT Help XMover Keys: X KEY_RETURN (^m) Traverse forwards through the fields. X KEY_DOWN (^j) Traverse forwards through the fields. X KEY_UP (^k) Traverse backwards through the fields. X KEY_TAB (^i) Fast forward through the fields. X KEY_BTAB Fast reverse through the fields. XField Editing Keys: X KEY_BEG (^b) Place cursor at beginning of field. X KEY_END (^e) Place cursor at end of input in field. X KEY_RIGHT (^l) Forward space within the field. X KEY_LEFT (^h) Backspace within the field (non-destructive). X KEY_BACKSPACE (^h) Same as KEY_LEFT. X KEY_EOL (^d) Delete from cursor to end of field. X KEY_DL (^c) Clear field and home cursor. X KEY_DC (^x) Delete a character. X KEY_IC (^t) Toggle between type-over and insert mode. XOther Keys: X KEY_HELP (?) Display help screen. X KEY_REFRESH (^r) Redraw the screen. X KEY_ACCEPT (^a) Accept all input and exit screen. X KEY_CANCEL (esc) Cancel all input and exit screen. X KEY_SAVE (^f) Save screen to a file. X KEY_PRINT (^p) Print screen to lp. XGETINPUT X X X Xpopmenu X.TITLE Pop-Up Menu Help XSELECTING OPTIONS: X Press the "up arrow key", "^k", "down arrow key", "^j" X to place bar on option and press "return". X X or X X Enter the first character of the option you X wish to select and press "return". X X KEY_CANCEL (esc) - Cancel selection. Xpopmenu X X X Xhelp X.TITLE Using Help XHelp displays consist of a description displayed in a window. XIf the description doesn't fit in the window, the Up Arrow and XDown Arrow keys can be used to view a few more lines of the Xdisplay. Exiting the help system will return the display to Xthe state it was in when you asked for help. X X The following keys are active in help: X KEY_CANCEL (esc) Exit help. X KEY_DOWN (^j) View a few more lines. X KEY_UP (^k) View the previous lines. X KEY_BEG (^b) Display first page. X KEY_END (^e) Display last page. Xhelp SHAR_EOF chmod 0444 utilities.d/libgeti.d/GetInput.hlp || echo "restore of utilities.d/libgeti.d/GetInput.hlp fails" echo "x - extracting utilities.d/checkpass.d/checkpass.1 (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/checkpass.d/checkpass.1 && X. \ %W% DeltaDate %G% ExtrDate %H% X.po 6 X.TH CHECKPASS 1 "" "Menu Utility" X X.SH \s9NAME\s0 Xcheckpass \- find matching passwd in /etc/passwd file for a specified login. X X.SH SYNOPSIS Xcheckpass login passwd X X.SH DESCRIPTION X.I Checkpass Xfinds the \fIlogin\fP password in the /etc/passwd file, encrypts the X\fIpasswd\fP and does a comparison. X.SH FILES X/etc/passwd X X.SH AUTHOR XVickie C. Chui X X.SH DIAGNOSTICS XCheckpass returns exit code zero if it was successful, otherwise, it Xreturns a 4. SHAR_EOF chmod 0644 utilities.d/checkpass.d/checkpass.1 || echo "restore of utilities.d/checkpass.d/checkpass.1 fails" echo "x - extracting utilities.d/checkpass.d/checkpass.c (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/checkpass.d/checkpass.c && X/* X * checkpass.c: encrypt entered passwd and comparing it against X * the /etc/passwd. X * X * Inputs: argv[1] - login X * argv[2] - passwd X * X * Return Values: 4 failure X * 0 - matched passwd found X */ X X#include X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X struct passwd *getpwnam(), *pwentry; X char salt[2], X *crypt(), X *encryptedpw; X X X /* check number of arguments */ X if(argc != 3) { X printf("Usage: checkpass login passwd\n"); X exit(4); X } X X /* get passwd for login from /etc/passwd file */ X if((pwentry=getpwnam(argv[1])) == (struct passwd *) 0) X exit(4); X X salt[0] = *(pwentry->pw_passwd); X salt[1] = *(pwentry->pw_passwd +1); X X /* encrypt entered passwd */ X encryptedpw = crypt(argv[2], salt); X X /* compare passwd in /etc/passwd with the encrypted passwd */ X if(strcmp(encryptedpw, pwentry->pw_passwd) ) X exit(4); X exit(0); X} SHAR_EOF chmod 0644 utilities.d/checkpass.d/checkpass.c || echo "restore of utilities.d/checkpass.d/checkpass.c fails" echo "x - extracting utilities.d/lock.d/junk (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/lock.d/junk && X lockfd = open(diallock, O_WRONLY|O_CREAT|O_EXCL, X 0444) ; X if (lockfd < 0) X { X if (debug & D_DEVICE) X { X dialmsg("%s: %s\n", errstring(), X diallock) ; X } X continue ; X } X else X { X /* pjc */ X /* write process id to lock file */ X sprintf (tmpstr, "%d", getpid()); X sprintf (spid, "%10.10s", tmpstr); X write (lockfd, spid, strlen(spid)); X } X X (void) close(lockfd) ; SHAR_EOF chmod 0644 utilities.d/lock.d/junk || echo "restore of utilities.d/lock.d/junk fails" echo "x - extracting utilities.d/lock.d/lock.1 (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/lock.d/lock.1 && X. \ %W% DeltaDate %G% ExtrDate %H% X.po 6 X.TH LOCK 1 "" "Menu Utility" X X.SH \s9NAME\s0 Xlock \- does a lock on a file X X.SH SYNOPSIS X.B lock filename X X.SH DESCRIPTION X.B LOCK Xis designed to be a utility program to be used in conjunction with the menu(1) Xprogram. Lock does a lock on a file. When used with the menu(1) Xprogram the filename should probably be the program name. A "LCK.." is Xprepended Xto the filename to indicate that this is a lock file. This is in keeping Xwith uucp lock file syntax. If the \fILCK..filename\fP Xdoes not exist it will be created. The lock file is created/looked for in Xgetenv("LOCKDIR"). X X X.SH EXAMPLE X.nf Xlock program_name Xif [ $? -eq 0 ] X then program_name X unlock program_name Xfi X.fi X X.SH FILES X\fI$LOCKDIR/LCK..filename\fP the lock file X X.SH AUTHOR XPaul J. Condie 10/88 X.br X{att,bellcore,sun,ames,pyramid}!pacbell!pcbox!pjc X X.SH SEE ALSO Xmenu(1), unlock(1). X X.SH DIAGNOSTICS XLock returns a zero if the lock was successfully created, X99 no file specified on command line, Xotherwise, it returns \fIerrno\fP. See errno description in manual. SHAR_EOF chmod 0644 utilities.d/lock.d/lock.1 || echo "restore of utilities.d/lock.d/lock.1 fails" echo "x - extracting utilities.d/lock.d/lock.c (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/lock.d/lock.c && X/* X** Returns: X** 0 lock successful X** 99 no file on command line X** otherwise errno X*/ X X#include X#include X#include X Xmain (argc, argv) X int argc; X char *argv[]; X{ X char *getenv(); X int fd; /* file descriptor */ X char file[40]; X X if (argc != 2) X exit (1); X X if (getenv("LOCKDIR") != (char *)NULL) X sprintf (file, "%s/LCK..%s", getenv("LOCKDIR"), argv[1]); X else X sprintf (file, "LCK..%s", argv[1]); X X if ((fd = open (file, O_WRONLY|O_CREAT|O_EXCL, 0444)) < 0) X { X /* check to see if process is still running */ X exit (errno); X } X X /* write process id to lock file */ X /* X sprintf (tmpstr, "%d", getpid()); X sprintf (spid, "%10.10s", tmpstr); X write (lockfd, spid, strlen(spid)); X */ X X close (fd); X exit (0); X} X/* Paul J. Condie 8-89 */ SHAR_EOF chmod 0644 utilities.d/lock.d/lock.c || echo "restore of utilities.d/lock.d/lock.c fails" echo "x - extracting utilities.d/lock.d/unlock.1 (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/lock.d/unlock.1 && X. \ %W% DeltaDate %G% ExtrDate %H% X.po 6 X.TH UNLOCK 1 "" "Menu Utility" X X.SH \s9NAME\s0 Xunlock \- unlocks a semaphore lock on a file X X.SH SYNOPSIS Xlock filename X X.SH DESCRIPTION X.B UNLOCK Xis designed to be a utility program to be used in conjunction with the menu(1) Xprogram. Unlock does a semaphore unlock on a file then unlinks the filename. XThe filename should have been previously locked using lock(1). XA "LCK.." is prepended Xto the filename to indicate that this is a lock file. XThe lock file is looked for in getenv("LOCKDIR"). X X.PP XThe important thing for unlock is to make sure it runs regardless of how Xthe program exits. Examples of how insure that this happens is illustrated Xbelow: X.br Xtrap 'unlock pgm; trap 2' 2; (pgm; unlock pgm); trap 2 X.br X(nohup pgm; nohup unlock)& X X.SH FILES X\fI$LOCKDIR/LCK..filename\fP the lock file X X.SH AUTHOR XPaul J. Condie 10/88 X.br X{att,bellcore,sun,ames,pyramid}!pacbell!pcbox!pjc X X.SH SEE ALSO Xmenu(1), lock(1). X X.SH DIAGNOSTICS XUnlock returns exit code zero if the unlock was successful, otherwise, it Xreturns a non-zero. SHAR_EOF chmod 0644 utilities.d/lock.d/unlock.1 || echo "restore of utilities.d/lock.d/unlock.1 fails" echo "x - extracting utilities.d/lock.d/unlock.c (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/lock.d/unlock.c && X/* X** Name: unlock(1) X** Returns: X** 0 unlock successful X** 99 no file on command line X** otherwise errno X*/ X X#include X#include X Xmain (argc, argv) X int argc; X char *argv[]; X{ X char *getenv(); X char file[40]; X X if (argc != 2) X exit (99); X X if (getenv("LOCKDIR") != (char *)NULL) X sprintf (file, "%s/LCK..%s", getenv("LOCKDIR"), argv[1]); X else X sprintf (file, "LCK..%s", argv[1]); X X if (unlink (file) < 0) X exit (errno); X X exit (0); X} X/* Paul J. Condie 8-89 */ SHAR_EOF chmod 0644 utilities.d/lock.d/unlock.c || echo "restore of utilities.d/lock.d/unlock.c fails" echo "x - extracting utilities.d/lock.d/uulock.c (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/lock.d/uulock.c && X/* X X Lock a tty and then run a program. Blow away old locks. X X Written for Sys V with HDB style locks. X Written by Jon Zeeff (zeeff@b-tech.ann-arbor.mi.us) X This program placed in the public domain. X X*/ X X#include X#include X#include X#include X#include X#include X#include X Xchar *strcpy(); Xchar *strcat(); Xunsigned sleep(); Xunsigned alarm(); Xvoid exit(); Xint pid; X XFILE *lock; Xchar tty_lock[100]; X Xmain(argc,argv) Xint argc; Xchar **argv; X{ X X if (argc < 3) { X fprintf(stderr,"Usage: uulock tty command args\n"); X exit(1); X } X X /* create a hdb style lock file */ X X strcpy(tty_lock,"/usr/spool/locks/LCK.."); X strcat(tty_lock,argv[1]); X X check_lock(tty_lock); X umask(022); X X lock = fopen(tty_lock,"w"); X if (lock) { X fprintf(lock,"%10.10d\n",(int)getpid()); X fclose(lock); X X if (pid = fork()) { X int w; X while ((w = wait((int *)0)) != pid && w != -1); X unlink(tty_lock); X } else { X execvp(argv[2],&argv[2]); X printf("Can't exec that program\n"); X exit(2); X } X } else { X fprintf(stderr,"tty port in use\n"); X return 2; X } X X return 0; X} X X/* remove a lock file if the process is no longer there */ X Xcheck_lock(file_name) Xchar *file_name; X{ X X int fd; X char lock_pid[11]; X extern int errno; X X if ((fd = open(file_name, O_RDONLY)) == -1) { X unlink(file_name); X return 0; X } X X read(fd,lock_pid, 10); X close(fd); X X if ((kill(atoi(lock_pid), 0)) == 0 || errno == EPERM) X return 1; /* process is active */ X X unlink(file_name); X return 0; X} SHAR_EOF chmod 0644 utilities.d/lock.d/uulock.c || echo "restore of utilities.d/lock.d/uulock.c fails" echo "x - extracting utilities.d/m.d/adduser (Text)" sed 's/^X//' << 'SHAR_EOF' > utilities.d/m.d/adduser && X#! /bin/ksh X# %W% DeltaDate %G% ExtrDate %H% X X### adduser X### Add a new user login to the system. X### This script is designed to be run from the menu(1) program. X### Menu script file is sadmin.m X### This script needs to be run with a set uid to root. X### X### Arguments: X### $1 = login ID X### $2 = encrypted password X### $3 = numerical user ID X### $4 = numerical group ID X### $5 = Text (Users Read Name) X### $6 = directory to create users home directory in X### $7 = program to use as Shell X### $8 = default .profile for user X### $9 = default printer X### $10 = password file X### $11 = group file X### X### Note: X### In order to get chgrp to work you need to chown to $LOGNAME first. X### The setuid does not work for chgrp ???? X### X X### Validate argument count Xif [ $# -ne 11 ] X then echo "[$0] Incorrect argument count." X exit 1 Xfi X XLOGNAME=$1 XPASSWD=$2 XUID=$3 XGID=$4 XNAME=$5 XHOMEDIR=$6 XLOGSHELL=$7 XDPROFILE=$8 XPRINTER=$9 Xshift; shift XPWDFILE=$8 XGROUPFILE=$9 X X### Validate must enter arguments. Xif [ -z "$LOGNAME" ] X then echo "No Login specified. Aborting adduser." X exit 1 Xfi Xif [ -z "$UID" ] X then echo "No User ID specified. Aborting adduser." X exit 1 Xfi Xif [ -z "$GID" ] X then echo "No Group ID specified. Aborting adduser." X exit 1 Xfi Xif [ -z "$HOMEDIR" ] X then echo "No Home Directory specified. Aborting adduser." X exit 1 Xfi Xif [ -z "$LOGSHELL" ] X then echo "No Login Shell specified. Aborting adduser." X exit 1 Xfi Xif [ -z "$PWDFILE" ] X then echo "No Password File specified. Aborting adduser." X exit 1 Xfi Xif [ -z "$GROUPFILE" ] X then echo "No Group File specified. Aborting adduser." X exit 1 Xfi X X X X# Prompt for conformation Xreply=`MenuPrompt \`tput lines\` 0 "Are You Sure (y/n) ? "` Xif [ "$reply" != "y" ] X then echo "$LOGNAME not added." X exit 1 Xfi X Xtrap "MenuMsg `tput lines` 0 'Too late to abort adduser!'" 2 3 15 X X X X X### Make home directory XMenuMsg `tput lines` 0 "Making a home directory." XMAKEDIR=yes Xif [ -s "$HOMEDIR" ] X then reply=`MenuPrompt \`tput lines\` 0 "Warning: $HOMEDIR already exists. Okay to use it. (y/n) ? "` X if [ "$reply" = "y" ] X then MAKEDIR=no X fi Xfi Xif [ "$MAKEDIR" = "yes" ] X then mkdir $HOMEDIR X rcde=$? X if [ $rcde -ne 0 ] X then echo "[$rcde] Could not create $HOMEDIR." X exit 1 X fi Xfi X### The home directory will be chown'd after we add entry to password file. SHAR_EOF echo "End of part 12" echo "File utilities.d/m.d/adduser is continued in part 13" echo "13" > s2_seq_.tmp exit 0