; -------------------------------------------------------------------------------- ; @Title: Menu File for TRACE32 uCLinux Awareness ; @Description: - ; @Keywords: uCLinux menu awareness ; @Author: DIE ; @Copyright: (C) 1989-2021 Lauterbach GmbH, licensed for use with TRACE32(R) only ; -------------------------------------------------------------------------------- ; $Id: uclinux.m 7861 2022-07-29 13:45:42Z amerkle $ NAME "TASK.UCLINUX" IF !MENU.EXIST("TASK.UCLINUX") ( add menu ( POPUP "uCLinux" ( default menuitem "[:objects]Display &Tasks" "TASK.DTask" menuitem "[:objects]Display ps-like" "TASK.PS pid tty time stat cmd" menuitem "[:objects]Display &Modules" "TASK.MODule" popup "[:objects]Display &File System" ( menuitem "[:objects]Display FS Types" "TASK.FS.Types" menuitem "[:objects]Display Mount Points" "TASK.FS.Mount" menuitem "[:objects]Display Mounted Devices" "TASK.FS.MountDevs" menuitem "[:objects]Display /proc" "TASK.FS.PROC" ) separator popup "&Process Debugging" ( menuitem "[:symbols]&Load Symbols..." ( dialog ( header "TASK.sYmbol.LOAD" pos 0. 0. 30. 3. box "Process name" pos 1. 1. 20. 1. procl: defedit "" "" pos 22. 1. 7. 1. button "Browse..." ( PRIVATE &file dialog.file "*" entry %line &file dialog.set procl "&file" ) pos 6. 3. 7. 1. defbutton "Ok" ( PRIVATE &procl &cwd &procl=dialog.string(procl) TASK.sYmbol.LOAD "&procl" dialog.end ) pos 17. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "[:symbols]&Delete Symbols..." ( dialog ( header "TASK.sYmbol.DELete" pos 0. 0. 30. 3. box "Process name" pos 1. 1. 20. 1. procd: defedit "" "" pos 22. 1. 7. 1. button "Browse..." ( PRIVATE &file dialog.file "*" entry %line &file dialog.set procd "&file" ) pos 6. 3. 7. 1. defbutton "Ok" ( PRIVATE &procd &procd=dialog.string(procd) TASK.sYmbol.DELete "&procd" dialog.end ) pos 17. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "Debug Process on main..." ( global &breakaddr &breakaddr=0 if (task.watch.active()==1) ( dialog.ok "Please close TASK.Watch window" "before using this menu item" enddo ) if (task.y.o(autoload)&0x1)!=1 ( dialog.ok "Please configure autoloader" "to check processes" enddo ) dialog ( header "Debug Process on main" pos 0. 0. 24. 3. box "process name" pos 1. 1. 22. 1. proc: defhotedit "" ( if dialog.string(proc)!="" dialog.enable bok else dialog.disable bok ) pos 1. 3. 22. 1. exec: checkbox "send command to TERM window" "" pos 2. 4.5 8. bok: defbutton "Ok" ( local &process &breakaddr screen.always dialog.disable bok dialog.disable proc &process=dialog.string(proc) dialog.set mess "Checking process &process..." if run() Break if task.proc.codeaddr("&process")!=0xffffffff ( sYmbol.AutoLOAD.CLEAR "&process" sYmbol.AutoLoad.CHECK sYmbol.AutoLOAD.TOUCH "&process" if y.exist(\\&process) dialog.ok "Process &process already running." "Symbols loaded." else dialog.ok "Process &process already running." "No symbol file found." JUMPTO close ) dialog.set mess "Please start process &process" &breakaddr=address.offset(set_binfmt) Break.Delete &breakaddr Break.Set C:&breakaddr /CONDition task.proc.codeaddr("&process")!=0xffffffff ON PBREAKAT &breakaddr goto breaked1 Go if dialog.boolean(exec) TERM.OUT "&process" 0x0a stop breaked1: dialog.set mess "Process &process started. Loading symbols..." Break.Delete &breakaddr ON PBREAKAT &breakaddr &breakaddr=0 sYmbol.AutoLOAD.CLEAR "&process" sYmbol.AutoLOAD.CHECK sYmbol.AutoLOAD.TOUCH "&process" Eval 0 sYmbol.ForEach "Eval address.offset(*)" \\&process\*\main &breakaddr=eval() if &breakaddr==0 ( dialog.ok "Symbol 'main' of process &process not found." JUMPTO close ) dialog.set mess "Waiting for reaching main..." Break.Set C:&breakaddr ;sYmbol.ForEach "Break.Set C:" \\&process\*\main ; do not use &breakaddr -- to retain T:/R: ON PBREAKAT &breakaddr goto breaked2 Go stop breaked2: JUMPTO close ) pos 14. 4.5 8. button "Cancel" "JUMPTO close" pos 0. 6. 24. 1. mess: edit "Please enter process name" "" close "JUMPTO close" ) dialog.disable bok dialog.disable mess stop close: if &breakaddr!=0 ( if run() Break Break.Delete &breakaddr ON PBREAKAT &breakaddr &breakaddr=0 ) dialog.end enddo ) addhere popup "&Watch Processes" ( menuitem "[:plus]&Add..." ( dialog ( header "TASK.Watch.Add" pos 0. 0. 24. 3. box "Process name" pos 1. 1. 22. 1. wproca: defedit "" "" pos 2. 3. 7. 1. defbutton "Ok" ( PRIVATE &wproca &wproca=dialog.string(wproca) TASK.Watch.View "&wproca" dialog.end ) pos 15. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "[:remove]&Remove..." ( dialog ( header "TASK.Watch.DELete" pos 0. 0. 24. 3. box "Process name" pos 1. 1. 22. 1. wprocd: defedit "" "" pos 2. 3. 7. 1. defbutton "Ok" ( PRIVATE &wprocd &wprocd=dialog.string(wprocd) TASK.Watch.DELete "&wprocd" dialog.end ) pos 15. 3. 7. 1. button "Cancel" "dialog.end" ) ) ) ;separator ;menuitem "[:manual]Process Debugging Manual" "HELP __RTOS_LINUX__S_User_Processes" ) popup "&Module Debugging" ( menuitem "[:symbols]&Load Symbols..." ( dialog ( header "TASK.sYmbol.LOADMod" pos 0. 0. 30. 3. box "Module name" pos 1. 1. 20. 1. modl: defedit "" "" pos 22. 1. 7. 1. button "Browse..." ( PRIVATE &file dialog.file "*.ko" entry %line &file dialog.set modl "&file" ) pos 6. 3. 7. 1. defbutton "Ok" ( PRIVATE &modl &modl=dialog.string(modl) TASK.sYmbol.LOADMod "&modl" dialog.end ) pos 17. 3. 7. 1. button "Cancel" "dialog.end" ) ) menuitem "[:symbols]&Delete Symbols..." ( dialog ( header "TASK.sYmbol.DELeteMod" pos 0. 0. 30. 3. box "Module name" pos 1. 1. 20. 1. modd: defedit "" "" pos 22. 1. 7. 1. button "Browse..." ( PRIVATE &file dialog.file "*.ko" entry %line &file dialog.set modd "&file" ) pos 6. 3. 7. 1. defbutton "Ok" ( PRIVATE &modd &modd=dialog.string(modd) TASK.sYmbol.DELeteMod "&modd" dialog.end ) pos 17. 3. 7. 1. button "Cancel" "dialog.end" ) ) ) separator popup "[:symbols]&Autoloader" ( menuitem "[:symbols]List Components" "sYmbol.AutoLoad.List" menuitem "[:init]Check Now!" "sYmbol.AutoLoad.CHECK" MENUITEM "[:config]Config" "sYmbol.AutoLOAD.config" menuitem "[:objects]Components" ( dialog ( header "TASK.sYmbol.Option AutoLoad" pos 0. 0. 25. proc: checkbox "Process (Processes)" ( if dialog.boolean(proc) TASK.sYmbol.Option AutoLoad Process else TASK.sYmbol.Option AutoLoad NoProcess ) mod: checkbox "Module (Modules)" ( if dialog.boolean(mod) TASK.sYmbol.Option AutoLoad Module else TASK.sYmbol.Option AutoLoad NoModule ) lib: checkbox "Library (All Libraries)" ( if dialog.boolean(lib) TASK.sYmbol.Option AutoLoad Library else TASK.sYmbol.Option AutoLoad NoLibrary dialog.set clib "FALSE" ) clib: checkbox "CurrLib (Libraries of Current Process)" ( if dialog.boolean(clib) TASK.sYmbol.Option AutoLoad CurrLib else TASK.sYmbol.Option AutoLoad NoLibrary dialog.set lib "FALSE" ) ) dialog.set proc ((task.y.o(autoload)&0x1)!=0) dialog.set mod ((task.y.o(autoload)&0x4)!=0) dialog.set lib ((task.y.o(autoload)&0x2)!=0) dialog.set clib ((task.y.o(autoload)&0x8)!=0) ) ) separator menuitem "[:term]&Linux Terminal" ( if !window.name(term) ( winpos ,,,,,, term TERM ) else wintop term ) menuitem "[:config]Configure Terminal..." ( if window.name(term) dialog.ok "Please close terminal window first!" else ( dialog ( header "TERM.Protocol" pos 0. 0. 9. tp.be: choosebox "BufferE" ( dialog.disable tp.com.dev dialog.disable tp.com.bd dialog.enable tp.be.out dialog.enable tp.be.in ) pos 10. 0. 5. text "out:" pos 15. 0. 6. tp.be.out: edit "T32OUTBUF" "" pos 23. 0. 6. text "in:" pos 29. 0. 6. tp.be.in: edit "T32INBUF" "" pos 0. 1. 9. tp.dcc: choosebox "DCC" ( dialog.disable tp.com.dev dialog.disable tp.com.bd dialog.disable tp.be.out dialog.disable tp.be.in ) pos 0. 2. 9. tp.com: choosebox "COM" ( dialog.disable tp.be.out dialog.disable tp.be.in dialog.enable tp.com.dev dialog.enable tp.com.bd ) pos 10. 2. 5. text "device:" pos 15. 2. 6. tp.com.dev: edit "COM1" "" pos 23. 2. 6. text "baudrate:" pos 29. 2. 6. tp.com.bd: edit "115200." "" pos 9. 3.5 7. defbutton "Ok" ( PRIVATE &tpbeout &tpbein &tpcomdev &tpcombd &tpbeout=dialog.string(tp.be.out) &tpbein=dialog.string(tp.be.in) &tpcomdev=dialog.string(tp.com.dev) &tpcombd=dialog.string(tp.com.bd) if dialog.boolean(tp.be) TERM.METHOD BufferE &tpbeout &tpbein else if dialog.boolean(tp.dcc) TERM.METHOD DCC else if dialog.boolean(tp.com) TERM.METHOD COM &tpcomdev &tpcombd 8 NONE 1STOP NONE dialog.end ) pos 19. 3.5 7. button "Cancel" "dialog.end" ) dialog.disable tp.be.out dialog.disable tp.be.in dialog.disable tp.com.dev dialog.disable tp.com.bd if cpufamily()!="ARM" dialog.disable tp.dcc ) ) separator popup "[:coverage]&Stack Coverage" ( menuitem "[:objects]&List Stacks" ( if icd()||simulator() TASK.STacK.PATtern 0 TASK.STacK ) menuitem "[:plus]Add Task" "TASK.STacK.ADD" menuitem "[:remove]Remove Task" "TASK.STacK.ReMove" enable ice()||fire() menuitem "&Reset Coverage" "TASK.STacK.RESet" ) ) popup "Trace" ( popup "List" ( separator menuitem "[:alist]&Task Switches" "Trace.List List.TASK" menuitem "[:alist]&Default and Tasks" "Trace.List List.TASK DEFault" ) ) popup "Perf" ( separator popup "&Task Runtime" ( menuitem "&Prepare" ( if t.method.analyzer() ( Analyzer.AutoInit on ) if (ice()||fire())&&!a.mode.flow() ( Analyzer.ReProgram ( Sample.Enable if AlphaBreak&&Write ) Break.Delete /Alpha Break.Set C:0x1F:::task.config(magic)++(task.config(magicsize)-1) /Alpha ) if a.mode.flow() ( Break.Delete /TraceEnable Break.Set C:0x1F:::task.config(magic) /TraceEnable ) ) menuitem "[:perf]Show &Numerical" "Trace.STATistic.TASK" menuitem "[:achart]Show as &Timing" "Trace.CHART.TASK" menuitem "[:achart]Tracking with Trace &List" ( Trace.List List.TASK DEFault /Track Trace.CHART.TASK /Track ) ) popup "Task &Function Runtime" ( menuitem "&Prepare" ( if t.method.analyzer() ( Analyzer.AutoInit on Analyzer.STATistic.PreFetch on ) if (ice()||fire())&&!a.mode.flow() ( if a.config.hac() ( Analyzer.ReProgram ( Sample.Enable if AlphaBreak Sample.Enable if BetaBreak Mark.A if AlphaBreak Mark.B if BetaBreak ) ) else ( Analyzer.ReProgram ( Sample.Enable if AlphaBreak||BetaBreak Mark.A if AlphaBreak Mark.B if BetaBreak ) ) Break.Delete /Alpha /Beta /Charly Break.SetFunc Break.Set C:0x1F:::task.config(magic)++(task.config(magicsize)-1) /Alpha ) if a.mode.flow() ( Break.Delete /TraceData Break.Set C:0x1F:::task.config(magic) /TraceData ) ) menuitem "[:perf]Show &Numerical" "Trace.STATistic.TASKFUNC" menuitem "[:perf]Show as &Tree" "Trace.STATistic.TASKTREE" menuitem "[:perf]Show &Detailed Tree" "Trace.STATistic.TASKTREE ALL" menuitem "[:achart]Show as &Timing" "Trace.CHART.TASKFUNC" menuitem "[:alist]Show N&esting" "Trace.List List.TASK FUNC TI.FUNC" ) popup "Task &Status" ( menuitem "&Prepare" ( if t.method.analyzer() ( Analyzer.AutoInit on ) if (ice()||fire())&&!a.mode.flow() ( Analyzer.ReProgram ( Sample.Enable if AlphaBreak&&Write ) Break.Delete /Alpha Break.Set C:0x1F:::task.config(magic)++(task.config(magicsize)-1) /Alpha TASK.TASKState ) ) menuitem "[:perf]Show &Numerical" "Trace.STATistic.TASKSTATE" menuitem "[:achart]Show as &Timing" "Trace.CHART.TASKSTATE" menuitem "[:achart]Tracking with Trace &List" ( Trace.List List.TASK DEFault /Track Trace.CHART.TASKSTATE /Track ) ) ) popup "&Help" ( MENUITEM "[:manual]OS Awareness Manual uCLinux" "HELP __RTOS_UCLINUX_" ) ) menu "task.dt" ( default menuitem "[:objects]Display detailed" ( PRIVATE &address &address=address.offset(track.address()) TASK.DTask &address ) menuitem "[:var]Display task struct" ( PRIVATE &address &address=address.offset(track.address()) Var.View %m %s (struct task_struct*)&address ) separator menuitem "[:varframe]Display Stack Frame" ( PRIVATE &address &address=address.offset(track.address()) Var.Frame /Locals /Caller /Task &address ) menuitem "[:reg]Display Registers" ( PRIVATE &address &address=address.offset(track.address()) Register /Task &address ) menuitem "Switch Context" ( PRIVATE &address &address=address.offset(track.address()) Register.TASK &address ) separator menuitem "[:symbols]Load Process Symbols" "TASK.sYmbol.LOAD track.address()" menuitem "[:symbols]Delete Process Symbols" "TASK.sYmbol.DELete track.address()" menuitem "Add to Watched Processes" ( PRIVATE &address &address=address.offset(track.address()) TASK.Watch.View &address ) menuitem "Delete from Watched Processes" "TASK.Watch.DELete track.address()" separator menuitem "Add to Stack Cov" "TASK.STK.ADD address.offset(track.address())" menuitem "Rm from Stack Cov" "TASK.STK.RM address.offset(track.address())" separator menuitem "[:dump]Dump task entry" ( PRIVATE &address &address=address.offset(track.address()) Data.dump &address /l /dialog ) ) menu "task.mod" ( default ;menuitem "Display detailed" ;( ; &address=address.offset(track.address()) ; TASK.MODule &address ;) menuitem "[:var]Display module struct" ( PRIVATE &address &address=address.offset(track.address()) Var.View %m %s (struct module*)&address ) separator menuitem "[:symbols]Load Module Symbols" "TASK.sYmbol.LOADMod track.address()" menuitem "[:symbols]Delete Module Symbols" "TASK.sYmbol.DELeteMod track.address()" separator menuitem "[:dump]Dump module entry" ( PRIVATE &address &address=address.offset(track.address()) Data.dump &address /l /dialog ) ) menu "task.fs.t" ( default menuitem "[:objects]Display detailed" ( PRIVATE &address &address=address.offset(track.address()) TASK.FS.Types &address ) menuitem "[:var]Display type struct" ( PRIVATE &address &address=address.offset(track.address()) Var.View %m %s (struct file_system_type*)&address ) separator menuitem "[:dump]Dump type entry" ( PRIVATE &address &address=address.offset(track.address()) Data.dump &address /l /dialog ) ) menu "task.fs.md" ( default menuitem "[:objetcs]Display detailed" ( PRIVATE &address &address=address.offset(track.address()) TASK.FS.MountDevs &address ) menuitem "[:var]Display superblock struct" ( PRIVATE &address &address=address.offset(track.address()) Var.View %m %s (struct super_block*)&address ) separator menuitem "[:dump]Dump superblock entry" ( PRIVATE &address &address=address.offset(track.address()) Data.dump &address /l /dialog ) ) menu "task.fs.proc" ( default ;menuitem "Display detailed" ;( ; &address=address.offset(track.address()) ; TASK.FS.PROC &address ;) menuitem "[:var]Display proc struct" ( PRIVATE &address &address=address.offset(track.address()) Var.View %m %s (struct proc_dir_entry*)&address ) separator menuitem "[:dump]Dump proc dir entry" ( PRIVATE &address &address=address.offset(track.address()) Data.dump &address /l /dialog ) ) menu "task.fs.m" ( default ;menuitem "Display detailed" ;( ; &address=address.offset(track.address()) ; TASK.FS.Mount &address ;) menuitem "[:var]Display mount struct" ( PRIVATE &address &address=address.offset(track.address()) Var.View %o %h %s (struct vfsmount*)&address ) separator menuitem "[:dump]Dump mount entry" ( PRIVATE &address &address=address.offset(track.address()) Data.dump &address /l /dialog ) ) menu "task.w" ( default menuitem "[:objetcs]Display Process" ( PRIVATE &address &address=address.offset(track.address()) TASK.DTask &address ) menuitem "[:remove]Delete from List" "TASK.Watch.DELete track.address()" ) ADD ; Buttons for TASK.PS BUTTONS "task.ps" ( MENUITEM "CONFIG" ( DIALOG.view (&+ HEADER "TASK.PS.CONFIG" POS 0. 0. 9. 12. BOX "Sort" POS 1. 1. 7. 1. s.off: CHOOSEBOX "OFF" "TASK.PS.SORT OFF" POS 1. 2. 7. 1. s.magic: CHOOSEBOX "magic" "TASK.PS.SORT MAGIC" POS 1. 3. 7. 1. s.pid: CHOOSEBOX "pid" "TASK.PS.SORT PID" POS 1. 4. 7. 1. s.cmd: CHOOSEBOX "cmd" "TASK.PS.SORT CMD" POS 1. 5. 7. 1. s.mem: CHOOSEBOX "mem" "TASK.PS.SORT MEM" POS 1. 6. 7. 1. s.cpu: CHOOSEBOX "%cpu" "TASK.PS.SORT PCPU" POS 10. 0. 40. 12. BOX "" POS 10. 0. 12. 12. BOX "available" POS 30. 0. 12. 12. BOX "selected" POS 11. 1. 10. 10. avail: LISTBOX "magic,pid,cmd" ( PRIVATE &sAddItem &sAddItem=DIALOG.STRing(avail) TASK.PS.ADD &sAddItem DIALOG.Set avail "" TASK.PS.AVAILABLE() DIALOG.Set selec "&sAddItem" TASK.PS.SELECTED() ) POS 31. 1. 10. 10. selec: LISTBOX "magic,pid,cmd" ( PRIVATE &sDelItem &sDelItem=DIALOG.STRing(selec) TASK.PS.DELete &sDelItem DIALOG.Set avail "&sDelItem" TASK.PS.AVAILABLE() DIALOG.Set selec "" TASK.PS.SELECTED() ) POS 23. 4. 6. 1. BUTTON "->" ( PRIVATE &sAddItem &sAddItem=DIALOG.STRing(avail) IF "&sAddItem"!="" ( TASK.PS.ADD &sAddItem DIALOG.Set avail "" TASK.PS.AVAILABLE() DIALOG.Set selec "&sAddItem" TASK.PS.SELECTED() ) ) POS 23. 6. 6. 1. BUTTON "<-" ( PRIVATE &sDelItem &sDelItem=DIALOG.STRing(selec) IF "&sDelItem"!="" ( TASK.PS.DELete &sDelItem DIALOG.Set avail "&sDelItem" TASK.PS.AVAILABLE() DIALOG.Set selec "" TASK.PS.SELECTED() ) ) POS 43. 4. 6. 1. BUTTON "up" ( PRIVATE &sItem &sItem=DIALOG.STRing(selec) IF "&sItem"!="" ( TASK.PS.UP &sItem DIALOG.Set selec "&sItem" TASK.PS.SELECTED() ) ) POS 43. 6. 6. 1. BUTTON "down" ( PRIVATE &sItem &sItem=DIALOG.STRing(selec) IF "&sItem"!="" ( TASK.PS.DOWN &sItem DIALOG.Set selec "&sItem" TASK.PS.SELECTED() ) ) POS 1. 12. 10. 1. thr: CHECKBOX "show threads" ( IF DIALOG.BOOLEAN(thr) TASK.PS.THREADS ON ELSE TASK.PS.THREADS OFF ) ) PRIVATE &sSort &sSort=TASK.PS.SORT() DIALOG.Set s.&sSort DIALOG.Set avail "" TASK.PS.AVAILABLE() DIALOG.Set selec "" TASK.PS.SELECTED() DIALOG.Set thr TASK.PS.THREADS()!=0 ENDDO ) ) ADD ; Buttons for TASK.DMESG BUTTONS "task.dmesg" ( MENUITEM "[:objects]Detailed" "TASK.DMESG /COLOR /DETAILED" MENUITEM "[:export]Export" ( PRIVATE &sLogfile &nLevels &nFacilities &bDetailed &bUseColors &sLogfile=OS.FILE.JOINPATH(OS.PWD(),"dmesg.txt") &nLevels=TASK.DMESG.VALUES(0) &nFacilities=TASK.DMESG.VALUES(1) &bDetailed=(TASK.DMESG.VALUES(2)&0x1)!=0 &bUseColors=(TASK.DMESG.VALUES(2)&0x2)!=0 DIALOG ( HEADER "Export kernel log" POS 0. 0. 40. 4. BOX "File name" POS 1. 1. 38. 1. LOGFILE: EDIT "" "" POS 1. 2. 38. 1 PRTYPE: PULLDOWN "ASCII,XHTML" ( PRIVATE &sLogfile &sLogfile=DIALOG.STRing(LOGFILE) &sLogfile=STRing.CUT("&sLogfile",-STRing.LENgth(OS.FILE.EXTENSION("&sLogfile"))) IF DIALOG.STRING(PRTYPE)=="ASCII" &sLogfile="&sLogfile"+".txt" ELSE &sLogfile="&sLogfile"+".html" DIALOG.SET LOGFILE "&sLogfile" RETURN ) POS 0. 4. 19. 10. BOX "Log levels" POS 1. 5. 10. 1. L0: CHECKBOX "0-emerg" "" POS 1. 6. 10. 1. L1: CHECKBOX "1-alert" "" POS 1. 7. 10. 1. L2: CHECKBOX "2-crit" "" POS 1. 8. 10. 1. L3: CHECKBOX "3-err" "" POS 1. 9. 10. 1. L4: CHECKBOX "4-warn" "" POS 1. 10. 10. 1. L5: CHECKBOX "5-notice" "" POS 1. 11. 10. 1. L6: CHECKBOX "6-info" "" POS 1. 12. 10. 1. L7: CHECKBOX "7-debug" "" POS 20. 4. 20. 10. BOX "Log facilities" POS 21. 5. 10. 1. F0: CHECKBOX "0-kern" "" POS 21. 6. 10. 1. F1: CHECKBOX "1-user" "" POS 21. 7. 10. 1. F2: CHECKBOX "2-mail" "" POS 21. 8. 10. 1. F3: CHECKBOX "3-daemon" "" POS 21. 9. 10. 1. F4: CHECKBOX "4-auth" "" POS 21. 10. 10. 1. F5: CHECKBOX "5-syslog" "" POS 21. 11. 10. 1. F6: CHECKBOX "6-lpr" "" POS 21. 12. 10. 1. F7: CHECKBOX "7-news" "" POS 1. 14. 38. 1. DET: CHECKBOX "decode facility and level to readable string" "" POS 10. 16. 7. 1. BUTTON "Save" ( PRIVATE &i &sParams &sLogfile &sFileType &nLevels &nFacilities &nSize &sParams="" &i=0. &nLevels=0x0 &nFacilities=0x0 RePeaT 8. ( PRIVATE &sLabel SPRINTF &sLabel "L%u" &i IF DIALOG.BOOLEAN(&sLabel) &nLevels=&nLevels|(0x1<<(&i+1.)) SPRINTF &sLabel "F%u" &i IF DIALOG.BOOLEAN(&sLabel) &nFacilities=&nFacilities|(0x1<<(&i+1.)) &i=&i+1. ) IF (&nLevels!=0x1fe)&&(&nLevels!=0) ( &i=0. RePeaT 8. ( IF (&nLevels&(0x1<<(&i+1.)))!=0 SPRINTF &sParams "%s /Level %u" "&sParams" &i &i=&i+1. ) ) IF (&nFacilities!=0x1fe)&&(&nFacilities!=0) ( &i=0. RePeaT 8. ( IF (&nFacilities&(0x1<<(&i+1.)))!=0 SPRINTF &sParams "%s /Facility %u" "&sParams" &i &i=&i+1. ) ) IF DIALOG.BOOLEAN(DET) &sParams="&sParams"+" /DETAILED" &nSize=TASK.DMESG.VALUES(3) &sFileType=DIALOG.STRing(PRTYPE) &sLogfile=DIALOG.STRing(LOGFILE) PRinter.FileType &sFileType PRinter.File &sLogfile IF &nSize>2000. EXT.MaxVSize &nSize+10. WinPrint.TASK.DMESG &sParams IF &nSize>2000. EXT.MaxVSize 2000. PRINT "Kernel log saved to &sLogfile" DIALOG.END ) POS 20. 16. 7. 1. BUTTON "Cancel" "DIALOG.END" ) DIALOG.SET LOGFILE "&sLogfile" PRIVATE &i &i=0. RePeaT 8. ( PRIVATE &sLabel SPRINTF &sLabel "L%u" &i DIALOG.SET &sLabel (&nLevels&(1<<(&i+1.)))!=0 SPRINTF &sLabel "F%u" &i DIALOG.SET &sLabel (&nFacilities&(1<<(&i+1.)))!=0 &i=&i+1. ) DIALOG.SET DET &bDetailed ENDDO ) ) )