home *** CD-ROM | disk | FTP | other *** search
- -> GuruLog v1.0
- -> Keeps a log of software failures and recoverable alerts
-
- OPT PREPROCESS,OSVERSION=37
-
- MODULE 'dos/datetime', 'dos/dos', 'dos/dosextens', 'exec/alerts',
- 'exec/execbase', 'exec/memory', 'exec/nodes', 'exec/tasks',
- 'hardware/blit', 'hardware/custom', 'hardware/dmabits',
- '*hex', '*clr'
-
- #define TEMPLATE 'LOGFILE/A,GURUDAT,TASKNAME/S'
- ENUM OPT_FILE, OPT_DAT, OPT_TASK, OPT_COUNT
- RAISE "ARGS" IF ReadArgs()=NIL
-
- DEF args[OPT_COUNT]:ARRAY OF LONG, rdargs=NIL,
- gurucode, deadtask:PTR TO process
-
- PROC main() HANDLE
- DEF fh=NIL, by[128]:STRING, cause[256]:STRING, task[256]:STRING, s,l,
- datebuf[LEN_DATSTRING]:STRING, timebuf[LEN_DATSTRING]:STRING,
- daybuf[LEN_DATSTRING]:STRING, dt:datetime
-
- /* get the two vital bits of magic... */
- gurucode:=steallong($100)
- deadtask:=steallong($104)
- IF (gurucode=0) OR (deadtask=0) THEN RETURN
-
- /* read in arguments */
- clr(args,OPT_COUNT*4); rdargs:=ReadArgs(TEMPLATE,args,NIL)
-
- /* try to copy the task's name, if we are allowed to */
- IF args[OPT_TASK]
- s,l:=taskname(deadtask)
- StrCopy(task,s,l)
- ELSE
- StrCopy(task,'Unknown')
- ENDIF
-
- /* find out the date */
- dt.strday:=daybuf; dt.strdate:=datebuf; dt.strtime:=timebuf; dt.flags:=0
- DateStamp(dt); DateToStr(dt)
-
- /* attempt to describe the error */
- StrCopy(by,'Unknown')
- StrCopy(cause,'couldn\at load MCP.gurudat!')
- IF args[OPT_DAT] THEN describe_error(by,cause,args[OPT_DAT])
-
- /* log the error */
- IF fh:=Open(args[OPT_FILE],MODE_READWRITE)
- /* if an empty/new file, then write a 'header', */
- /* otherwise seek to the end of the file */
- IF FileLength(args[OPT_FILE])<1
- SetIoErr(0)
- VfPrintf(fh,
- ' MCP95 by PiRATEsCUM, producing crashtools for Work'+
- 'bench lusers since 1993.\n============================'+
- '======================================================\n',
- NIL)
- ELSE
- Seek(fh,0,OFFSET_END)
- ENDIF
- VfPrintf(fh,
- 'Date : \s \s \s\n'+
- 'Task : \z\h[8] "\s"\n'+
- 'Error : \z\h[8] (\s)\n'+
- 'By : \s\nCause : \s\n'+
- '----------------------------------------'+
- '----------------------------------------\n', [
- daybuf, datebuf, timebuf,
- deadtask, task,
- gurucode, IF gurucode AND AT_DEADEND THEN 'DEADEND' ELSE 'Recoverable',
- by, cause
- ])
- ENDIF
-
- Raise()
- EXCEPT
- IF fh THEN Close(fh)
- IF rdargs THEN FreeArgs(rdargs)
-
- PrintFault(IoErr(),NIL)
- CleanUp(IF exception THEN RETURN_ERROR ELSE RETURN_OK)
- ENDPROC
-
- ->-----------------------------------------------------------------------------
-
- -> looks for the name of the process/task - if it's valid!
- -> WARNING: probes memory whether it's owned by us or not
- PROC taskname(task:PTR TO process)
- DEF type,n,name,valid,c,len,cli:PTR TO commandlineinterface
- IF TypeOfMem(task)
- type:=task.task.ln.type
- IF type=NT_TASK
- name:=task.task.ln.name
- IF TypeOfMem(name)
- n:=0
- valid:=FALSE
- REPEAT
- c:=name[n]
- IF c=0 THEN valid:=TRUE
- INC n
- UNTIL (n>255) OR ((c<32) AND (c<>0)) OR ((c>=128) AND (c<160))
- IF valid THEN RETURN name,n
- ENDIF
- ENDIF
- IF type=NT_PROCESS
- cli:=BADDR(task.cli)
- IF TypeOfMem(cli)
- name:=BADDR(cli.commandname)
- IF TypeOfMem(name)
- len:=name[0]
- n:=1
- valid:=FALSE
- REPEAT
- c:=name[n]
- IF n=len THEN valid:=TRUE
- INC n
- UNTIL (n>len) OR ((c<32) AND (c<>0)) OR ((c>=128) AND (c<160))
- IF valid THEN RETURN name+1,len
- ENDIF
- ENDIF
- ENDIF
- ENDIF
- ENDPROC 'Unknown',7
-
- ->-----------------------------------------------------------------------------
-
- /*
- * +---------------+----------------+--------------------------------+
- * |D| SubSysId | General Error | SubSystem Specific Error |
- * +---------------+----------------+--------------------------------+
- * 1 7 bits 8 bits 16 bits
- *
- * D: DeadEnd alert
- * SubSysId: indicates ROM subsystem number.
- * General Error: roughly indicates what the error was
- * Specific Error: indicates more detail
- */
-
- PROC describe_error(by, cause, file)
- DEF temp[300]:STRING, fh, code, ok,
- general[256]:STRING, specific[256]:STRING,
- subs, genc, spec, guru
-
- IF (fh:=Open(file, MODE_OLDFILE))=NIL THEN RETURN
-
- guru:=gurucode AND $7FFFFFFF
- subs:=gurucode AND $7F000000
- genc:=gurucode AND $00FF0000
- spec:=gurucode AND $0000FFFF
-
- StrCopy(cause,'')
- WHILE Fgets(fh, temp, StrMax(temp)-1)
- SetStr(temp,StrLen(temp)-1)
- IF StrLen(temp)>9
- code,ok:=hex(temp)
- code:=code AND $7FFFFFFF
- IF ok
- IF code=subs THEN StrCopy(by,temp+9)
- IF code=guru THEN StrCopy(cause,temp+9)
- IF code=genc AND genc THEN StrCopy(general,temp+9)
- IF code=spec AND spec THEN StrCopy(specific,temp+9)
- ENDIF
- ENDIF
- ENDWHILE
- IF (StrLen(cause)=0) AND StrLen(general) THEN StringF(cause, '\s\s\s',
- general,
- IF StrLen(specific) THEN ' ' ELSE '',
- IF StrLen(specific) THEN specific ELSE ''
- )
- Close(fh)
- ENDPROC
-
- ->-----------------------------------------------------------------------------
-
- -> a highly cut-down version of stealchip.e
- PROC steallong(src)
- DEF mem, c:PTR TO custom, ret
- IF (mem:=AllocVec(8,MEMF_CHIP))=NIL THEN RETURN 0
- OwnBlitter(); WaitBlit()
- c:=CUSTOMADDR
- c.dmacon:=DMAF_SETCLR OR DMAF_MASTER OR DMAF_BLITTER
- c.bltcon0:=BC0F_SRCA OR BC0F_DEST OR A_TO_D
- c.bltcon1:=0
- c.bltafwm:=-1; c.bltalwm:=-1
- c.bltamod:=0; c.bltdmod:=0
- c.bltapt:=src
- c.bltdpt:=mem
- c.bltsize:=$81 -> Shl(4/2,6) OR 1
- WaitBlit(); DisownBlitter(); ret:=Long(mem); FreeVec(mem)
- ENDPROC ret
-
- CHAR '$VER GuruLog 1.0 (31.01.98)\0'