mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
bitkeeper revision 1.452.1.1 (3f6dc14baJxoz4mfHsRuNF95VdTfSA)
miniterm.c, README, Makefile: new file
This commit is contained in:
1 parent
fbcdb13f07
commit
e2806f072d
4 files changed
+205
No files matched your search
@@ -142,6 +142,9 @@
|
||||
3eb781fd0Eo9K1jEFCSAVzO51i_ngg tools/internal/xi_stop.c
|
||||
3f108ae2to5nHRRXfvUK7oxgjcW_yA tools/internal/xi_usage.c
|
||||
3eb781fd7211MZsLxJSiuy7W4KnJXg tools/internal/xi_vifinit
|
||||
3f6dc136ZKOjd8PIqLbFBl_v-rnkGg tools/misc/miniterm/Makefile
|
||||
3f6dc140C8tAeBfroAF24VrmCS4v_w tools/misc/miniterm/README
|
||||
3f6dc142IHaf6XIcAYGmhV9nNSIHFQ tools/misc/miniterm/miniterm.c
|
||||
3f1668d4-FUY6Enc7MB3GcwUtfJ5HA tools/misc/mkdevnodes
|
||||
3f5ef5a2ir1kVAthS14Dc5QIRCEFWg tools/misc/xen-clone
|
||||
3f5ef5a2dTZP0nnsFoeq2jRf3mWDDg tools/misc/xen-clone.README
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
CC = gcc
|
||||
CFLAGS = -O3 -march=i686 -Wall
|
||||
|
||||
all: miniterm
|
||||
|
||||
clean:
|
||||
rm -f *.o miniterm *~
|
||||
@@ -0,0 +1,13 @@
|
||||
This is a modified version of the miniterm program distributed as part
|
||||
of the Linux Programmer's Guide (LPG) by Sven Goldt.
|
||||
|
||||
It is intended to be used as a dumb raw terminal for debugging Xen
|
||||
machines over the serial line.
|
||||
|
||||
By default it will connect to COM1 (/dev/ttyS0) at 115200 baud.
|
||||
These options can be modified as follows:
|
||||
miniterm [-b<baudrate>] [-d<devicename>]
|
||||
|
||||
'ctrl-b' quits miniterm.
|
||||
|
||||
-- Keir Fraser (21/9/2003)
|
||||
@@ -0,0 +1,182 @@
|
||||
/******************************************************************************
|
||||
* miniterm.c
|
||||
*
|
||||
* Adapted from the example program distributed with the Linux Programmer's
|
||||
* Guide (LPG). This has been robustified and tweaked to work as a debugging
|
||||
* terminal for Xen-based machines.
|
||||
*
|
||||
* Modifications are released under GPL and copyright (c) 2003, K A Fraser
|
||||
* The original copyright message and license is fully intact below.
|
||||
*/
|
||||
|
||||
/*
|
||||
* AUTHOR: Sven Goldt (goldt@math.tu-berlin.de)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <termios.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/signal.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#define DEFAULT_BAUDRATE 115200
|
||||
#define DEFAULT_SERDEVICE "/dev/ttyS0"
|
||||
#define ENDMINITERM 2 /* ctrl-b to quit miniterm */
|
||||
|
||||
volatile int stop = 0;
|
||||
|
||||
void child_handler(int s)
|
||||
{
|
||||
stop = 1;
|
||||
}
|
||||
|
||||
int cook_baud(int baud)
|
||||
{
|
||||
int cooked_baud = 0;
|
||||
switch ( baud )
|
||||
{
|
||||
case 50: cooked_baud = B50; break;
|
||||
case 75: cooked_baud = B75; break;
|
||||
case 110: cooked_baud = B110; break;
|
||||
case 134: cooked_baud = B134; break;
|
||||
case 150: cooked_baud = B150; break;
|
||||
case 200: cooked_baud = B200; break;
|
||||
case 300: cooked_baud = B300; break;
|
||||
case 600: cooked_baud = B600; break;
|
||||
case 1200: cooked_baud = B1200; break;
|
||||
case 1800: cooked_baud = B1800; break;
|
||||
case 2400: cooked_baud = B2400; break;
|
||||
case 4800: cooked_baud = B4800; break;
|
||||
case 9600: cooked_baud = B9600; break;
|
||||
case 19200: cooked_baud = B19200; break;
|
||||
case 38400: cooked_baud = B38400; break;
|
||||
case 57600: cooked_baud = B57600; break;
|
||||
case 115200: cooked_baud = B115200; break;
|
||||
}
|
||||
return cooked_baud;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int fd, c, cooked_baud = cook_baud(DEFAULT_BAUDRATE);
|
||||
char *sername = DEFAULT_SERDEVICE;
|
||||
struct termios oldsertio, newsertio, oldstdtio, newstdtio;
|
||||
struct sigaction sa;
|
||||
|
||||
while ( --argc != 0 )
|
||||
{
|
||||
char *p = argv[argc];
|
||||
if ( *p++ != '-' )
|
||||
goto usage;
|
||||
if ( *p == 'b' )
|
||||
{
|
||||
p++;
|
||||
if ( (cooked_baud = cook_baud(atoi(p))) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Bad baud rate '%d'\n", atoi(p));
|
||||
goto usage;
|
||||
}
|
||||
}
|
||||
else if ( *p == 'd' )
|
||||
{
|
||||
sername = ++p;
|
||||
if ( *sername == '\0' )
|
||||
goto usage;
|
||||
}
|
||||
else
|
||||
goto usage;
|
||||
}
|
||||
|
||||
/* Not a controlling tty: CTRL-C shouldn't kill us. */
|
||||
fd = open(sername, O_RDWR | O_NOCTTY);
|
||||
if ( fd < 0 )
|
||||
{
|
||||
perror(sername);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
tcgetattr(fd, &oldsertio); /* save current modem settings */
|
||||
|
||||
/*
|
||||
* 8 data, no parity, 1 stop bit. Ignore modem control lines. Enable
|
||||
* receive. Set appropriate baud rate. NO HARDWARE FLOW CONTROL!
|
||||
*/
|
||||
newsertio.c_cflag = cooked_baud | CS8 | CLOCAL | CREAD;
|
||||
|
||||
/* Raw input. Ignore errors and breaks. */
|
||||
newsertio.c_iflag = IGNBRK | IGNPAR;
|
||||
|
||||
/* Raw output. */
|
||||
newsertio.c_oflag = 0;
|
||||
|
||||
/* No echo and no signals. */
|
||||
newsertio.c_lflag = 0;
|
||||
|
||||
/* blocking read until 1 char arrives */
|
||||
newsertio.c_cc[VMIN]=1;
|
||||
newsertio.c_cc[VTIME]=0;
|
||||
|
||||
/* now clean the modem line and activate the settings for modem */
|
||||
tcflush(fd, TCIFLUSH);
|
||||
tcsetattr(fd,TCSANOW,&newsertio);
|
||||
|
||||
/* next stop echo and buffering for stdin */
|
||||
tcgetattr(0,&oldstdtio);
|
||||
tcgetattr(0,&newstdtio); /* get working stdtio */
|
||||
newstdtio.c_lflag &= ~(ICANON | ECHO);
|
||||
tcsetattr(0,TCSANOW,&newstdtio);
|
||||
|
||||
/* Terminal settings done: now enter the main I/O loops. */
|
||||
switch ( fork() )
|
||||
{
|
||||
case 0:
|
||||
close(1); /* stdout not needed */
|
||||
for ( c = getchar(); c != ENDMINITERM ; c = getchar() )
|
||||
write(fd,&c,1);
|
||||
tcsetattr(fd,TCSANOW,&oldsertio);
|
||||
tcsetattr(0,TCSANOW,&oldstdtio);
|
||||
close(fd);
|
||||
exit(0); /* will send a SIGCHLD to the parent */
|
||||
break;
|
||||
case -1:
|
||||
perror("fork");
|
||||
tcsetattr(fd,TCSANOW,&oldsertio);
|
||||
close(fd);
|
||||
exit(-1);
|
||||
default:
|
||||
printf("** ctrl-b quits miniterm **\n");
|
||||
close(0); /* stdin not needed */
|
||||
sa.sa_handler = child_handler;
|
||||
sa.sa_flags = 0;
|
||||
sigaction(SIGCHLD,&sa,NULL); /* handle dying child */
|
||||
while ( !stop )
|
||||
{
|
||||
read(fd,&c,1); /* modem */
|
||||
write(1,&c,1); /* stdout */
|
||||
}
|
||||
wait(NULL); /* wait for child to die or it will become a zombie */
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
usage:
|
||||
printf("miniterm [-b<baudrate>] [-d<devicename>]\n");
|
||||
printf("Default baud rate: %d\n", DEFAULT_BAUDRATE);
|
||||
printf("Default device: %s\n", DEFAULT_SERDEVICE);
|
||||
return 1;
|
||||
}
|
||||