Metropoli BBS
VIEWER: log.c MODE: TEXT (CP437)
//
// $Header: D:/ext2-os2/RCS/log.c,v 1.6 1995/08/16 17:37:40 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>		// From the "Developer Connection Device Driver Kit" version 2.0
#include <fsh.h>

#ifdef FS_DEBUG
#include <stdarg.h>
#include <stdio.h>
#endif
#include <os2/log.h>
#include <os2/types.h>
#include <os2/os2misc.h>

#include <os2/ifsdbg.h>

//
// Buffer used to communicate with ext2-os2.exe
//
char    BufMsg[BUFMSGSIZ];	// Circular buffer
UINT16  BufPtr;			// Buffer pointer
UINT16  BufOpen;		// Open flag (ext2-os2.exe present ?)
UINT32  BufSem;			// Buffer semaphore


int fs_err(UINT32 infunction, UINT32 errfunction, int retcode, UINT32 sourcefile, UINT32 sourceline) {
    int         rc;
    err_record *Tmp;
    int         i;

    i = sizeof(err_record);
    if (i + BufPtr < BUFMSGSIZ) {
        Tmp = (err_record *)&(BufMsg[BufPtr]);
        Tmp->Type        = LOG_FS_ERR;
        Tmp->infunction  = infunction;  /* function where error occured  */
        Tmp->errfunction = errfunction; /* function returning error code */
        Tmp->retcode     = retcode;     /* return code from errfunction  */
        Tmp->sourcefile  = sourcefile;  /* file where error occured      */
        Tmp->sourceline  = sourceline;  /* line number in sourcefile     */
        BufPtr += i;
    } else {
        Tmp = (err_record *)BufMsg;
        Tmp->Type        = LOG_FS_ERR;
        Tmp->infunction  = infunction;  /* function where error occured  */
        Tmp->errfunction = errfunction; /* function returning error code */
        Tmp->retcode     = retcode;     /* return code from errfunction  */
        Tmp->sourcefile  = sourcefile;  /* file where error occured      */
        Tmp->sourceline  = sourceline;  /* line number in sourcefile     */
        BufPtr = i;
    } /* end if */

    //
    // Clears the log semaphore so that ext2-os2.exe can retrieve data
    //
    if ((rc = FSH_SEMCLEAR(&BufSem)) != NO_ERROR) {
        BufOpen = 0;
        return rc;
    } /* end if */

    return NO_ERROR;

}


/***********************************************************************************/
/*** fs_log()                                                                    ***/
/***********************************************************************************/
int fs_log(char *text)
{
    int rc;

    //
    // We copy the text into the circular buffer :
    //   - at the current position if it fits 
    //   - at the buffer beginning otherwise
    //
    int i = strlen(text) + 1;
    if (i + BufPtr < BUFMSGSIZ) {
        strcpy(&(BufMsg[BufPtr]), text);
        BufPtr += i;
    } else {
        strcpy(BufMsg, text);
        BufPtr = i;
    } /* end if */

    //
    // Clears the log semaphore so that ext2-os2.exe can retrieve data
    //
    if ((rc = FSH_SEMCLEAR(&BufSem)) != NO_ERROR) {
        BufOpen = 0;
        return rc;
    } /* end if */

#if defined (FS_TRACE) || defined (FS_TRACE_LOCKS)
    FSH_YIELD();
#endif
    return NO_ERROR;

} /*** fs_log() ****/

#if 0		// No more used
int fs_logger(UINT16 Type, UINT16 uid, UINT16 pid, UINT16 pdb)
{
    int     i;
    int     rc;


    switch(Type) {
        case LOG_FS_EXIT :
        case LOG_GET_ID  :
            /**************************************/
            /***       unsigned short Type      ***/
            /***       unsigned short uid       ***/
            /***       unsigned short pid       ***/
            /***       unsigned short pdb       ***/
            /**************************************/
            i = sizeof(log_fs_exit);
            if (i + BufPtr < BUFMSGSIZ) {
                log_fs_exit *Tmp = (log_fs_exit *)&(BufMsg[BufPtr]);
                Tmp->Type = Type;
                Tmp->uid  = uid;
                Tmp->pid  = pid;
                Tmp->pdb  = pdb;
                BufPtr += i;
            } else {
                log_fs_exit *Tmp = (log_fs_exit *)BufMsg;
                Tmp->Type = Type;
                Tmp->uid  = uid;
                Tmp->pid  = pid;
                Tmp->pdb  = pdb;
                BufPtr = i;
            } /* end if */
            break;

        case LOG_L_malloc :
        case LOG_L_free   :
            /*************************************/
            /***       unsigned short Type      ***/
            /***       unsigned short uid       ***/
            /***       unsigned short seg       ***/
            /***       unsigned short ofs       ***/
            /**************************************/
            i = sizeof(log_fs_exit);
            if (i + BufPtr < BUFMSGSIZ) {
                log_fs_exit *Tmp = (log_fs_exit *)&(BufMsg[BufPtr]);
                Tmp->Type = Type;
                Tmp->uid  = uid;
                Tmp->pid  = pid;
                Tmp->pdb  = pdb;
                BufPtr += i;
            } else {
                log_fs_exit *Tmp = (log_fs_exit *)BufMsg;
                Tmp->Type = Type;
                Tmp->uid  = uid;
                Tmp->pid  = pid;
                Tmp->pdb  = pdb;
                BufPtr = i;
            } /* end if */
            break;

        default :
            break;
    } /* end switch */

    /******************************************************/
    /*** Baisse du sémaphore du log                     ***/
    /******************************************************/
    if ((rc = FSH_SEMCLEAR(&BufSem)) != NO_ERROR) {
        BufOpen = 0;
        return rc;
    } /* end if */
    /******************************************************/

    return NO_ERROR;

}

void log_id(void) {
    int rc;
    id_t  myid;

    if ((rc = FSH_QSYSINFO(2, (pchar)&myid, sizeof(id_t))) != NO_ERROR) {
        fs_log("log_id() erreur FSH_QSYSINFO()");
        return;
    }
    fs_logger(LOG_GET_ID, myid.uid, myid.pid, myid.pdb);
}
#endif

#ifdef FS_DEBUG
int kernel_printf(const char *fmt, ...) {
    va_list arg;
    char Buf[256];
    pchar buf=Buf;
    unsigned short  absolute_tid;

    FSH_QSYSINFO(3, (pchar)&absolute_tid, sizeof(unsigned short));
    sprintf(Buf, "[ %04X ] ", absolute_tid);
    buf += strlen(Buf);
    va_start(arg, fmt);
    vsprintf(buf, fmt, arg);
    va_end(arg);

    return fs_log(Buf);
}
#endif

 

[ RETURN TO DIRECTORY ]