home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume32 / shlm / part01 / condump.c next >
C/C++ Source or Header  |  1992-09-20  |  8KB  |  304 lines

  1. /*
  2.  
  3.     condump / conrestore
  4.  
  5. */
  6.  
  7. /* tabs = 4 */
  8.  
  9. /*------------------------------------------------------------------------
  10. **
  11. **    includes
  12. **
  13. **-----------------------------------------------------------------------*/
  14.  
  15. #include "config.h"
  16. #if defined(MAIN) || defined(USE_CONDUMP)
  17.     
  18. #include <fcntl.h>
  19. #include <unistd.h>
  20. #include <termio.h>
  21. #include <stdio.h>
  22. #include <string.h>
  23.  
  24. void condump(), conrestore();
  25. int  put_mark();
  26.  
  27. extern char *optarg;
  28. extern int optind;
  29. static int mem_fd = -1, put_mark_fd;
  30.  
  31. #ifdef MAIN
  32.  
  33. /*-----------------------------------------------------------------------
  34. **
  35. **    main()
  36. **
  37. **----------------------------------------------------------------------*/
  38. int main(argc, argv)
  39. int argc;
  40. char **argv;
  41. {
  42.     return con_run(argc, argv);
  43. }
  44.  
  45. #endif /* MAIN */
  46.  
  47. /*-----------------------------------------------------------------------
  48. **
  49. **    con_run()
  50. **
  51. **----------------------------------------------------------------------*/
  52. int con_run(argc, argv)
  53. int argc;
  54. char **argv;
  55. {
  56.     int     ch, iosize, cursor_fd;
  57.     char     screen[SCREEN_SIZE + SCREEN_LINES + 2];
  58.     int     verbose = 0,
  59.             newline = 0,
  60.             cursor  = 0;
  61.     char    *ttyname(),
  62.             *tty_ptr = NULL;
  63.     
  64.     while ((ch = getopt(argc, argv, "cnv")) != -1)
  65.         switch (ch)
  66.         {
  67.             case 'c' : cursor = 1;    break;
  68.             case 'n' : newline = 1;    break;
  69.             case 'v' : verbose = 1; break;
  70.             case '?' :
  71.                 halt("USAGE: %s [ -vnc ]\n-v verbose, -n newlines, -c cursor\n",
  72.                     argv[0]);
  73.         }
  74.      if (optind < argc)
  75.         tty_ptr = argv[optind];
  76.  
  77.     open_mem_fd();
  78.     
  79.     iosize = SCREEN_LINES * SCREEN_COLS;
  80.     if (verbose)    iosize *= SCREEN_CHAR_SPACING;
  81.     if (newline)    iosize += SCREEN_LINES;
  82.     if (cursor)        iosize += 2;
  83.  
  84.      if (strcmp(argv[0], "conrestore") != 0 &&
  85.         strcmp(strrchr(argv[0],'/'), "/conrestore" ) != 0)
  86.     {
  87.         if (cursor)
  88.         {
  89.             if ( tty_ptr == NULL &&
  90.                 (tty_ptr = ttyname(0)) == NULL)
  91.                 halt("Cannot find tty name.\n");
  92.             if ( (cursor_fd=open(tty_ptr, O_WRONLY)) == -1)
  93.                 halt("PERROR : Can not open console for writing.\n");
  94.             if ( (cursor_fd=open(tty_ptr, O_WRONLY)) == -1)
  95.                 halt("PERROR : Can not open console for writing.\n");
  96.         }
  97.         condump(screen, cursor, newline, verbose, cursor_fd);
  98.         if (fwrite(screen, 1, iosize, stdout) != iosize)
  99.             halt("PERROR : Could not write required number of bytes.\n");
  100.     }
  101.     else
  102.     {
  103.         if (cursor)
  104.         {
  105.             if (tty_ptr == NULL)
  106.                 cursor_fd = 1;
  107.             else if ( (cursor_fd=open(tty_ptr, O_WRONLY)) == -1)
  108.                     halt("PERROR : Can not open console for writing.\n");
  109.         }
  110.         if (fread(screen, 1, iosize, stdin) != iosize)
  111.             halt("PERROR : Could not read required number of bytes.\n");
  112.         conrestore(screen, cursor, newline, verbose, cursor_fd);
  113.     }
  114.     return 0;
  115. }
  116.  
  117. /*-----------------------------------------------------------------------
  118. **
  119. **    condump()
  120. **
  121. **----------------------------------------------------------------------*/
  122. void condump(screen, cursor, newline, verbose, cursor_fd)
  123. char *screen;
  124. int cursor, newline, verbose, cursor_fd;
  125. {
  126.     static char    *left_ptr = NULL;
  127.     char    screen2[SCREEN_SIZE];
  128.     int     i, errret;
  129.  
  130.     if (lseek(mem_fd, SCREEN_START, SEEK_SET) == -1)
  131.         halt( "PERROR : Can not seek in memory device.\n");
  132.  
  133.     if (read(mem_fd, screen2, SCREEN_SIZE) == -1)
  134.         halt("PERROR : Can not read from memory device.\n");
  135.  
  136.     if (verbose && !newline)
  137.     {
  138.         memcpy(screen, screen2, SCREEN_SIZE);
  139.         screen += SCREEN_SIZE;
  140.     }
  141.     else
  142.         for (i=0 ; i < SCREEN_SIZE; i++)
  143.         {
  144.             if (newline &&
  145.                     i % (SCREEN_COLS * SCREEN_CHAR_SPACING) == 0 &&
  146.                     i != 0)
  147.                 *(screen++) = '\n';
  148.             *(screen++) = screen2[i];
  149.             if (!verbose)
  150.                 i += SCREEN_CHAR_SPACING - 1;
  151.         }
  152.         
  153.     if (cursor)
  154.     {
  155.         if (lseek(mem_fd, SCREEN_START, SEEK_SET) == -1)
  156.             halt( "PERROR :Can not seek in memory device.\n");
  157.         put_mark_fd = cursor_fd;
  158.         put_mark(CURSOR_MARK);
  159.         if (read(mem_fd, screen2, SCREEN_SIZE) == -1)
  160.             halt("PERROR : Can not read from memory device.\n");
  161.         for (i=0; i < SCREEN_SIZE; i += SCREEN_CHAR_SPACING)
  162.             if (screen2[i] == CURSOR_MARK)
  163.                 break;
  164.         if (i < SCREEN_SIZE)
  165.         {
  166.             *(screen++) = (i/SCREEN_CHAR_SPACING) / SCREEN_COLS;
  167.             *(screen++) = (i/SCREEN_CHAR_SPACING) % SCREEN_COLS;
  168.  
  169. #ifdef TERMINFO
  170.         if (left_ptr == NULL &&
  171.             (setupterm(CONSOLE_TERM_TYPE, 2, &errret) != 0 ||  /* 0==OK in curses.h */
  172.              (left_ptr = (char *)tigetstr("cub1")) == NULL ||
  173.                  left_ptr == (char *) -1 ) )
  174. #else
  175.         if (left_ptr == NULL &&
  176.             (tgetent(left_ptr, CONSOLE_TERM_TYPE) == -1 ||
  177.                (left_ptr = (char *)tgetstr("le", NULL)) == NULL) )
  178. #endif
  179.             halt("Can not get termcap/info for left cursor movement\n");
  180.  
  181.             tputs(left_ptr, 1, put_mark);
  182.             put_mark(screen2[i]);
  183.             tputs(left_ptr, 1, put_mark);
  184.         }
  185.         else
  186.         {
  187.             fprintf(stderr,"Can not get cursor position.\n");
  188.             sleep(2);
  189.         }
  190.     }
  191. }
  192.  
  193. /*-----------------------------------------------------------------------
  194. **
  195. **    conrestore()
  196. **
  197. **----------------------------------------------------------------------*/
  198. void conrestore(screen, cursor, newline, verbose, cursor_fd)
  199. char *screen;
  200. int cursor, newline, verbose;
  201. int cursor_fd;
  202. {
  203.     int i, j, errret;    
  204.     static  char     *curs_ptr  = NULL,
  205.                     *curs_ptr2 = NULL;
  206.     char    *tparm();
  207.     char    screen2[SCREEN_SIZE];
  208.                     
  209.     if (verbose && !newline)
  210.     {
  211.         memcpy(screen2, screen, SCREEN_SIZE);
  212.         screen += SCREEN_SIZE;
  213.     }
  214.     else
  215.     {
  216.         if (lseek(mem_fd, SCREEN_START, SEEK_SET) == -1)
  217.             halt( "PERROR : Can not seek in memory device.\n");    
  218.  
  219.         if (read(mem_fd, screen2, SCREEN_SIZE) == -1)
  220.             halt("PERROR : Can not read from memory device.\n");
  221.  
  222.         for (i=0 ; i < SCREEN_SIZE; i++)
  223.         {
  224.             if (!newline ||
  225.                     i % (SCREEN_COLS * SCREEN_CHAR_SPACING) != 0 ||  
  226.                     i == 0)
  227.             screen2[i] = *(screen++);
  228.  
  229.             if (!verbose)
  230.                 i += SCREEN_CHAR_SPACING - 1;
  231.         }
  232.     }
  233.     
  234.     if (lseek(mem_fd, SCREEN_START, SEEK_SET) == -1)
  235.         halt( "PERROR :Can not seek in memory device.\n");
  236.     if (write(mem_fd, screen2, SCREEN_SIZE) == -1)
  237.         halt("PERROR : Can not write to memory device.\n");
  238.     if (cursor)
  239.     {
  240.         i  = *(screen++);
  241.         j  = *(screen++);
  242. #ifdef TERMINFO
  243.         if (curs_ptr == NULL &&                            /*0==OK in curses.h */
  244.             (setupterm(CONSOLE_TERM_TYPE, 2, &errret) != 0 ||
  245.              (curs_ptr = (char *)tigetstr("cup")) == NULL ||
  246.                  curs_ptr == (char *) -1 ) )
  247.             halt("Can not get termcap/info for address cursor.\n");
  248.         curs_ptr2 = tparm(curs_ptr, i, j);
  249. #else
  250.         if (curs_ptr == NULL &&
  251.             (tgetent(curs_ptr, CONSOLE_TERM_TYPE) == -1 ||
  252.                (curs_ptr = (char *)tgetstr("cm", NULL)) == NULL) )
  253.              halt("Can not get termcap/info for address cursor.\n");
  254.         curs_ptr2 = tgoto(curs_ptr, i, j);
  255. #endif
  256.         put_mark_fd = cursor_fd;
  257.         tputs(curs_ptr2, 1, put_mark);
  258.     }
  259. }
  260.  
  261. /*-----------------------------------------------------------------------
  262. **
  263. **    open_mem_fd()
  264. **
  265. **----------------------------------------------------------------------*/
  266. int open_mem_fd()
  267. {
  268.     if (mem_fd == -1)
  269.     {
  270.         if ( access(CONSOLE_DEVICE, R_OK) == -1)
  271.          halt("PERROR : Can not read from console.  Security check failed.\n");
  272.         if ( (mem_fd=open(MEMORY_DEVICE, O_RDWR)) == -1)
  273.             halt("PERROR : Can not open memory device.\n");
  274.     }
  275.     return mem_fd;
  276. }
  277.  
  278. /*-----------------------------------------------------------------------
  279. **
  280. **    close_mem_fd()
  281. **
  282. **----------------------------------------------------------------------*/
  283. int close_mem_fd()
  284. {
  285.  
  286.     close(mem_fd);    
  287.     return mem_fd;
  288. }
  289.  
  290. /*-----------------------------------------------------------------------
  291. **
  292. **    put_mark()
  293. **
  294. **----------------------------------------------------------------------*/
  295. static int put_mark(ch)
  296. char ch;
  297. {
  298.     if (write(put_mark_fd, &ch, 1) == -1)
  299.          halt("PERROR : Can not write to terminal.\n");
  300.      return 0;
  301. }
  302.  
  303. #endif /* MAIN || USE_CONDUMP */
  304.