phillip@cbmvax.UUCP (02/17/87)
Here is something I cooked up when I found a program that hard coded devices in a menu. ============================================================================== Phillip Lindsay - Commodore Business Machines - Amiga Technical Support UUCP: {ihnp4|seismo|caip}!cbmvax!phillip - Phone: (215) 431-9180 No warranty is implied or otherwise given in the form of suggestion or example. Any opinions found here are of my making. *********************** CUT HERE #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # makefile # getdisks.c # This archive created: Tue Feb 17 11:13:27 1987 export PATH; PATH=/bin:$PATH echo shar: extracting "'makefile'" '(68 characters)' if test -f 'makefile' then echo shar: will not over-write existing file "'makefile'" else sed 's/^ X//' << \SHAR_EOF > 'makefile' X XCFLAGS = -dMANX +lcd X X Xgetdisks: getdisks.o X ln -w getdisks.o -lc32 SHAR_EOF echo shar: a missing newline was added to "'makefile'" if test 68 -ne "`wc -c < 'makefile'`" then echo shar: error transmitting "'makefile'" '(should have been 68 characters)' fi fi # end of overwriting check echo shar: extracting "'getdisks.c'" '(3670 characters)' if test -f 'getdisks.c' then echo shar: will not over-write existing file "'getdisks.c'" else sed 's/^ X//' << \SHAR_EOF > 'getdisks.c' X/* getdisks.c - Grab all available disk devices and return them to you in a X * simple exec list. The list is made up of named nodes--the "names" X * being the device name. X * X * Phillip Lindsay (c) 1987 Commodore-Amiga Inc. X * You may use this source as long as the copyright notice is left intact. X */ X#include <exec/types.h> X#include <exec/nodes.h> X#include <exec/lists.h> X#include <exec/memory.h> X#include <libraries/dos.h> X#include <libraries/dosextens.h> X#include <libraries/filehandler.h> X X#ifdef MANX X#include <functions.h> X#include <stdio.h> X#else X#include <lattice/stdio.h> X#endif X Xextern struct DosLibrary *DOSBase; X X/* btoc() takes a pointer to a string in BCPL format and converts it to a X * C string. X */ Xvoid *btoc(bstring) Xchar *bstring; X{ X register UBYTE len,count,*cstring; X X cstring = (UBYTE *) bstring; X len = cstring[0]; X for(count=0;count < len;count++) X cstring[count] = cstring[count+1]; X cstring[count] = '\0'; X} X X/* GetNode() will build a node structure for you. It will append memory to the X * node structure for the node name passed. X */ Xstruct Node *GetNode(name,type,pri) Xchar *name; XUBYTE type,pri; X{ X register struct Node *mynode; X register char *myname; X register UBYTE *mymemory; X register ULONG mynamesize; X X mynamesize =( ((ULONG)strlen(name)) ? (ULONG)strlen(name)+1 : 0L ); X X mymemory = (UBYTE *) X AllocMem((ULONG)sizeof(*mynode)+mynamesize,MEMF_PUBLIC | MEMF_CLEAR); X X if(!mymemory) return((struct Node *)NULL); X X mynode = (struct Node *) mymemory; X if(mynamesize) X { X myname = (char *) mymemory+(ULONG)sizeof(*mynode); X strcpy(myname,name); X mynode->ln_Name = myname; X } X mynode->ln_Type = type; X mynode->ln_Pri = pri; X X return(mynode); X} X X/* This function assumes you used GetNode() for node initialization. Will X * free all memory used by node. Make sure you remove node from any list. X */ Xvoid FreeNode(mynode) Xstruct Node *mynode; X{ X register ULONG mymemsize; X X mymemsize = (ULONG) sizeof(*mynode); X mymemsize+= ((mynode->ln_Name) ? (ULONG)strlen(mynode->ln_Name)+1 : 0L); X X FreeMem(mynode,mymemsize); X} X X X/* getdisks() will grab all disk device names in the system device list and X * append an exec node to a given list. The node being named in respect to the X * device. X */ Xvoid getdisks(dlist) Xstruct List *dlist; /* passed a pointer to a initialize exec list */ X{ X extern struct DosLibrary *DOSBase; X struct RootNode *rnode; X struct DosInfo *dinfo; X register struct DeviceNode *dnode; X register struct Node *adisk; X char *bname,name[32]; X X rnode = (struct RootNode *) DOSBase->dl_Root; X dinfo = (struct DosInfo *) BADDR(rnode->rn_Info); X X Forbid(); X for(dnode = (struct DeviceNode *) BADDR(dinfo->di_DevInfo);BADDR(dnode); X dnode = (struct DeviceNode *) BADDR(dnode->dn_Next)) X { X if(!dnode->dn_Type && dnode->dn_Task && BADDR(dnode->dn_Name)) X { X bname = (char *) BADDR(dnode->dn_Name); X movmem(bname,name,(ULONG)bname[0]+1L); X btoc(name); X if((adisk=GetNode(name,0,0))) AddTail(dlist,adisk); X } X } X Permit(); X} X X/* freedisks() will free all nodes in a given list. Function assumes nodes where X * initialized with GetNode(). X */ Xvoid freedisks(dlist) Xstruct List *dlist; X{ X register struct Node *disk; X X while((disk=RemTail(dlist))) X FreeNode(disk); X} X X Xmain() X{ X struct List disks; X struct Node *disk; X X NewList(&disks); /* Initialize list header */ X getdisks(&disks); /* Fill list */ X X/* print any devices in list.... if any */ X if(disks.lh_TailPred != &disks) X for(disk = disks.lh_Head;disk->ln_Succ;disk=disk->ln_Succ) X puts(disk->ln_Name); X X freedisks(&disks); X} SHAR_EOF if test 3670 -ne "`wc -c < 'getdisks.c'`" then echo shar: error transmitting "'getdisks.c'" '(should have been 3670 characters)' fi fi # end of overwriting check # End of shell archive exit 0 -- ============================================================================== Phillip Lindsay - Commodore Business Machines - Amiga Technical Support UUCP: {ihnp4|seismo|caip}!cbmvax!phillip - Phone: (215) 431-9180 No warranty is implied or otherwise given in the form of suggestion or example. Any opinions found here are of my making. /* eof */