Annotation of coherent/d/bin/uucheck/checkperms/monitor.c, revision 1.1.1.1

1.1       root        1: /* monitor.c -
                      2:  * Routines for handling a monitor file -- a places to stash input to be
                      3:  * processed later.
                      4:  * This package supports only a single monitor file.
                      5:  * Monitor files are unlinked immdiately after they are opened, so they
                      6:  * will just go away if a program halts for any reason.
                      7:  */
                      8: 
                      9: #include <stdio.h>
                     10: #include "checkperms.h"
                     11: #include "monitor.h"
                     12: 
                     13: static FILE *monitor_fp = (FILE *)NULL;
                     14: 
                     15: void open_monitor_file()       /* Create a new monitor file.  */
                     16: {
                     17:        FILE *tmp_monitor;
                     18:        static char tmp_file[]="/tmp/monXXXXXX";
                     19: 
                     20:        /* Try to open a tmp file.  */
                     21:        strcpy(tmp_file, tempnam(NULL, "mon"));
                     22: 
                     23:        if((tmp_monitor = fopen(tmp_file, "w+")) == NULL) {
                     24:                /* Do something useful in the way of error handling.  */
                     25:        } /* if we can open the tmp file.  */
                     26:        
                     27:        /* Now unlink the tmp file so that we can just
                     28:         * close it to make it go away.
                     29:         */
                     30:        unlink(tmp_file);
                     31: 
                     32:        /* CHECKPOINT - we've got an open file pointer on a nameless
                     33:         * file.  */
                     34:        monitor_fp = tmp_monitor;
                     35:        /* Save current line for later reference.  */
                     36:        oldlineno = lineno;
                     37: } /* open_monitor_file() */
                     38: 
                     39: void close_monitor_file()      /* Close the monitor file.  */
                     40: {
                     41:        /* This makes the file go away, since it has already been unlinked.  */
                     42:        fclose(monitor_fp);
                     43: } /* close_monitor_file() */
                     44: 
                     45: void putchar_monitor_file(c)   /* Write to the monitor file.  */
                     46:        char c;
                     47: {
                     48:        putc(c, monitor_fp);
                     49: } /* write_monitor_file() */
                     50: 
                     51: int getchar_monitor_file()     /* Read from the monitor file.  */
                     52: {
                     53:        return(getc(monitor_fp));
                     54: } /* read_monitor_file() */
                     55: 
                     56: int fseek_monitor_file(where, how)     /* Seek to an arbitrary position in the
                     57:                                         * monitor file.
                     58:                                         */
                     59:        long where;
                     60:        int how;
                     61: {
                     62:        return(fseek(monitor_fp, where, how));
                     63:        lineno=-1000;   /* Set the line number to something meaningless.  */
                     64: } /* fseek_monitor_file() */
                     65: 
                     66: void ungetchar_monitor_file(c)
                     67:        char c;
                     68: {
                     69:        ungetc(c, monitor_fp);
                     70: } /* ungetchar_monitor_file */
                     71: 
                     72: static boolean hava_char = FALSE;
                     73: static int ungot_char;
                     74: 
                     75: void rewind_monitor_file()     /* Rewind the monitor file.  */
                     76: {
                     77:        rewind(monitor_fp);
                     78:        hava_char = FALSE; /* Throw away any ungetc()d character.  */
                     79:        hava_delay = FALSE; /* Throw away the delayed character.  */
                     80:        lineno = oldlineno;
                     81: } /* rewind_monitor_file() */
                     82: 
                     83: int my_getchar()
                     84: {
                     85:        int c;
                     86: 
                     87:        if(hava_char){
                     88:                c = ungot_char;
                     89:                hava_char = FALSE;
                     90:        } else { /* Don't have an ungot character. */
                     91:                if(reading_from_monitor_file){
                     92:                        c = getchar_monitor_file();
                     93:                } else {
                     94:                        c = getchar();
                     95:                }
                     96: 
                     97:                if(saving_to_monitor_file) {
                     98:                        /* We want to save all but the last character
                     99:                         * because the lexer has to read one character too
                    100:                         * far for us to find an unindent.
                    101:                         */
                    102:                        if (hava_delay) {
                    103:                                putchar_monitor_file(delayed_char);
                    104:                        } else {
                    105:                                hava_delay = TRUE;
                    106:                        } /* if hava_delay */
                    107:                        delayed_char = c;
                    108:                } /* if saving to monitor file */
                    109: 
                    110:        } /* if have an ungot char */
                    111:        
                    112:        return(c);
                    113: } /* my_getchar() */
                    114: 
                    115: int my_ungetchar(c)
                    116:        int c;
                    117: {
                    118:        /* Do not use ungetch() at all because that will cause every
                    119:         * ungetch()d character to appear (at least) twice in the monitor file.
                    120:         */
                    121: 
                    122:        if (hava_char) { /* Can not unget more than one character.  */
                    123:                return(EOF);
                    124:        } else {
                    125:                if (c != EOF) {
                    126:                        hava_char = TRUE;
                    127:                        ungot_char = (int) c;
                    128:                        return(ungot_char);
                    129:                } else {
                    130:                        return(EOF);
                    131:                }
                    132:        } /* if hava_char already */
                    133: 
                    134:        
                    135: } /* my_ungetchar() */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.