home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / auucp+-1.02 / fuucp_plus_src.lzh / uucplib / support.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-07  |  5.5 KB  |  226 lines

  1. #include <string.h>
  2. #include "uucpbase.h"
  3. #include "uucpproto.h"
  4.  
  5.  
  6. extern VOID __stdargs SPRINTF(UBYTE *, UBYTE *, ...);
  7.  
  8. /*
  9.  *  TempFile()
  10.  *
  11.  *  Liefert den Zeiger auf einen String zurⁿck.
  12.  *  Dieser kann dann als Name zum temporΣren Anlegen von Dateien benutzt werden.
  13.  *  Der Name enthΣlt den vollen Pfad, relativ zu T:
  14.  *
  15.  *  Achtung: macht Forbid()
  16.  */
  17. UBYTE *__asm _TempFileName(register __a6 struct UUCPBase *UUCPBase)
  18. {
  19.   UBYTE *name; 
  20.   ULONG zaehler;
  21.  
  22.   if((name = UUAllocMem(50, MEMF_CLEAR | MEMF_PUBLIC)) != NULL)
  23.   {
  24.     Forbid();
  25.       zaehler = UUCPBase->TempCounter++;
  26.     Permit();
  27.  
  28.     SPRINTF(name, "T:temp%ld", zaehler);
  29.  
  30.     return name;
  31.   }
  32.   return NULL;
  33. }
  34.   
  35. /*
  36.  *  UUAllocMem()
  37.  *
  38.  *  Alloziert einen Speicherblock in der gewⁿnschten Gr÷▀e und den gewⁿnschten
  39.  *  Anforderungen, und trΣgt diesen in eine Liste ein, damit der Speicher,
  40.  *  falls dies nicht eigenhΣndig getan wurde, bei einem CloseLibrary wieder
  41.  *  freigegeben wird. (als Kennung wird die Taskaddresse verwendet.)
  42.  *
  43.  *  Bei Fehler wird NULL zurⁿckgeliefert.
  44.  */
  45. VOID *__asm _UUAllocMem(register __a6 struct UUCPBase *UUCPBase,
  46.                         register __d0 size,
  47.                         register __d1 ULONG memreqs)
  48. {
  49.   struct MinList *ml;
  50.   struct SignalSemaphore *sm;
  51.  
  52.   struct MyMemNode *memd;
  53.   VOID *buffer;
  54.  
  55.   sm = &UUCPBase->ub_MemList.ml_Semaphore;
  56.   ml = &UUCPBase->ub_MemList.ml_List;
  57.  
  58.  
  59.   if((memd = (struct MyMemNode *)
  60.     AllocMem((ULONG)sizeof(struct MyMemNode), MEMF_PUBLIC | MEMF_CLEAR)) != NULL)
  61.   {
  62.     if((buffer = AllocMem(size, memreqs)) != NULL)
  63.     {
  64.       ObtainSemaphore(sm);
  65.  
  66.       memd->mn_Buf       = buffer;         // Zeiger auf Buffer
  67.       memd->mn_BufLength = size;           // LΣnge
  68.       memd->mn_Owner     = FindTask(NULL); // Addresse des Tasks, der Speicher
  69.                                            // angefordert hat.
  70.       AddHead((struct List *)ml, (struct Node *)memd);
  71.  
  72.       ReleaseSemaphore(sm);
  73.  
  74.       return buffer;
  75.     }
  76.     FreeMem(memd, (ULONG)sizeof(struct MyMemNode));
  77.   }
  78.   return NULL;
  79. }
  80.  
  81. /*
  82.  *  UUFreeMem(void *)
  83.  *
  84.  *  Gibt den angegebenen Speicherblock frei und entfernt den Node
  85.  *  aus der Liste.
  86.  *
  87.  */
  88. VOID __asm _UUFreeMem(register __a6 struct UUCPBase *UUCPBase,
  89.                       register __a0 VOID *buffer)
  90. {
  91.   struct MinList *ml;
  92.   struct SignalSemaphore *sm;
  93.   struct MyMemNode *work_node;
  94.   struct MyMemNode *next_node;
  95.  
  96.   sm = &UUCPBase->ub_MemList.ml_Semaphore;
  97.   ml = &UUCPBase->ub_MemList.ml_List;
  98.  
  99.   ObtainSemaphore(sm);
  100.  
  101.   work_node = (struct MyMemNode *)ml->mlh_Head;
  102.   while(next_node = (struct MyMemNode *)work_node->mn_Node.ln_Succ)
  103.   {
  104.     if(work_node->mn_Buf == buffer)
  105.     {
  106.       FreeMem(work_node->mn_Buf, work_node->mn_BufLength);
  107.  
  108.       // ...dann den Node entfernen...
  109.       Remove((struct Node *)work_node);
  110.  
  111.       // ...und schlie▀lich die Node Struktur freigeben!
  112.       FreeMem(work_node, (ULONG)sizeof(struct MyMemNode));
  113.       break;
  114.     }
  115.     work_node = next_node;
  116.   }
  117.   ReleaseSemaphore(sm);
  118. }
  119.   
  120. /*
  121.  *  UUFreeAllMem(struct Task *)
  122.  *
  123.  *  Gibt allen allozierten Speicher frei, der dem angegebenen Task geh÷rt.
  124.  *  Ist Task == NULL, dann wird der gesamte Speicher freigegeben!
  125.  *
  126.  */
  127. VOID __asm _UUFreeAllMem(register __a6 struct UUCPBase *UUCPBase,
  128.                          register __a0 struct Task *Owner)
  129. {
  130.   struct MinList *ml;
  131.   struct SignalSemaphore *sm;
  132.   struct MyMemNode *work_node;
  133.   struct MyMemNode *next_node;
  134.  
  135.   sm = &UUCPBase->ub_MemList.ml_Semaphore;
  136.   ml = &UUCPBase->ub_MemList.ml_List;
  137.  
  138.   ObtainSemaphore(sm);
  139.  
  140.   work_node = (struct MyMemNode *)ml->mlh_Head;
  141.   while(next_node = (struct MyMemNode *)work_node->mn_Node.ln_Succ)
  142.   {
  143.     /*
  144.         Wenn Owner == NULL, dann alles freigeben.
  145.         Ansonsten nur die Nodes freigeben, die auch dem Task geh÷ren.
  146.      */
  147.     if( Owner == NULL || (Owner != NULL && Owner == work_node->mn_Owner) )
  148.     {
  149.       // erst den Buffer freigeben...
  150.       FreeMem(work_node->mn_Buf, work_node->mn_BufLength);
  151.  
  152.       // ...dann den Node entfernen...
  153.       Remove((struct Node *)work_node);
  154.  
  155.       // ...und schlie▀lich die Node Struktur freigeben!
  156.       FreeMem(work_node, (ULONG)sizeof(struct MyMemNode));
  157.       work_node = next_node;
  158.     }
  159.   }
  160.   ReleaseSemaphore(sm);
  161. }
  162.  
  163. /*
  164.  *  CreatePort()
  165.  *
  166.  *  Standardfunktion einer jeden Library...
  167.  *  Legt einen Message Port an, der public ist, wenn ein Name mit angegeben
  168.  *  wurde.
  169.  */
  170. struct MsgPort *__asm _CreatePort(register __a6 struct UUCPBase *UUCPBase,
  171.                                   register __a0 UBYTE *name,
  172.                                   register __d0 LONG priority)
  173. {
  174.   struct MsgPort *mp;
  175.   LONG sigbit;
  176.  
  177.   if((sigbit = AllocSignal(-1L)) == -1L)
  178.     return NULL;
  179.  
  180.   if((mp = UUAllocMem(sizeof(struct MsgPort), MEMF_CLEAR | MEMF_PUBLIC)) == NULL)
  181.   {
  182.     FreeSignal(sigbit);
  183.     return NULL;
  184.   }
  185.  
  186.   mp->mp_Node.ln_Name = name;
  187.   mp->mp_Node.ln_Pri  = priority;
  188.   mp->mp_Node.ln_Type = NT_MSGPORT;
  189.  
  190.   mp->mp_Flags   = PA_SIGNAL;
  191.   mp->mp_SigBit  = sigbit;
  192.   mp->mp_SigTask = FindTask(NULL);
  193.  
  194.   if(name != NULL)
  195.     AddPort(mp);
  196.   else
  197.     NewList(&(mp->mp_MsgList));
  198.  
  199.   return mp;
  200. }
  201.  
  202. /*
  203.  *
  204.  *  DeletePort(struct MessagePort *)
  205.  *  Entfernt den angegebenen MessagePort.
  206.  *
  207.  */
  208. VOID __asm _DeletePort(register __a6 struct UUCPBase *UUCPBase,
  209.                        register __a0 struct MsgPort *mp)
  210. {
  211.   if(mp->mp_Node.ln_Name != NULL)
  212.     RemPort(mp);
  213.  
  214.   // Die folgenden Zeilen machen es schwierig, den MsgPort ausversehen
  215.   // wieder zu verwenden.
  216.  
  217.   mp->mp_SigTask         = (struct Task *)-1L;
  218.   mp->mp_MsgList.lh_Head = (struct Node *)-1L;
  219.  
  220.   // Signal freigeben
  221.   FreeSignal(mp->mp_SigBit);
  222.  
  223.   // Und Speicher freigeben.
  224.   UUFreeMem(mp);
  225. }
  226.