home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / LO241SRV.ZIP / LSETUP7.C < prev    next >
Text File  |  1998-05-17  |  52KB  |  1,322 lines

  1.  
  2. // LoraBBS Version 2.41 Free Edition
  3. // Copyright (C) 1987-98 Marco Maccaferri
  4. //
  5. // This program is free software; you can redistribute it and/or modify
  6. // it under the terms of the GNU General Public License as published by
  7. // the Free Software Foundation; either version 2 of the License, or
  8. // (at your option) any later version.
  9. //
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14. //
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <io.h>
  24. #include <fcntl.h>
  25. #include <sys\stat.h>
  26.  
  27. #include "lsetup.h"
  28. #include "lprot.h"
  29.  
  30. #include <cxl\cxlvid.h>
  31. #include <cxl\cxlwin.h>
  32. #include <cxl\cxlstr.h>
  33. #include <cxl\cxlkey.h>
  34.  
  35. extern struct _configuration config;
  36.  
  37. void start_update (void);
  38. void stop_update (void);
  39. long window_get_flags (int y, int x, int type, long f);
  40. char *get_priv_text (int);
  41. int sh_open (char *file, int shmode, int omode, int fmode);
  42.  
  43. static char otherdata = 0;
  44.  
  45. unsigned long cr3tab[] = {                /* CRC polynomial 0xedb88320 */
  46.    0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
  47.    0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
  48.    0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
  49.    0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
  50.    0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
  51.    0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
  52.    0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
  53.    0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
  54.     0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
  55.    0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
  56.    0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
  57.    0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
  58.    0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
  59.    0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
  60.    0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
  61.    0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
  62.    0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
  63.    0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
  64.    0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
  65.    0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
  66.    0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
  67.    0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
  68.    0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
  69.    0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
  70.    0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
  71.    0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
  72.    0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
  73.    0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
  74.    0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
  75.    0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
  76.    0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
  77.    0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
  78. };
  79.  
  80. #define Z_32UpdateCRC(c,crc) (cr3tab[((int) crc ^ c) & 0xff] ^ ((crc >> 8) & 0x00FFFFFFL))
  81.  
  82. long crc_name (char *name)
  83. {
  84.    int i;
  85.    long crc;
  86.  
  87.    crc = 0xFFFFFFFFL;
  88.    for (i=0; i < strlen (name); i++)
  89.            crc = Z_32UpdateCRC (((unsigned short) name[i]), crc);
  90.  
  91.    return (crc);
  92. }
  93.  
  94. typedef struct {
  95.    char *name;
  96.    long pos;
  97.    long posidx;
  98. } USRA;
  99.  
  100. static int user_sort_func (const void *a1, const void *b1)
  101. {
  102.    USRA *a, *b;
  103.  
  104.    a = (USRA *)a1;
  105.    b = (USRA *)b1;
  106.  
  107.    return (strcmp (&a->name[6], &b->name[6]));
  108. }
  109.  
  110. static void user_select_list (int fd, int fdidx, struct _usr *ousr)
  111. {
  112.    int wh, i, x, start;
  113.    char string[80], **names;
  114.    struct _usr usr;
  115.    long pos, posidx;
  116.    USRA *array;
  117.  
  118.    wh = wopen (2, 0, 22, 77, 1, LCYAN|_BLACK, CYAN|_BLACK);
  119.    wactiv (wh);
  120.    wshadow (DGREY|_BLACK);
  121.    wtitle (" Select user ", TRIGHT, YELLOW|_BLUE);
  122.  
  123.    wprints (0, 1, LGREY|_BLACK, " #    Name                               City                Level");
  124.    whline (1, 0, 76, 0, BLUE|_BLACK);
  125.  
  126.    gotoxy_ (24, 1);
  127.    clreol_ ();
  128.    prints (24, 1, LGREY|_BLACK, "-Move bar  ENTER-Select");
  129.    prints (24, 1, YELLOW|_BLACK, "");
  130.    prints (24, 14, YELLOW|_BLACK, "ENTER");
  131.  
  132.    i = (int)(filelength (fd) / sizeof (struct _usr));
  133.    i += 2;
  134.    if ((array = (USRA *)malloc (i * sizeof (USRA))) == NULL)
  135.       return;
  136.    if ((names = (char **)malloc (i * sizeof (char *))) == NULL)
  137.       return;
  138.  
  139.    pos = tell (fd) - sizeof (struct _usr);
  140.    lseek (fd, 0L, SEEK_SET);
  141.    posidx = tell (fdidx);
  142.    lseek (fdidx, 0L, SEEK_SET);
  143.  
  144.    i = 0;
  145.    start = -1;
  146.  
  147.    while (read (fd, (char *)&usr, sizeof (struct _usr)) == sizeof (struct _usr)) {
  148.       lseek (fdidx, (long)sizeof (struct _usridx), SEEK_CUR);
  149.       sprintf (string, " %-4d %-34.34s %-18.18s %-13s ", i + 1, usr.name, usr.city, get_priv_text (usr.priv));
  150.       array[i].name = (char *)malloc (strlen (string) + 1);
  151.       if (array[i].name == NULL)
  152.          break;
  153.       array[i].pos = tell (fd) - sizeof (struct _usr);
  154.       array[i].posidx = tell (fdidx);
  155.       strcpy (array[i++].name, string);
  156.    }
  157.    array[i].name = NULL;
  158.    qsort (array, i, sizeof (USRA), user_sort_func);
  159.  
  160.    i = 0;
  161.    while (array[i].name != NULL) {
  162.       if (start == -1) {
  163.          if (!strncmp (&array[i].name[6], ousr->name, strlen (ousr->name)))
  164.             start = i;
  165.       }
  166.       names[i] = array[i++].name;
  167.    }
  168.    names[i] = NULL;
  169.    if (start == -1)
  170.       start = 0;
  171.  
  172.    x = wpickstr (5, 2, 21, 75, 5, LGREY|_BLACK, CYAN|_BLACK, BLUE|_LGREY, names, start, NULL);
  173.  
  174.    if (x == -1) {
  175.       lseek (fd, pos, SEEK_SET);
  176.       lseek (fdidx, posidx, SEEK_SET);
  177.    }
  178.    else {
  179.       lseek (fd, array[x].pos, SEEK_SET);
  180.       lseek (fdidx, array[x].posidx, SEEK_SET);
  181.    }
  182.    read (fd, (char *)ousr, sizeof (struct _usr));
  183.  
  184.    wclose ();
  185.  
  186.    i = 0;
  187.    while (array[i].name != NULL)
  188.       free (array[i++].name);
  189.    free (array);
  190.    free (names);
  191.  
  192.    gotoxy_ (24, 1);
  193.    clreol_ ();
  194.    prints (24, 1, LGREY|_BLACK, "PgUp/PgDn-Next/Previous  E-Edit  A-Add New User  L-List  D-Delete");
  195.    prints (24, 1, YELLOW|_BLACK, "PgUp/PgDn");
  196.    prints (24, 26, YELLOW|_BLACK, "E");
  197.    prints (24, 34, YELLOW|_BLACK, "A");
  198.    prints (24, 50, YELLOW|_BLACK, "L");
  199.    prints (24, 58, YELLOW|_BLACK, "D");
  200. //   prints (24, 68, YELLOW|_BLACK, "O");
  201. }
  202.  
  203. void edit_archiver (struct _usr *usr)
  204. {
  205.    int i, dim, start = 255;
  206.    char packs[MAXPACKER][30];
  207.  
  208.    for (i = 0, dim = 0; i < MAXPACKER; i++)
  209.       if (config.packid[i].display[0])
  210.          dim++;
  211.  
  212.    wopen (4, 22, dim + 8, 46, 1, LCYAN|_BLACK, CYAN|_BLACK);
  213.    wshadow (DGREY|_BLACK);
  214.    wtitle (" Select archiver ", TRIGHT, YELLOW|_BLUE);
  215.  
  216.    wmenubegc ();
  217.    wmenuitem ( 1,  1, " None               ", 0, 255, 0, NULL, 0, 0);
  218.  
  219.    for (i = 0, dim = 1; i < MAXPACKER; i++) {
  220.       if (config.packid[i].display[0]) {
  221.          sprintf (packs[i], " %-18.18s ", &config.packid[i].display[1]);
  222.          wmenuitem ( dim + 1,  1, packs[i], 0, i + 1, 0, NULL, 0, 0);
  223.          dim++;
  224.  
  225.          if (toupper (config.packid[i].display[0]) == toupper (usr->archiver))
  226.             start = i + 1;
  227.       }
  228.    }
  229.    wmenuend (start, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  230.  
  231.    i = wmenuget ();
  232.  
  233.    if (i != -1) {
  234.       if (i == 255)
  235.          usr->archiver = '\0';
  236.       else
  237.          usr->archiver = toupper (config.packid[i - 1].display[0]);
  238.    }
  239.  
  240.    wclose ();
  241. }
  242.  
  243. void edit_language (struct _usr *usr)
  244. {
  245.    int i, dim;
  246.    char packs[MAX_LANG][30];
  247.  
  248.    for (i = 0, dim = 0; i < MAX_LANG; i++)
  249.       if (config.language[i].descr[0])
  250.          dim++;
  251.  
  252.    wopen (4, 22, dim + 7, 46, 1, LCYAN|_BLACK, CYAN|_BLACK);
  253.    wshadow (DGREY|_BLACK);
  254.    wtitle (" Select language ", TRIGHT, YELLOW|_BLUE);
  255.  
  256.    wmenubegc ();
  257.  
  258.    for (i = 0, dim = 0; i < MAX_LANG; i++) {
  259.       if (config.language[i].descr[0]) {
  260.          sprintf (packs[i], " %-18.18s ", &config.language[i].descr[1]);
  261.          wmenuitem ( dim + 1,  1, packs[i], 0, i + 1, 0, NULL, 0, 0);
  262.          dim++;
  263.       }
  264.    }
  265.    wmenuend (usr->language + 1, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  266.  
  267.     i = wmenuget ();
  268.  
  269.     if (i != -1)
  270.         usr->language = i - 1;
  271.  
  272.     wclose ();
  273. }
  274.  
  275. void edit_single_user (struct _usr *usr)
  276. {
  277.     int i = 1, wh1, m;
  278.     char string[128];
  279.     struct _usr nusr;
  280.  
  281.     memcpy ((char *)&nusr, (char *)usr, sizeof (struct _usr));
  282.  
  283.     gotoxy_ (24, 1);
  284.     clreol_ ();
  285.     prints (24, 1, LGREY|_BLACK, "ESC-Exit/Save  ENTER-Edit");
  286.     prints (24, 1, YELLOW|_BLACK, "ESC");
  287.     prints (24, 16, YELLOW|_BLACK, "ENTER");
  288.  
  289. continue_editing:
  290.     do {
  291.         stop_update ();
  292.         wclear ();
  293.  
  294.         wmenubegc ();
  295.         wmenuitem ( 1,  1, " Name       ", 0,  1, 0, NULL, 0, 0);
  296.         wmenuitem ( 2,  1, " Alias      ", 0,  2, 0, NULL, 0, 0);
  297.       wmenuitem ( 3,  1, " City       ", 0,  3, 0, NULL, 0, 0);
  298.       wmenuitem ( 3, 43, " First call ", 0,  5, 0, NULL, 0, 0);
  299.  
  300.       if (!otherdata) {
  301.             wmenuitem ( 4,  1, " Password   ", 0,  4, 0, NULL, 0, 0);
  302.          wmenuitem ( 4, 43, " Last call  ", 0,  6, 0, NULL, 0, 0);
  303.          wmenuitem ( 5,  1, " Level      ", 0,  7, 0, NULL, 0, 0);
  304.          wmenuitem ( 5, 26, " Mail scan  ", 0, 19, 0, NULL, 0, 0);
  305.          wmenuitem ( 5, 43, " Archiver   ", 0, 40, 0, NULL, 0, 0);
  306.          wmenuitem ( 6,  1, " A Flags    ", 0,  8, 0, NULL, 0, 0);
  307.          wmenuitem ( 6, 26, " Editor FS  ", 0, 20, 0, NULL, 0, 0);
  308.          wmenuitem ( 6, 43, " Nulls      ", 0, 30, 0, NULL, 0, 0);
  309.          wmenuitem ( 7,  1, " B Flags    ", 0,  9, 0, NULL, 0, 0);
  310.          wmenuitem ( 7, 26, " More?      ", 0, 21, 0, NULL, 0, 0);
  311.          wmenuitem ( 7, 43, " Language   ", 0, 31, 0, NULL, 0, 0);
  312.          wmenuitem ( 8,  1, " C Flags    ", 0, 10, 0, NULL, 0, 0);
  313.          wmenuitem ( 8, 26, " CLS        ", 0, 22, 0, NULL, 0, 0);
  314.          wmenuitem ( 8, 43, " Minutes    ", 0, 32, 0, NULL, 0, 0);
  315.          wmenuitem ( 9,  1, " D Flags    ", 0, 11, 0, NULL, 0, 0);
  316.          wmenuitem ( 9, 26, " Hot keys   ", 0, 23, 0, NULL, 0, 0);
  317.          wmenuitem ( 9, 43, " Credit     ", 0, 33, 0, NULL, 0, 0);
  318.          wmenuitem (10,  1, " Video      ", 0, 12, 0, NULL, 0, 0);
  319.          wmenuitem (10, 26, " Reader FS  ", 0, 24, 0, NULL, 0, 0);
  320.          wmenuitem (10, 43, " Voice pho. ", 0, 34, 0, NULL, 0, 0);
  321.          wmenuitem (11,  1, " └─ Colors  ", 0, 13, 0, NULL, 0, 0);
  322.          wmenuitem (11, 26, " IBM chars. ", 0, 25, 0, NULL, 0, 0);
  323.          wmenuitem (11, 43, " Data phone ", 0, 35, 0, NULL, 0, 0);
  324.          wmenuitem (12,  1, " Calls #    ", 0, 14, 0, NULL, 0, 0);
  325.          wmenuitem (12, 26, " Hidden     ", 0, 26, 0, NULL, 0, 0);
  326.          wmenuitem (12, 43, " Birthdate  ", 0, 36, 0, NULL, 0, 0);
  327.          wmenuitem (13,  1, " Last Msg.  ", 0, 17, 0, NULL, 0, 0);
  328.          wmenuitem (13, 26, " No kill    ", 0, 27, 0, NULL, 0, 0);
  329.          wmenuitem (13, 43, " Expiration ", 0, 37, 0, NULL, 0, 0);
  330.          wmenuitem (14,  1, " Last File  ", 0, 18, 0, NULL, 0, 0);
  331.          wmenuitem (14, 26, " Priority   ", 0, 28, 0, NULL, 0, 0);
  332.          wmenuitem (14, 43, " Length     ", 0, 38, 0, NULL, 0, 0);
  333.          wmenuitem (15, 43, " Width      ", 0, 39, 0, NULL, 0, 0);
  334.          wmenuitem (15, 26, " File box   ", 0, 29, 0, NULL, 0, 0);
  335.          wmenuitem (15,  1, " Protocol   ", 0, 41, 0, NULL, 0, 0);
  336.             wmenuitem (16,  1, " Signature  ", 0, 15, 0, NULL, 0, 0);
  337.             wmenuitem (17,  1, " Comment    ", 0, 16, 0, NULL, 0, 0);
  338.       }
  339.       else {
  340.          wmenuitem ( 4,  1, " Pwd change ", 0, 50, 0, NULL, 0, 0);
  341.          wmenuitem ( 5,  1, " UL Kbytes  ", 0, 51, 0, NULL, 0, 0);
  342.          wmenuitem ( 5, 26, " UL Files   ", 0, 52, 0, NULL, 0, 0);
  343.          wmenuitem ( 6,  1, " DL Kbytes  ", 0, 53, 0, NULL, 0, 0);
  344.          wmenuitem ( 6, 26, " DL Files   ", 0, 54, 0, NULL, 0, 0);
  345.          wmenuitem ( 7,  1, " Quiet      ", 0, 55, 0, NULL, 0, 0);
  346.          wmenuitem ( 7, 26, " Time call  ", 0, 56, 0, NULL, 0, 0);
  347.          wmenuitem ( 8,  1, " Nerd       ", 0, 57, 0, NULL, 0, 0);
  348.          wmenuitem ( 8, 26, " Time day   ", 0, 58, 0, NULL, 0, 0);
  349.          wmenuitem ( 9,  1, " No disturb ", 0, 59, 0, NULL, 0, 0);
  350.          wmenuitem ( 9, 26, " DL Limit   ", 0, 60, 0, NULL, 0, 0);
  351.          wmenuitem (10,  1, " Security   ", 0, 61, 0, NULL, 0, 0);
  352.          wmenuitem (10, 26, " DL Ratio   ", 0, 62, 0, NULL, 0, 0);
  353.          wmenuitem (11,  1, " Bad Pwd    ", 0, 63, 0, NULL, 0, 0);
  354.          wmenuitem (11, 26, " Min. speed ", 0, 64, 0, NULL, 0, 0);
  355.          wmenuitem (12,  1, " Kludge     ", 0, 65, 0, NULL, 0, 0);
  356.          wmenuitem (12, 26, " DL Speed   ", 0, 66, 0, NULL, 0, 0);
  357.          wmenuitem (13,  1, " Msg. group ", 0, 67, 0, NULL, 0, 0);
  358.          wmenuitem (13, 26, " Beg. ratio ", 0, 68, 0, NULL, 0, 0);
  359.          wmenuitem (14,  1, " File group ", 0, 69, 0, NULL, 0, 0);
  360.          wmenuitem (15,  1, " Chat mins. ", 0, 71, 0, NULL, 0, 0);
  361.          wmenuitem (15, 26, " Msg Posted ", 0, 72, 0, NULL, 0, 0);
  362.          wmenuitem (16,  1, " TimeBank   ", 0, 73, 0, NULL, 0, 0);
  363.          wmenuitem (16, 26, " FileBank   ", 0, 74, 0, NULL, 0, 0);
  364.          wmenuitem (17,  1, " Last baud  ", 0, 75, 0, NULL, 0, 0);
  365.          wmenuitem (17, 26, " DL Today   ", 0, 76, 0, NULL, 0, 0);
  366.       }
  367.       wmenuend (i, M_OMNI|M_SAVE, 0, 0, LGREY|_BLACK, LGREY|_BLACK, LGREY|_BLACK, BLUE|_LGREY);
  368.  
  369.       wprints ( 2, 43, LGREY|_BLACK, " FBox ID    ");
  370.  
  371.       wprints (1, 14, CYAN|_BLACK, nusr.name);
  372.       wprints (2, 14, CYAN|_BLACK, nusr.handle);
  373.       sprintf (string, "%08lX", nusr.id);
  374.       wprints (2, 56, CYAN|_BLACK, string);
  375.       wprints (3, 14, CYAN|_BLACK, nusr.city);
  376.       wprints (3, 56, CYAN|_BLACK, nusr.firstdate);
  377.  
  378.       if (!otherdata) {
  379.          strcpy (string, "***************");
  380.          string[strlen (nusr.pwd)] = '\0';
  381.          wprints (4, 14, CYAN|_BLACK, string);
  382.          wprints (4, 56, CYAN|_BLACK, nusr.ldate);
  383.          wprints (5, 13, CYAN|_BLACK, get_priv_text (nusr.priv));
  384.          wprints (5, 39, CYAN|_BLACK, nusr.scanmail ? "Yes" : "No");
  385.          for (m = 0; m < 10; m++) {
  386.             if (!config.packid[m].display[0])
  387.                continue;
  388.             if (toupper (config.packid[m].display[0]) == toupper (nusr.archiver))
  389.                break;
  390.          }
  391.          wprints (5, 56, CYAN|_BLACK, (m < 10) ? &config.packid[m].display[1] : "None");
  392.          wprints (6, 14, CYAN|_BLACK, get_flagA_text ((nusr.flags >> 24) & 0xFF));
  393.          wprints (6, 39, CYAN|_BLACK, !nusr.use_lore ? "Yes" : "No");
  394.          sprintf (string, "%d", nusr.nulls);
  395.          wprints (6, 56, CYAN|_BLACK, string);
  396.          wprints (7, 14, CYAN|_BLACK, get_flagB_text ((nusr.flags >> 16) & 0xFF));
  397.          wprints (7, 39, CYAN|_BLACK, nusr.more ? "Yes" : "No");
  398.          if (!config.language[nusr.language].descr[0])
  399.             nusr.language = 0;
  400.          wprints (7, 56, CYAN|_BLACK, &config.language[nusr.language].descr[1]);
  401.          wprints (8, 14, CYAN|_BLACK, get_flagC_text ((nusr.flags >> 8) & 0xFF));
  402.          wprints (8, 39, CYAN|_BLACK, nusr.formfeed ? "Yes" : "No");
  403.          sprintf (string, "%d", nusr.time);
  404.          wprints (8, 56, CYAN|_BLACK, string);
  405.          wprints (9, 14, CYAN|_BLACK, get_flagD_text (nusr.flags & 0xFF));
  406.          wprints (9, 39, CYAN|_BLACK, nusr.hotkey ? "Yes" : "No");
  407.          sprintf (string, "%d", nusr.credit);
  408.          wprints (9, 56, CYAN|_BLACK, string);
  409.          if (nusr.ansi)
  410.             wprints (10, 14, CYAN|_BLACK, "Ansi");
  411.          else if (nusr.avatar)
  412.             wprints (10, 14, CYAN|_BLACK, "Avatar");
  413.          else
  414.             wprints (10, 14, CYAN|_BLACK, "TTY");
  415.          wprints (10, 39, CYAN|_BLACK, nusr.full_read ? "Yes" : "No");
  416.          wprints (10, 56, CYAN|_BLACK, nusr.voicephone);
  417.          wprints (11, 14, CYAN|_BLACK, nusr.color ? "Yes" : "No");
  418.          wprints (11, 39, CYAN|_BLACK, nusr.ibmset ? "Yes" : "No");
  419.          wprints (11, 56, CYAN|_BLACK, nusr.dataphone);
  420.          sprintf (string, "%ld", nusr.times);
  421.          wprints (12, 14, CYAN|_BLACK, string);
  422.          wprints (12, 39, CYAN|_BLACK, nusr.usrhidden ? "Yes" : "No");
  423.          wprints (12, 56, CYAN|_BLACK, nusr.birthdate);
  424.          sprintf (string, "%u", nusr.msg);
  425.          wprints (13, 14, CYAN|_BLACK, string);
  426.          wprints (13, 39, CYAN|_BLACK, nusr.nokill ? "Yes" : "No");
  427.          wprints (13, 56, CYAN|_BLACK, nusr.subscrdate);
  428.          sprintf (string, "%u", nusr.files);
  429.          wprints (14, 14, CYAN|_BLACK, string);
  430.          wprints (14, 39, CYAN|_BLACK, nusr.xfer_prior ? "Yes" : "No");
  431.          sprintf (string, "%d", nusr.len);
  432.          wprints (14, 56, CYAN|_BLACK, string);
  433.          sprintf (string, "%d", nusr.width);
  434.          wprints (15, 56, CYAN|_BLACK, string);
  435.          wprints (15, 39, CYAN|_BLACK, nusr.havebox ? "Yes" : "No");
  436.          sprintf (string, "%c", nusr.protocol);
  437.          wprints (15, 14, CYAN|_BLACK, string);
  438.             wprints (16, 14, CYAN|_BLACK, nusr.signature);
  439.             wprints (17, 14, CYAN|_BLACK, nusr.comment);
  440.       }
  441.       else {
  442.          wprints ( 4, 14, CYAN|_BLACK, nusr.lastpwdchange);
  443.          sprintf (string, "%lu", nusr.upld);
  444.          wprints ( 5, 14, CYAN|_BLACK, string);
  445.          sprintf (string, "%u", nusr.n_upld);
  446.          wprints ( 5, 39, CYAN|_BLACK, string);
  447.          sprintf (string, "%lu", nusr.dnld);
  448.          wprints ( 6, 14, CYAN|_BLACK, string);
  449.          sprintf (string, "%u", nusr.n_dnld);
  450.          wprints ( 6, 39, CYAN|_BLACK, string);
  451.          wprints ( 7, 14, CYAN|_BLACK, nusr.quiet ? "Yes" : "No");
  452.          sprintf (string, "%u", nusr.ovr_class.max_call);
  453.          wprints ( 7, 39, CYAN|_BLACK, string);
  454.          wprints ( 8, 14, CYAN|_BLACK, nusr.nerd ? "Yes" : "No");
  455.          sprintf (string, "%u", nusr.ovr_class.max_time);
  456.          wprints ( 8, 39, CYAN|_BLACK, string);
  457.          wprints ( 9, 14, CYAN|_BLACK, nusr.donotdisturb ? "Yes" : "No");
  458.          sprintf (string, "%u", nusr.ovr_class.max_dl);
  459.          wprints ( 9, 39, CYAN|_BLACK, string);
  460.          wprints (10, 14, CYAN|_BLACK, nusr.security ? "Yes" : "No");
  461.          sprintf (string, "%u", nusr.ovr_class.ratio);
  462.          wprints (10, 39, CYAN|_BLACK, string);
  463.          wprints (11, 14, CYAN|_BLACK, nusr.badpwd ? "Yes" : "No");
  464.          sprintf (string, "%u", nusr.ovr_class.min_baud);
  465.          wprints (11, 39, CYAN|_BLACK, string);
  466.          wprints (12, 14, CYAN|_BLACK, nusr.kludge ? "Yes" : "No");
  467.          sprintf (string, "%u", nusr.ovr_class.min_file_baud);
  468.          wprints (12, 39, CYAN|_BLACK, string);
  469.          sprintf (string, "%u", nusr.msg_sig);
  470.          wprints (13, 14, CYAN|_BLACK, string);
  471.          sprintf (string, "%u", nusr.ovr_class.start_ratio);
  472.          wprints (13, 39, CYAN|_BLACK, string);
  473.          sprintf (string, "%u", nusr.file_sig);
  474.          wprints (14, 14, CYAN|_BLACK, string);
  475.          sprintf (string, "%u", nusr.chat_minutes);
  476.          wprints (15, 14, CYAN|_BLACK, string);
  477.          sprintf (string, "%u", nusr.msgposted);
  478.          wprints (15, 39, CYAN|_BLACK, string);
  479.          sprintf (string, "%u", nusr.account);
  480.          wprints (16, 14, CYAN|_BLACK, string);
  481.          sprintf (string, "%u", nusr.f_account);
  482.          wprints (16, 39, CYAN|_BLACK, string);
  483.          sprintf (string, "%lu", nusr.baud_rate);
  484.          wprints (17, 14, CYAN|_BLACK, string);
  485.          sprintf (string, "%u", nusr.dnldl);
  486.          wprints (17, 39, CYAN|_BLACK, string);
  487.       }
  488.  
  489.       if (nusr.deleted)
  490.          wprints (1, 62, WHITE|_BLACK, "* DELETED *");
  491.  
  492.       start_update ();
  493.  
  494.       i = wmenuget ();
  495.  
  496.       switch (i) {
  497.          case 1:
  498.             strcpy (string, nusr.name);
  499.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  500.             winpdef (1, 14, string, "???????????????????????????????????", 0, 2, NULL, 0);
  501.             if (winpread () != W_ESCPRESS) {
  502.                strcode (nusr.pwd, nusr.name);
  503.                strcpy (nusr.name, strbtrim (string));
  504.                strcode (nusr.pwd, nusr.name);
  505.                nusr.id = crc_name (nusr.name);
  506.                nusr.alias_id = crc_name (nusr.handle);
  507.             }
  508.             break;
  509.  
  510.          case 2:
  511.             strcpy (string, nusr.handle);
  512.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  513.             winpdef (2, 14, string, "???????????????????????????????????", 0, 2, NULL, 0);
  514.             if (winpread () != W_ESCPRESS)
  515.                strcpy (nusr.handle, strbtrim (string));
  516.             break;
  517.  
  518.          case 3:
  519.             strcpy (string, nusr.city);
  520.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  521.             winpdef (3, 14, string, "?????????????????????????", 0, 2, NULL, 0);
  522.             if (winpread () != W_ESCPRESS)
  523.                strcpy (nusr.city, strbtrim (string));
  524.             break;
  525.  
  526.          case 4:
  527.             strcode (nusr.pwd, nusr.name);
  528.             strcpy (string, strupr (nusr.pwd));
  529.             strcode (nusr.pwd, nusr.name);
  530.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  531.             winpdef (4, 14, string, "???????????????", 0, 2, NULL, 0);
  532.             if (winpread () != W_ESCPRESS) {
  533.                strcpy (nusr.pwd, strupr (strbtrim (string)));
  534.                strcode (nusr.pwd, nusr.name);
  535.             }
  536.             break;
  537.  
  538.          case 5:
  539.             strcpy (string, nusr.firstdate);
  540.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  541.             winpdef (3, 56, string, "???????????????????", 0, 2, NULL, 0);
  542.             if (winpread () != W_ESCPRESS)
  543.                strcpy (nusr.firstdate, strbtrim (string));
  544.             break;
  545.  
  546.          case 6:
  547.             strcpy (string, nusr.ldate);
  548.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  549.             winpdef (4, 56, string, "???????????????????", 0, 2, NULL, 0);
  550.             if (winpread () != W_ESCPRESS)
  551.                strcpy (nusr.ldate, strbtrim (string));
  552.             break;
  553.  
  554.          case 7:
  555.             nusr.priv = select_level (nusr.priv, 47, 4);
  556.             break;
  557.  
  558.          case 8:
  559.             nusr.flags = window_get_flags (6, 46, 1, nusr.flags);
  560.             break;
  561.  
  562.          case 9:
  563.             nusr.flags = window_get_flags (6, 46, 2, nusr.flags);
  564.             break;
  565.  
  566.          case 10:
  567.             nusr.flags = window_get_flags (6, 46, 3, nusr.flags);
  568.             break;
  569.  
  570.          case 11:
  571.             nusr.flags = window_get_flags (6, 46, 4, nusr.flags);
  572.             break;
  573.  
  574.          case 12:
  575.             if (nusr.ansi) {
  576.                nusr.ansi = 0;
  577.                nusr.avatar = 1;
  578.             }
  579.             else if (nusr.avatar)
  580.                nusr.avatar = 0;
  581.             else
  582.                nusr.ansi = 1;
  583.             break;
  584.  
  585.          case 13:
  586.             nusr.color ^= 1;
  587.             break;
  588.  
  589.          case 14:
  590.             sprintf (string, "%ld", nusr.times);
  591.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  592.             winpdef (12, 14, string, "???????", 0, 2, NULL, 0);
  593.             if (winpread () != W_ESCPRESS)
  594.                nusr.times = atol (string);
  595.             break;
  596.  
  597.          case 15:
  598.                 strcpy (string, nusr.signature);
  599.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  600.                 winpdef (16, 14, string, "?????????????????????????????????????????????????????????", 0, 2, NULL, 0);
  601.                 if (winpread () != W_ESCPRESS)
  602.                     strcpy (nusr.signature, strbtrim (string));
  603.                 break;
  604.  
  605.             case 16:
  606.                 strcpy (string, nusr.comment);
  607.                 winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  608.                 winpdef (17, 14, string, "???????????????????????????????????????????????????????????", 0, 2, NULL, 0);
  609.             if (winpread () != W_ESCPRESS)
  610.                strcpy (nusr.comment, strbtrim (string));
  611.             break;
  612.  
  613.          case 17:
  614.             sprintf (string, "%d", nusr.msg);
  615.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  616.             winpdef (13, 14, string, "?????", 0, 2, NULL, 0);
  617.             if (winpread () != W_ESCPRESS)
  618.                nusr.msg = atoi (string);
  619.             break;
  620.  
  621.          case 18:
  622.             sprintf (string, "%d", nusr.files);
  623.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  624.             winpdef (14, 14, string, "?????", 0, 2, NULL, 0);
  625.             if (winpread () != W_ESCPRESS)
  626.                nusr.files = atoi (string);
  627.             break;
  628.  
  629.          case 19:
  630.             nusr.scanmail ^= 1;
  631.             break;
  632.  
  633.          case 20:
  634.             nusr.use_lore ^= 1;
  635.             break;
  636.  
  637.          case 21:
  638.             nusr.more ^= 1;
  639.             break;
  640.  
  641.          case 22:
  642.             nusr.formfeed ^= 1;
  643.             break;
  644.  
  645.          case 23:
  646.             nusr.hotkey ^= 1;
  647.             break;
  648.  
  649.          case 24:
  650.             nusr.full_read ^= 1;
  651.             break;
  652.  
  653.          case 25:
  654.             nusr.ibmset ^= 1;
  655.             break;
  656.  
  657.          case 26:
  658.             nusr.usrhidden ^= 1;
  659.             break;
  660.  
  661.          case 27:
  662.             nusr.nokill ^= 1;
  663.             break;
  664.  
  665.          case 28:
  666.             nusr.xfer_prior ^= 1;
  667.             break;
  668.  
  669.          case 29:
  670.             nusr.havebox ^= 1;
  671.             break;
  672.  
  673.          case 30:
  674.             sprintf (string, "%d", nusr.nulls);
  675.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  676.             winpdef (6, 56, string, "?????", 0, 2, NULL, 0);
  677.             if (winpread () != W_ESCPRESS)
  678.                nusr.nulls = atoi (string);
  679.             break;
  680.  
  681.          case 31:
  682.             edit_language (&nusr);
  683.             break;
  684.  
  685.          case 32:
  686.             sprintf (string, "%d", nusr.time);
  687.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  688.             winpdef (8, 56, string, "?????", 0, 2, NULL, 0);
  689.             if (winpread () != W_ESCPRESS)
  690.                nusr.time = atoi (string);
  691.             break;
  692.  
  693.          case 33:
  694.             sprintf (string, "%d", nusr.credit);
  695.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  696.             winpdef (9, 56, string, "?????", 0, 2, NULL, 0);
  697.             if (winpread () != W_ESCPRESS)
  698.                nusr.credit = atoi (string);
  699.             break;
  700.  
  701.          case 34:
  702.             sprintf (string, "%s", nusr.voicephone);
  703.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  704.             winpdef (10, 56, string, "???????????????????", 0, 2, NULL, 0);
  705.             if (winpread () != W_ESCPRESS)
  706.                strcpy (nusr.voicephone, strbtrim (string));
  707.             break;
  708.  
  709.          case 35:
  710.             sprintf (string, "%s", nusr.dataphone);
  711.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  712.             winpdef (11, 56, string, "???????????????????", 0, 2, NULL, 0);
  713.             if (winpread () != W_ESCPRESS)
  714.                strcpy (nusr.dataphone, strbtrim (string));
  715.             break;
  716.  
  717.          case 36:
  718.             sprintf (string, "%s", nusr.birthdate);
  719.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  720.             winpdef (12, 56, string, "?????????", 0, 2, NULL, 0);
  721.             if (winpread () != W_ESCPRESS)
  722.                strcpy (nusr.birthdate, strbtrim (string));
  723.             break;
  724.  
  725.          case 37:
  726.             sprintf (string, "%s", nusr.subscrdate);
  727.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  728.             winpdef (13, 56, string, "?????????", 0, 2, NULL, 0);
  729.             if (winpread () != W_ESCPRESS)
  730.                strcpy (nusr.subscrdate, strbtrim (string));
  731.             break;
  732.  
  733.          case 38:
  734.             sprintf (string, "%d", nusr.len);
  735.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  736.             winpdef (14, 56, string, "???", 0, 2, NULL, 0);
  737.             if (winpread () != W_ESCPRESS)
  738.                nusr.len = atoi (string);
  739.             break;
  740.  
  741.          case 39:
  742.             sprintf (string, "%d", nusr.width);
  743.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  744.             winpdef (15, 56, string, "???", 0, 2, NULL, 0);
  745.             if (winpread () != W_ESCPRESS)
  746.                nusr.width = atoi (string);
  747.             break;
  748.  
  749.          case 40:
  750.             edit_archiver (&nusr);
  751.             break;
  752.  
  753.          case 41:
  754.             sprintf (string, "%c", nusr.protocol);
  755.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  756.             winpdef (15, 14, string, "?", 0, 2, NULL, 0);
  757.             if (winpread () != W_ESCPRESS)
  758.                nusr.protocol = toupper (string[0]);
  759.             break;
  760.  
  761.          case 50:
  762.             strcpy (string, nusr.lastpwdchange);
  763.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  764.             winpdef (4, 14, string, "???????????????????", 0, 2, NULL, 0);
  765.             if (winpread () != W_ESCPRESS)
  766.                strcpy (nusr.lastpwdchange, strbtrim (string));
  767.             break;
  768.  
  769.          case 51:
  770.             sprintf (string, "%lu", nusr.upld);
  771.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  772.             winpdef (5, 14, string, "???????", 0, 2, NULL, 0);
  773.             if (winpread () != W_ESCPRESS)
  774.                nusr.upld = atol (string);
  775.             break;
  776.  
  777.          case 52:
  778.             sprintf (string, "%u", nusr.n_upld);
  779.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  780.             winpdef (5, 39, string, "?????", 0, 2, NULL, 0);
  781.             if (winpread () != W_ESCPRESS)
  782.                nusr.n_upld = atoi (string);
  783.             break;
  784.  
  785.          case 53:
  786.             sprintf (string, "%lu", nusr.dnld);
  787.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  788.             winpdef (6, 14, string, "???????", 0, 2, NULL, 0);
  789.             if (winpread () != W_ESCPRESS)
  790.                nusr.dnld = atol (string);
  791.             break;
  792.  
  793.          case 54:
  794.             sprintf (string, "%u", nusr.n_dnld);
  795.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  796.             winpdef (6, 39, string, "?????", 0, 2, NULL, 0);
  797.             if (winpread () != W_ESCPRESS)
  798.                nusr.n_dnld = atoi (string);
  799.             break;
  800.  
  801.          case 55:
  802.             nusr.quiet ^= 1;
  803.             break;
  804.  
  805.          case 56:
  806.             sprintf (string, "%u", nusr.ovr_class.max_call);
  807.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  808.             winpdef (7, 39, string, "?????", 0, 2, NULL, 0);
  809.             if (winpread () != W_ESCPRESS)
  810.                nusr.ovr_class.max_call = atoi (string);
  811.             break;
  812.  
  813.          case 57:
  814.             nusr.nerd ^= 1;
  815.             break;
  816.  
  817.          case 58:
  818.             sprintf (string, "%u", nusr.ovr_class.max_time);
  819.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  820.             winpdef (8, 39, string, "?????", 0, 2, NULL, 0);
  821.             if (winpread () != W_ESCPRESS)
  822.                nusr.ovr_class.max_time = atoi (string);
  823.             break;
  824.  
  825.          case 59:
  826.             nusr.donotdisturb ^= 1;
  827.             break;
  828.  
  829.          case 60:
  830.             sprintf (string, "%u", nusr.ovr_class.max_dl);
  831.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  832.             winpdef (9, 39, string, "?????", 0, 2, NULL, 0);
  833.             if (winpread () != W_ESCPRESS)
  834.                nusr.ovr_class.max_dl = atoi (string);
  835.             break;
  836.  
  837.          case 61:
  838.             nusr.security ^= 1;
  839.             break;
  840.  
  841.          case 62:
  842.             sprintf (string, "%u", nusr.ovr_class.ratio);
  843.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  844.             winpdef (10, 39, string, "?????", 0, 2, NULL, 0);
  845.             if (winpread () != W_ESCPRESS)
  846.                nusr.ovr_class.ratio = atoi (string);
  847.             break;
  848.  
  849.          case 63:
  850.             nusr.badpwd ^= 1;
  851.             break;
  852.  
  853.          case 64:
  854.             sprintf (string, "%u", nusr.ovr_class.min_baud);
  855.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  856.             winpdef (11, 39, string, "?????", 0, 2, NULL, 0);
  857.             if (winpread () != W_ESCPRESS)
  858.                nusr.ovr_class.min_baud = atoi (string);
  859.             break;
  860.  
  861.          case 65:
  862.             nusr.kludge ^= 1;
  863.             break;
  864.  
  865.          case 66:
  866.             sprintf (string, "%u", nusr.ovr_class.min_file_baud);
  867.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  868.             winpdef (12, 39, string, "?????", 0, 2, NULL, 0);
  869.             if (winpread () != W_ESCPRESS)
  870.                nusr.ovr_class.min_file_baud = atoi (string);
  871.             break;
  872.  
  873.          case 67:
  874.             sprintf (string, "%u", nusr.msg_sig);
  875.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  876.             winpdef (13, 14, string, "?????", 0, 2, NULL, 0);
  877.             if (winpread () != W_ESCPRESS)
  878.                nusr.msg_sig = atoi (string);
  879.             break;
  880.  
  881.          case 68:
  882.             sprintf (string, "%u", nusr.ovr_class.start_ratio);
  883.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  884.             winpdef (13, 39, string, "?????", 0, 2, NULL, 0);
  885.             if (winpread () != W_ESCPRESS)
  886.                nusr.ovr_class.start_ratio = atoi (string);
  887.             break;
  888.  
  889.          case 69:
  890.             sprintf (string, "%u", nusr.file_sig);
  891.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  892.             winpdef (14, 14, string, "?????", 0, 2, NULL, 0);
  893.             if (winpread () != W_ESCPRESS)
  894.                nusr.file_sig = atoi (string);
  895.             break;
  896.  
  897.          case 71:
  898.             sprintf (string, "%u", nusr.chat_minutes);
  899.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  900.             winpdef (15, 14, string, "?????", 0, 2, NULL, 0);
  901.             if (winpread () != W_ESCPRESS)
  902.                nusr.chat_minutes = atoi (string);
  903.             break;
  904.  
  905.          case 72:
  906.             sprintf (string, "%u", nusr.msgposted);
  907.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  908.             winpdef (15, 39, string, "?????", 0, 2, NULL, 0);
  909.             if (winpread () != W_ESCPRESS)
  910.                nusr.msgposted = atoi (string);
  911.             break;
  912.  
  913.          case 73:
  914.             sprintf (string, "%u", nusr.account);
  915.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  916.             winpdef (16, 14, string, "?????", 0, 2, NULL, 0);
  917.             if (winpread () != W_ESCPRESS)
  918.                nusr.account = atoi (string);
  919.             break;
  920.  
  921.          case 74:
  922.             sprintf (string, "%u", nusr.f_account);
  923.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  924.             winpdef (16, 39, string, "?????", 0, 2, NULL, 0);
  925.             if (winpread () != W_ESCPRESS)
  926.                nusr.f_account = atoi (string);
  927.             break;
  928.  
  929.          case 75:
  930.             sprintf (string, "%lu", nusr.baud_rate);
  931.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  932.             winpdef (17, 14, string, "?????", 0, 2, NULL, 0);
  933.             if (winpread () != W_ESCPRESS)
  934.                nusr.baud_rate = atol (string);
  935.             break;
  936.  
  937.          case 76:
  938.             sprintf (string, "%u", nusr.dnldl);
  939.             winpbeg (BLUE|_GREEN, BLUE|_GREEN);
  940.             winpdef (17, 39, string, "?????", 0, 2, NULL, 0);
  941.             if (winpread () != W_ESCPRESS)
  942.                nusr.dnldl = atoi (string);
  943.             break;
  944.       }
  945.  
  946.       hidecur ();
  947.    } while (i != -1);
  948.  
  949.    if (memcmp ((char *)&nusr, (char *)usr, sizeof (struct _usr))) {
  950.       wh1 = wopen (10, 25, 14, 54, 0, BLACK|_LGREY, BLACK|_LGREY);
  951.       wactiv (wh1);
  952.       wshadow (DGREY|_BLACK);
  953.  
  954.       wcenters (1, BLACK|_LGREY, "Save changes (Y/n) ?  ");
  955.  
  956.       strcpy (string, "Y");
  957.       winpbeg (BLACK|_LGREY, BLACK|_LGREY);
  958.       winpdef (1, 24, string, "?", 0, 2, NULL, 0);
  959.  
  960.       i = winpread ();
  961.       wclose ();
  962.       hidecur ();
  963.  
  964.       if (i == W_ESCPRESS)
  965.          goto continue_editing;
  966.  
  967.       if (toupper (string[0]) == 'Y')
  968.          memcpy ((char *)usr, (char *)&nusr, sizeof (struct _usr));
  969.     }
  970.  
  971.     gotoxy_ (24, 1);
  972.     clreol_ ();
  973.     prints (24, 1, LGREY|_BLACK, "PgUp/PgDn-Next/Previous  E-Edit  A-Add New User  L-List  D-Delete  O-Other");
  974.     prints (24, 1, YELLOW|_BLACK, "PgUp/PgDn");
  975.     prints (24, 26, YELLOW|_BLACK, "E");
  976.     prints (24, 34, YELLOW|_BLACK, "A");
  977.     prints (24, 50, YELLOW|_BLACK, "L");
  978.     prints (24, 58, YELLOW|_BLACK, "D");
  979.     prints (24, 68, YELLOW|_BLACK, "O");
  980. }
  981.  
  982. void manager_users (void)
  983. {
  984.     int fd, fdidx, wh, i = 1, readed = 1, m;
  985.     char string[128];
  986.     struct _usr usr;
  987.     struct _usridx usridx;
  988.  
  989.     sprintf (string, "%s.BBS", config.user_file);
  990.     fd = sh_open (string, SH_DENYNONE, O_RDWR|O_CREAT|O_BINARY, S_IREAD|S_IWRITE);
  991.     if (fd == -1)
  992.         return;
  993.  
  994.     sprintf (string, "%s.IDX", config.user_file);
  995.     fdidx = sh_open (string, SH_DENYNONE, O_RDWR|O_CREAT|O_BINARY, S_IREAD|S_IWRITE);
  996.     if (fdidx == -1)
  997.         return;
  998.  
  999.     memset ((char *)&usr, 0, sizeof (struct _usr));
  1000.     if (read (fd, &usr, sizeof (struct _usr)) < sizeof (struct _usr))
  1001.         readed = 0;
  1002.     else
  1003.         read (fdidx, &usridx, sizeof (struct _usridx));
  1004.  
  1005.     gotoxy_ (24, 1);
  1006.     clreol_ ();
  1007.     prints (24, 1, LGREY|_BLACK, "PgUp/PgDn-Next/Previous  E-Edit  A-Add New User  L-List  D-Delete  O-Other");
  1008.     prints (24, 1, YELLOW|_BLACK, "PgUp/PgDn");
  1009.     prints (24, 26, YELLOW|_BLACK, "E");
  1010.     prints (24, 34, YELLOW|_BLACK, "A");
  1011.     prints (24, 50, YELLOW|_BLACK, "L");
  1012.     prints (24, 58, YELLOW|_BLACK, "D");
  1013.     prints (24, 68, YELLOW|_BLACK, "O");
  1014.  
  1015.     wh = wopen (2, 0, 22, 77, 1, LCYAN|_BLACK, CYAN|_BLACK);
  1016.     wactiv (wh);
  1017.     wshadow (DGREY|_BLACK);
  1018.     wtitle (" Users ", TRIGHT, YELLOW|_BLUE);
  1019.  
  1020.    otherdata = 0;
  1021.  
  1022.    do {
  1023.       stop_update ();
  1024.       wclear ();
  1025.  
  1026.       wprints ( 1,  1, LGREY|_BLACK, " Name       ");
  1027.       wprints ( 2,  1, LGREY|_BLACK, " Alias      ");
  1028.       wprints ( 2, 43, LGREY|_BLACK, " FBox ID    ");
  1029.       wprints ( 3,  1, LGREY|_BLACK, " City       ");
  1030.       wprints ( 3, 43, LGREY|_BLACK, " First call ");
  1031.  
  1032.       if (readed) {
  1033.          wprints (1, 14, CYAN|_BLACK, usr.name);
  1034.          wprints (2, 14, CYAN|_BLACK, usr.handle);
  1035.          sprintf (string, "%08lX", usr.id);
  1036.          wprints (2, 56, CYAN|_BLACK, string);
  1037.          wprints (3, 14, CYAN|_BLACK, usr.city);
  1038.          wprints (3, 56, CYAN|_BLACK, usr.firstdate);
  1039.       }
  1040.  
  1041.       if (!otherdata) {
  1042.             wprints ( 4,  1, LGREY|_BLACK, " Password   ");
  1043.          wprints ( 4, 43, LGREY|_BLACK, " Last call  ");
  1044.          wprints ( 5,  1, LGREY|_BLACK, " Level      ");
  1045.          wprints ( 5, 26, LGREY|_BLACK, " Mail scan  ");
  1046.          wprints ( 5, 43, LGREY|_BLACK, " Archiver   ");
  1047.          wprints ( 6,  1, LGREY|_BLACK, " A Flags    ");
  1048.          wprints ( 6, 26, LGREY|_BLACK, " Editor FS  ");
  1049.          wprints ( 6, 43, LGREY|_BLACK, " Nulls      ");
  1050.          wprints ( 7,  1, LGREY|_BLACK, " B Flags    ");
  1051.          wprints ( 7, 26, LGREY|_BLACK, " More?      ");
  1052.          wprints ( 7, 43, LGREY|_BLACK, " Language   ");
  1053.          wprints ( 8,  1, LGREY|_BLACK, " C Flags    ");
  1054.          wprints ( 8, 26, LGREY|_BLACK, " CLS        ");
  1055.          wprints ( 8, 43, LGREY|_BLACK, " Minutes    ");
  1056.          wprints ( 9,  1, LGREY|_BLACK, " D Flags    ");
  1057.          wprints ( 9, 26, LGREY|_BLACK, " Hot keys   ");
  1058.          wprints ( 9, 43, LGREY|_BLACK, " Credit     ");
  1059.          wprints (10,  1, LGREY|_BLACK, " Video      ");
  1060.          wprints (10, 26, LGREY|_BLACK, " Reader FS  ");
  1061.          wprints (10, 43, LGREY|_BLACK, " Voice pho. ");
  1062.          wprints (11,  1, LGREY|_BLACK, " └─ Colors  ");
  1063.          wprints (11, 26, LGREY|_BLACK, " IBM chars. ");
  1064.          wprints (11, 43, LGREY|_BLACK, " Data phone ");
  1065.          wprints (12,  1, LGREY|_BLACK, " Calls #    ");
  1066.          wprints (12, 26, LGREY|_BLACK, " Hidden     ");
  1067.          wprints (12, 43, LGREY|_BLACK, " Birthdate  ");
  1068.          wprints (13,  1, LGREY|_BLACK, " Last Msg.  ");
  1069.          wprints (13, 26, LGREY|_BLACK, " No kill    ");
  1070.          wprints (13, 43, LGREY|_BLACK, " Expiration ");
  1071.          wprints (14,  1, LGREY|_BLACK, " Last File  ");
  1072.          wprints (14, 26, LGREY|_BLACK, " Priority   ");
  1073.          wprints (14, 43, LGREY|_BLACK, " Length     ");
  1074.          wprints (15, 43, LGREY|_BLACK, " Width      ");
  1075.          wprints (15, 26, LGREY|_BLACK, " File box   ");
  1076.          wprints (15,  1, LGREY|_BLACK, " Protocol   ");
  1077.             wprints (16,  1, LGREY|_BLACK, " Signature  ");
  1078.             wprints (17,  1, LGREY|_BLACK, " Comment    ");
  1079.  
  1080.             if (readed) {
  1081.                 strcpy (string, "***************");
  1082.                 string[strlen (usr.pwd)] = '\0';
  1083.                 wprints (4, 14, CYAN|_BLACK, string);
  1084.                 wprints (4, 56, CYAN|_BLACK, usr.ldate);
  1085.                 wprints (5, 13, CYAN|_BLACK, get_priv_text (usr.priv));
  1086.                 wprints (5, 39, CYAN|_BLACK, usr.scanmail ? "Yes" : "No");
  1087.                 for (m = 0; m < 10; m++) {
  1088.                     if (!config.packid[m].display[0])
  1089.                         continue;
  1090.                     if (toupper (config.packid[m].display[0]) == toupper (usr.archiver))
  1091.                         break;
  1092.                 }
  1093.                 wprints (5, 56, CYAN|_BLACK, (m < 10) ? &config.packid[m].display[1] : "None");
  1094.                 wprints (6, 14, CYAN|_BLACK, get_flagA_text ((usr.flags >> 24) & 0xFF));
  1095.                 wprints (6, 39, CYAN|_BLACK, !usr.use_lore ? "Yes" : "No");
  1096.                 sprintf (string, "%d", usr.nulls);
  1097.                 wprints (6, 56, CYAN|_BLACK, string);
  1098.                 wprints (7, 14, CYAN|_BLACK, get_flagB_text ((usr.flags >> 16) & 0xFF));
  1099.                 wprints (7, 39, CYAN|_BLACK, usr.more ? "Yes" : "No");
  1100.                 if (!config.language[usr.language].descr[0])
  1101.                     usr.language = 0;
  1102.                 wprints (7, 56, CYAN|_BLACK, &config.language[usr.language].descr[1]);
  1103.                 wprints (8, 14, CYAN|_BLACK, get_flagC_text ((usr.flags >> 8) & 0xFF));
  1104.                 wprints (8, 39, CYAN|_BLACK, usr.formfeed ? "Yes" : "No");
  1105.                 sprintf (string, "%d", usr.time);
  1106.                 wprints (8, 56, CYAN|_BLACK, string);
  1107.                 wprints (9, 14, CYAN|_BLACK, get_flagD_text (usr.flags & 0xFF));
  1108.                 wprints (9, 39, CYAN|_BLACK, usr.hotkey ? "Yes" : "No");
  1109.                 sprintf (string, "%d", usr.credit);
  1110.                 wprints (9, 56, CYAN|_BLACK, string);
  1111.                 if (usr.ansi)
  1112.                     wprints (10, 14, CYAN|_BLACK, "Ansi");
  1113.                 else if (usr.avatar)
  1114.                     wprints (10, 14, CYAN|_BLACK, "Avatar");
  1115.                 else
  1116.                     wprints (10, 14, CYAN|_BLACK, "TTY");
  1117.                 wprints (10, 39, CYAN|_BLACK, usr.full_read ? "Yes" : "No");
  1118.                 wprints (10, 56, CYAN|_BLACK, usr.voicephone);
  1119.                 wprints (11, 14, CYAN|_BLACK, usr.color ? "Yes" : "No");
  1120.                 wprints (11, 39, CYAN|_BLACK, usr.ibmset ? "Yes" : "No");
  1121.                 wprints (11, 56, CYAN|_BLACK, usr.dataphone);
  1122.                 sprintf (string, "%ld", usr.times);
  1123.                 wprints (12, 14, CYAN|_BLACK, string);
  1124.                 wprints (12, 39, CYAN|_BLACK, usr.usrhidden ? "Yes" : "No");
  1125.                 wprints (12, 56, CYAN|_BLACK, usr.birthdate);
  1126.                 sprintf (string, "%u", usr.msg);
  1127.                 wprints (13, 14, CYAN|_BLACK, string);
  1128.                 wprints (13, 39, CYAN|_BLACK, usr.nokill ? "Yes" : "No");
  1129.                 wprints (13, 56, CYAN|_BLACK, usr.subscrdate);
  1130.                 sprintf (string, "%u", usr.files);
  1131.                 wprints (14, 14, CYAN|_BLACK, string);
  1132.                 wprints (14, 39, CYAN|_BLACK, usr.xfer_prior ? "Yes" : "No");
  1133.                 sprintf (string, "%d", usr.len);
  1134.                 wprints (14, 56, CYAN|_BLACK, string);
  1135.                 sprintf (string, "%d", usr.width);
  1136.                 wprints (15, 56, CYAN|_BLACK, string);
  1137.                 wprints (15, 39, CYAN|_BLACK, usr.havebox ? "Yes" : "No");
  1138.                 sprintf (string, "%c", usr.protocol);
  1139.                 wprints (15, 14, CYAN|_BLACK, string);
  1140.                 wprints (16, 14, CYAN|_BLACK, usr.signature);
  1141.                 wprints (17, 14, CYAN|_BLACK, usr.comment);
  1142.  
  1143.                 if (usr.deleted)
  1144.                     wprints (1, 62, WHITE|_BLACK, "* DELETED *");
  1145.             }
  1146.         }
  1147.         else {
  1148.          wprints ( 4,  1, LGREY|_BLACK, " Pwd change ");
  1149.          wprints ( 5,  1, LGREY|_BLACK, " UL Kbytes  ");
  1150.          wprints ( 5, 26, LGREY|_BLACK, " UL Files   ");
  1151.          wprints ( 6,  1, LGREY|_BLACK, " DL Kbytes  ");
  1152.          wprints ( 6, 26, LGREY|_BLACK, " DL Files   ");
  1153.          wprints ( 7,  1, LGREY|_BLACK, " Quiet      ");
  1154.          wprints ( 7, 26, LGREY|_BLACK, " Time call  ");
  1155.          wprints ( 8,  1, LGREY|_BLACK, " Nerd       ");
  1156.          wprints ( 8, 26, LGREY|_BLACK, " Time day   ");
  1157.          wprints ( 9,  1, LGREY|_BLACK, " No disturb ");
  1158.          wprints ( 9, 26, LGREY|_BLACK, " DL Limit   ");
  1159.          wprints (10,  1, LGREY|_BLACK, " Security   ");
  1160.          wprints (10, 26, LGREY|_BLACK, " DL Ratio   ");
  1161.          wprints (11,  1, LGREY|_BLACK, " Bad Pwd    ");
  1162.          wprints (11, 26, LGREY|_BLACK, " Min. speed ");
  1163.          wprints (12,  1, LGREY|_BLACK, " Kludge     ");
  1164.          wprints (12, 26, LGREY|_BLACK, " DL Speed   ");
  1165.          wprints (13,  1, LGREY|_BLACK, " Msg. group ");
  1166.          wprints (13, 26, LGREY|_BLACK, " Beg. ratio ");
  1167.          wprints (14,  1, LGREY|_BLACK, " File group ");
  1168.          wprints (14, 26, LGREY|_BLACK, "            ");
  1169.          wprints (15,  1, LGREY|_BLACK, " Chat mins. ");
  1170.          wprints (15, 26, LGREY|_BLACK, " Msg Posted ");
  1171.          wprints (16,  1, LGREY|_BLACK, " TimeBank   ");
  1172.          wprints (16, 26, LGREY|_BLACK, " FileBank   ");
  1173.          wprints (17,  1, LGREY|_BLACK, " Last baud  ");
  1174.          wprints (17, 26, LGREY|_BLACK, " DL Today   ");
  1175.  
  1176.          if (readed) {
  1177.             wprints ( 4, 14, CYAN|_BLACK, usr.lastpwdchange);
  1178.             sprintf (string, "%lu", usr.upld);
  1179.             wprints ( 5, 14, CYAN|_BLACK, string);
  1180.             sprintf (string, "%u", usr.n_upld);
  1181.             wprints ( 5, 39, CYAN|_BLACK, string);
  1182.             sprintf (string, "%lu", usr.dnld);
  1183.             wprints ( 6, 14, CYAN|_BLACK, string);
  1184.             sprintf (string, "%u", usr.n_dnld);
  1185.             wprints ( 6, 39, CYAN|_BLACK, string);
  1186.             wprints ( 7, 14, CYAN|_BLACK, usr.quiet ? "Yes" : "No");
  1187.             sprintf (string, "%u", usr.ovr_class.max_call);
  1188.             wprints ( 7, 39, CYAN|_BLACK, string);
  1189.             wprints ( 8, 14, CYAN|_BLACK, usr.nerd ? "Yes" : "No");
  1190.             sprintf (string, "%u", usr.ovr_class.max_time);
  1191.             wprints ( 8, 39, CYAN|_BLACK, string);
  1192.             wprints ( 9, 14, CYAN|_BLACK, usr.donotdisturb ? "Yes" : "No");
  1193.             sprintf (string, "%u", usr.ovr_class.max_dl);
  1194.             wprints ( 9, 39, CYAN|_BLACK, string);
  1195.             wprints (10, 14, CYAN|_BLACK, usr.security ? "Yes" : "No");
  1196.             sprintf (string, "%u", usr.ovr_class.ratio);
  1197.             wprints (10, 39, CYAN|_BLACK, string);
  1198.             wprints (11, 14, CYAN|_BLACK, usr.badpwd ? "Yes" : "No");
  1199.             sprintf (string, "%u", usr.ovr_class.min_baud);
  1200.             wprints (11, 39, CYAN|_BLACK, string);
  1201.             wprints (12, 14, CYAN|_BLACK, usr.kludge ? "Yes" : "No");
  1202.             sprintf (string, "%u", usr.ovr_class.min_file_baud);
  1203.             wprints (12, 39, CYAN|_BLACK, string);
  1204.             sprintf (string, "%u", usr.msg_sig);
  1205.             wprints (13, 14, CYAN|_BLACK, string);
  1206.             sprintf (string, "%u", usr.ovr_class.start_ratio);
  1207.             wprints (13, 39, CYAN|_BLACK, string);
  1208.             sprintf (string, "%u", usr.file_sig);
  1209.             wprints (14, 14, CYAN|_BLACK, string);
  1210.             sprintf (string, "%u", usr.chat_minutes);
  1211.             wprints (15, 14, CYAN|_BLACK, string);
  1212.             sprintf (string, "%u", usr.msgposted);
  1213.             wprints (15, 39, CYAN|_BLACK, string);
  1214.             sprintf (string, "%u", usr.account);
  1215.             wprints (16, 14, CYAN|_BLACK, string);
  1216.             sprintf (string, "%u", usr.f_account);
  1217.             wprints (16, 39, CYAN|_BLACK, string);
  1218.             sprintf (string, "%lu", usr.baud_rate);
  1219.             wprints (17, 14, CYAN|_BLACK, string);
  1220.             sprintf (string, "%u", usr.dnldl);
  1221.             wprints (17, 39, CYAN|_BLACK, string);
  1222.          }
  1223.       }
  1224.  
  1225.       start_update ();
  1226.  
  1227.       i = getxch ();
  1228.       if ( (i & 0xFF) != 0 )
  1229.          i &= 0xFF;
  1230.  
  1231.       switch (i) {
  1232.          // PgDn
  1233.          case 0x5100:
  1234.             read (fd, (char *)&usr, sizeof (struct _usr));
  1235.             read (fdidx, &usridx, sizeof (struct _usridx));
  1236.             break;
  1237.  
  1238.          // PgUp
  1239.          case 0x4900:
  1240.             if (tell (fd) > sizeof (struct _usr)) {
  1241.                lseek (fd, -2L * sizeof (struct _usr), SEEK_CUR);
  1242.                read (fd, (char *)&usr, sizeof (struct _usr));
  1243.                lseek (fdidx, -2L * sizeof (struct _usridx), SEEK_CUR);
  1244.                read (fdidx, &usridx, sizeof (struct _usridx));
  1245.             }
  1246.             break;
  1247.  
  1248.          // E Edit
  1249.          case 'E':
  1250.          case 'e':
  1251.             edit_single_user (&usr);
  1252.             lseek (fd, -1L * sizeof (struct _usr), SEEK_CUR);
  1253.             write (fd, (char *)&usr, sizeof (struct _usr));
  1254.             usridx.id = usr.id;
  1255.             usridx.alias_id = usr.alias_id;
  1256.             lseek (fdidx, -1L * sizeof (struct _usridx), SEEK_CUR);
  1257.             write (fdidx, &usridx, sizeof (struct _usridx));
  1258.             break;
  1259.  
  1260.          // A Add
  1261.          case 'A':
  1262.          case 'a':
  1263.             memset (&usr, 0, sizeof (struct _usr));
  1264.             usr.priv = config.logon_level;
  1265.             usr.flags = config.logon_flags;
  1266.             usr.len = 23;
  1267.             usr.width = 80;
  1268.             usr.ansi = usr.color = usr.ibmset = 1;
  1269.             usr.formfeed = 1;
  1270.  
  1271.             edit_single_user (&usr);
  1272.  
  1273.             if (!usr.name[0]) {
  1274.                lseek (fd, -1L * sizeof (struct _usr), SEEK_CUR);
  1275.                read (fd, (char *)&usr, sizeof (struct _usr));
  1276.             }
  1277.             else {
  1278.                lseek (fd, 0L, SEEK_END);
  1279.                write (fd, (char *)&usr, sizeof (struct _usr));
  1280.                usridx.id = usr.id;
  1281.                usridx.alias_id = usr.alias_id;
  1282.                lseek (fdidx, 0L, SEEK_END);
  1283.                write (fdidx, &usridx, sizeof (struct _usridx));
  1284.             }
  1285.             break;
  1286.  
  1287.          case 'O':
  1288.          case 'o':
  1289.             otherdata = otherdata ? 0 : 1;
  1290.             break;
  1291.  
  1292.          // D Delete
  1293.          case 'D':
  1294.          case 'd':
  1295.             usr.deleted ^= 1;
  1296.             lseek (fd, -1L * sizeof (struct _usr), SEEK_CUR);
  1297.             write (fd, (char *)&usr, sizeof (struct _usr));
  1298.             break;
  1299.  
  1300.          // L List
  1301.          case 'L':
  1302.          case 'l':
  1303.             user_select_list (fd, fdidx, &usr);
  1304.             break;
  1305.  
  1306.          // ESC Exit
  1307.          case 0x1B:
  1308.             i = -1;
  1309.             break;
  1310.       }
  1311.  
  1312.    } while (i != -1);
  1313.  
  1314.    close (fdidx);
  1315.    close (fd);
  1316.  
  1317.    wclose ();
  1318.    gotoxy_ (24, 1);
  1319.    clreol_ ();
  1320. }
  1321.  
  1322.