home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.6 / ffcollection-1-6-1993-02.iso / ff_disks / 061-090 / ff_079.lha / ParTask / partask.c < prev   
C/C++ Source or Header  |  1987-06-03  |  2KB  |  100 lines

  1. /*************************************************************************
  2.  
  3.     ParTask.c: Parent task finder
  4.  
  5. Question:
  6.     How can a program know from what CLI it has been launched?
  7.  
  8. It is easy if the program is run by typing the filename, i.e.
  9.  
  10.     CLI> program
  11.  
  12. Using FindTask(NULL) will solve the problem. However, it the program is
  13. run by 'RUN' command, i.e.
  14.  
  15.     CLI> RUN program
  16.  
  17. FindTask() won't help because it is now on a different task.
  18. How you do it then?
  19.  
  20.  
  21. Answer:
  22.     The theory behind this is that every program that run with or without
  23. 'Run' command will shared the SAME console task with the CLI it originated.
  24.  
  25. Pratical purpose:
  26.     Be creative, and you might have a purpose of this example. I did have
  27. a purpose so I tried to do this program the first place. You will see...
  28.  
  29. Author:
  30.     Andry Rachmat
  31.     10715 Roosevelt NE #7
  32.     Seattle, WA 98125
  33.  
  34. Dated:
  35.     May 20, 1987
  36.  
  37. Status:
  38.     Not Copyrighted yet.
  39.  
  40. ****************************************************************************/
  41.  
  42.  
  43. #include <exec/types.h>
  44. #include <exec/tasks.h>
  45. #include <libraries/dosextens.h>
  46.  
  47. #define ROOTNODE    ((struct RootNode *)DOSBase->dl_Root)
  48. #define PROC(task)    ((struct Process *)task)
  49.  
  50. extern struct DosLibrary *DOSBase;
  51. extern struct Process *FindTask();
  52.  
  53. main()
  54. {
  55. register ULONG *tt;
  56. register int i;
  57. register UBYTE *myport;
  58. register struct Task *mytask;
  59. struct Process *myprocess;
  60. long myconsole;
  61. int found=FALSE;
  62.  
  63. tt=(ULONG *)(BADDR(ROOTNODE->rn_TaskArray));
  64.  
  65. myprocess=FindTask(NULL);
  66. myconsole=(long)myprocess->pr_ConsoleTask;
  67.  
  68. /* The following fragment is mostly based on 'ps' by Dewi Williams,
  69.     Thanks Dewi! */
  70.  
  71. Forbid();
  72.  
  73. for(i=1;i<=(int)tt[0];i++){
  74.     if(tt[i]==0L) continue;        /* non existing task */
  75.     myport=(UBYTE *)tt[i];
  76.     mytask=(struct Task *)(myport-(long)sizeof(struct Task));
  77.     if(PROC(mytask)->pr_TaskNum==0L || PROC(mytask)->pr_CLI==NULL) continue;
  78.  
  79.     if(myconsole==(long)PROC(mytask)->pr_ConsoleTask){
  80.  
  81.         /* we are not interested in the background Task */
  82.  
  83.         if(strcmp(mytask->tc_Node.ln_Name,"Initial CLI")==0 ||
  84.             strcmp(mytask->tc_Node.ln_Name,"New CLI")==0){
  85.                found=TRUE;
  86.                printf("My mommy is task %ld: %s\n", 
  87.                 PROC(mytask)->pr_TaskNum, mytask->tc_Node.ln_Name);
  88.                break;
  89.             } /* end if strcmp */
  90.         } /* end if myconsole */
  91.     }
  92. Permit();
  93.  
  94. /* Something strange happening, what you did so it failed to find the parent
  95.     please report to me, I will appreciate it. Thanks */
  96.  
  97. if(!found) printf("Uh, where is my MOM ??\n");
  98.  
  99. }
  100.