home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / arc / freeze233.lha / amiga.c next >
C/C++ Source or Header  |  1992-05-07  |  4KB  |  182 lines

  1. #include <libraries/dosextens.h>
  2. #include <exec/memory.h>
  3. #include <proto/exec.h>
  4. #include <proto/dos.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <ios1.h>
  9. #include <time.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12.  
  13. int foreground(void) {
  14.     struct Process *pr = (struct Process *)FindTask(NULL);
  15.     struct CommandLineInterface *cli;
  16.     struct UFB *ufb;
  17.     BPTR afh;
  18.  
  19.     if (pr->pr_Task.tc_Node.ln_Type == NT_PROCESS) {
  20.     if (cli = (struct CommandLineInterface *)BADDR(pr->pr_CLI)) {
  21.         if (cli->cli_Background == DOSFALSE) {
  22.         ufb = (struct UFB *) chkufb(fileno(stderr));
  23.         afh = (BPTR) (ufb->ufbfh);
  24.         return IsInteractive(afh);
  25.         }
  26.     }
  27.     }
  28.     return FALSE;
  29. }
  30.  
  31. /*
  32.  * Function - SendPacket written by Phil Lindsay, Carolyn Scheppner, and Andy
  33.  * Finkel. This function will send a packet of the given type to the Message
  34.  * Port supplied. 
  35.  */
  36.  
  37. static long SendPacket(pid, action, args, nargs)
  38.   struct MsgPort *pid;    /* process indentifier ...
  39.              * (handlers message port ) */
  40.   long  action,        /* packet type ...
  41.              * (what you want handler to do ) */
  42.         args[],        /* a pointer to a argument list */
  43.         nargs;        /* number of arguments in list  */
  44. {
  45.   struct MsgPort *replyport;
  46.   struct StandardPacket *packet;
  47.  
  48.   long  count, *pargs, res1 = 0;
  49.  
  50.   replyport = CreatePort(NULL, 0);
  51.   if (replyport != NULL) {
  52.  
  53.     /* Allocate space for a packet, make it public and clear it */
  54.     packet = (struct StandardPacket *)
  55.     AllocMem(sizeof(struct StandardPacket), MEMF_PUBLIC | MEMF_CLEAR);
  56.     if (packet != NULL) {
  57.  
  58.       packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt);
  59.       packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
  60.       packet->sp_Pkt.dp_Port = replyport;
  61.       packet->sp_Pkt.dp_Type = action;
  62.  
  63.       /* copy the args into the packet */
  64.       pargs = &(packet->sp_Pkt.dp_Arg1);    /* address of first argument */
  65.       for (count = 0; count < nargs; count++)
  66.     pargs[count] = args[count];
  67.  
  68.       PutMsg(pid, (struct Message *)packet);    /* send packet */
  69.  
  70.       WaitPort(replyport);
  71.       GetMsg(replyport);
  72.  
  73.       res1 = packet->sp_Pkt.dp_Res1;
  74.  
  75.       FreeMem(packet, (long) sizeof(struct StandardPacket));
  76.     }
  77.     DeletePort(replyport);
  78.   }
  79.   return (res1);
  80. }
  81.  
  82. #define SECONDS_PER_DAY (60*60*24)
  83. #define FIRST_JAN_1978 2922
  84.  
  85. char *_TZ = "GMT000";
  86.  
  87. void setfiledate(char *name, time_t t) {
  88.     struct DateStamp ds;
  89.     struct FileLock *fl;
  90.     BPTR lock, parent;
  91.     char bstr[32], *ptr;
  92.     int i;
  93.     long Arg[4];
  94.  
  95.     if (lock = Lock(name, SHARED_LOCK)) {
  96.     parent = ParentDir(lock);
  97.  
  98.     for (ptr = name; *ptr; ptr++) {
  99.         if (*ptr == '/' || *ptr == ':') {
  100.         name = ptr+1;
  101.         }
  102.     }
  103.  
  104.     for (i = 0; i < 31; i++) {
  105.         if (*name) {
  106.         bstr[i+1] = *name++;
  107.         } else {
  108.         break;
  109.         }
  110.     }
  111.     *bstr = i;
  112.  
  113.     ds.ds_Days = t / SECONDS_PER_DAY - FIRST_JAN_1978;
  114.     ds.ds_Minute = t % SECONDS_PER_DAY / 60;
  115.     ds.ds_Tick = t % 60 * TICKS_PER_SECOND;
  116.  
  117.     Arg[0] = 0;
  118.     Arg[1] = parent;
  119.     Arg[2] = (long)bstr >> 2;
  120.     Arg[3] = (long)&ds;
  121.  
  122.     fl = (struct FileLock *)BADDR(lock);
  123.  
  124.     SendPacket(fl->fl_Task, ACTION_SET_DATE, Arg, 4);
  125.  
  126.     UnLock(parent);
  127.     UnLock(lock);
  128.     }
  129. }
  130.  
  131. char *getfilenote(char *name) {
  132.     static struct FileInfoBlock __aligned fib;
  133.     BPTR lock;
  134.     char *fn = NULL;
  135.  
  136.     if (lock = Lock(name, SHARED_LOCK)) {
  137.     if (Examine(lock, &fib)) {
  138.         fn = fib.fib_Comment;
  139.     }
  140.     UnLock(lock);
  141.     }
  142.     return fn;
  143. }
  144.  
  145. void setfilenote(char *name, char *comment) {
  146.     if (comment) SetComment(name, comment);
  147. }
  148.  
  149. #ifdef TEST
  150. main(int argc, char **argv) {
  151.     char fname[256], *filenote;
  152.     int arg;
  153.     struct stat st;
  154.     FILE *fp;
  155.  
  156.     for (arg = 1; arg < argc; arg++) {
  157.     puts(argv[arg]);
  158.     if (stat(argv[arg], &st) == 0) {
  159.         if (filenote = getfilenote(argv[arg])) {
  160.         sprintf(fname, "%s.F", argv[arg]);
  161.         if (fp = fopen(fname, "w")) {
  162.             fclose(fp);
  163.             setfilenote(fname, filenote);
  164.             setfiledate(fname, st.st_mtime);
  165.             chmod(fname, st.st_mode & 07777);
  166.         } else {
  167.             perror("fopen");
  168.         }
  169.         }
  170.     } else {
  171.         perror("stat");
  172.     }
  173.     }
  174.  
  175.     if (!foreground()) {
  176.     fputs("running in background!\n", stderr);
  177.     }
  178.  
  179.     return 0;
  180. }
  181. #endif
  182.