#include #include #include #include #include #include #include #include #include #include #include struct vt_scrollparms sp; int openconsole(void) { char *dev = "/dev/console"; int fd; fd = open(dev, O_RDWR); if(fd == -1) { perror("unable to open console"); return(-1); } return(fd); } int enable_scrollback(void) { int ret, fd; fd = openconsole(); if(fd == -1) return(EX_TEMPFAIL); ret = ioctl(fd, VT_ENABLESCROLLBACK); if(ret == -1) { perror("unable to enable scrollback"); return(EX_TEMPFAIL); } return(EX_OK); } int set_scrollback(void) { int ret, fd; fd = openconsole(); if(fd == -1) return(EX_TEMPFAIL); ret = ioctl(fd, VT_SETSCROLLBACK, &sp); if(ret == -1) { perror("unable to configure scrollback"); return(EX_TEMPFAIL); } return(EX_OK); } int get_scrollback(void) { int ret, fd; fd = openconsole(); if(fd == -1) return(EX_TEMPFAIL); ret = ioctl(fd, VT_GETSCROLLBACK, &sp); if(ret == -1) { perror("unable to get scrollback parameters"); return(EX_TEMPFAIL); } return(EX_OK); } int clear_scrollback(void) { unsigned int savesize; int ret; ret = get_scrollback(); if(ret != EX_OK) return(ret); savesize = sp.vp_size; sp.vp_size = 0; ret = set_scrollback(); if(ret != EX_OK) return(ret); sp.vp_size = savesize; return(set_scrollback()); } int main(int argc, char **argv) { /* usage: cfgscroll -e enable global scrollback (cannot be disabled) usage: cfgscroll -s con size set scrollback for specific console usage: cfgscroll -g con get scrollback for specific console usage: cfgscroll -c con clear scrollback for specific console */ int ret; if(argc == 2) { if(!strcmp(argv[1], "-e")) return(enable_scrollback()); goto dispusage; } else if(argc == 3) { if(!strcmp(argv[1], "-g")) { sscanf(argv[2], "%u", &sp.vp_con); ret = get_scrollback(); if(ret == EX_OK); printf("console %u: max scrollback = %u\n", sp.vp_con, sp.vp_size); return(ret); } else if(!strcmp(argv[1], "-c")) { sscanf(argv[2], "%u", &sp.vp_con); return(clear_scrollback()); } goto dispusage; } else if(argc == 4) { if(!strcmp(argv[1], "-s")) { sscanf(argv[2], "%u", &sp.vp_con); sscanf(argv[3], "%u", &sp.vp_size); return(set_scrollback()); } } dispusage: printf("usage: cfgscroll [-e] || [-s console size] || [-g console] || [-c console]\n"); exit(EX_USAGE); }