Metropoli BBS
VIEWER: ifsdbg.c MODE: TEXT (ASCII)
//
// $Header: D:/ext2-os2/RCS/ifsdbg.c,v 1.6 1995/08/16 17:37:32 Willm Exp Willm $
//

// Linux ext2 file system driver for OS/2 2.x and WARP - Allows OS/2 to     
// access your Linux ext2fs partitions as normal drive letters.
// OS/2 implementation : Copyright (C) 1995  Matthieu WILLM
//
// 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.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.



#define INCL_DOS
#define INCL_DOSERRORS
#include <os2.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

#include <os2/ifsdbg.h>
#include <os2/types.h>
#include <os2/errors.h>

char Buf[8192];
extern char Msg_0[];

int trace  = FALSE;

void handler_signal(int sig) {
    APIRET rc;

    rc = DosFSCtl ( NULL,  0,
                        0,  NULL,  0,
                        0,  IFSDBG_CLOSE,  "ext2",
                        -1,  FSCTL_FSDNAME);
    if ((rc != NO_ERROR) && 
        (rc != 0xEE01)) {	// ERROR_DEVICE_NOT_OPEN (custom IFS error)
        fprintf(stderr, "Couldn't stop dialog with ext2-os2.ifs - DosFsCtl returned %d\n", rc);
        exit(EXIT_FAILURE);
    } /* end if */
    exit(EXIT_SUCCESS);
}

int main(int argc, char **argv) {
    APIRET rc;
    ULONG  DataIO;
    int    i;
    USHORT *Tmp;
    int    lg;
    char  *tmp;

    setbuf(stdout, NULL);
    setbuf(stderr, NULL);
    signal(SIGINT, handler_signal);
    signal(SIGTERM, handler_signal);
    signal(SIGABRT, handler_signal);

    printf("%s", Msg_0);
    for (i = 0 ; i < argc ; i++) {
        if (strcmp(argv[i], "-trace") == 0) {
            trace = TRUE;
        } else {
	    trace = FALSE;
        }
    }

    if (trace) {
        if ((rc = DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 31, 0)) != NO_ERROR) {
            fprintf(stderr, "Couldn't switch to time critical priority - DosSetPriority returned %d\n", rc);
            exit(EXIT_FAILURE);
        } else {
            printf("Switched to time critical priority\n");
        } /* end if */
    }
 
    if ((rc = DosFSCtl ( NULL,  0,
                         0,  NULL,  0,
                         0,  IFSDBG_OPEN,  "ext2",
                        -1,  FSCTL_FSDNAME)) != NO_ERROR) {
        fprintf(stderr, "Couldn't start dialog with ext2-os2.ifs - DosFsCtl returned %d\n", rc);
        exit(EXIT_FAILURE);
    } /* end if */

    for (;;) {
        DataIO = 0;
        memset(Buf, 0, 8192);
        if ((rc = DosFSCtl ( Buf,  4096,
                            &DataIO,  NULL,  0,
                            0,  IFSDBG_READ,  "ext2",
                           -1,  FSCTL_FSDNAME)) != NO_ERROR) {
            fprintf(stderr, "Couldn't retrieve data from ext2-os2.ifs - DosFsCtl returned %d\n", rc);
            abort();
        } else {
            tmp = Buf;
            while ((tmp[0] != '\0') && (tmp[1] != '\0')){
            Tmp = (USHORT *)tmp;
            switch(Tmp[0]) {

                case LOG_FS_ERR :
                    {
                        err_record *err_rec = (err_record *)Tmp;
                        printf(
                               "===> ERROR : %s() called from %s() (%s - line %d) - rc = 0x%04X\n",
                               func[err_rec->errfunction],
                               func[err_rec->infunction],
                               sourcefile[err_rec->sourcefile],
                               err_rec->sourceline,
                               err_rec->retcode
                              );
                        tmp += sizeof(err_record);
                    }
                    break;

                default :
                    printf("%s\n", tmp);
                    tmp = &tmp[strlen(tmp) + 1];
                    break;
            } /* end switch */
            fflush(stdout);
            }
        }
    }

}



[ RETURN TO DIRECTORY ]