callstub.c
上传用户:andy_li
上传日期:2007-01-06
资源大小:1019k
文件大小:5k
源码类别:

压缩解压

开发平台:

MultiPlatform

  1. #include <qdos.h>
  2. #include <limits.h>
  3. #include <string.h>
  4. struct
  5. {
  6.     short flag1;
  7.     short flag2;
  8.     long offset;            // The offset from &ds to unzipsfx exe
  9.     long sfxlen;            // size of unzipsfx program
  10.     long sfxdsiz;           // data size of unzipsfx program
  11.     long sfxnam;            // Name offset from start of sfxprog
  12.     long ziplen;            // size of zip file
  13. } ds = {0x4afb, 0x4afb, 0};
  14. typedef struct {short len; char chrs[1];} __QP_t;
  15. #define __QA(l) struct {short len; char chrs[(l)+1];}
  16. #define T1 
  17.    "nThis is a self-extracting zip archive. In order to process then" 
  18.    "archive you will be asked to give the name of a temporary directoryn" 
  19.    "which must have at least as much free space as this SFX file.nn" 
  20.    "You will also be asked for the name of the directory to which then" 
  21.    "files are extracted. This directory _MUST_ exist. If you do not given" 
  22.    "an output directory, the current default is used.nnn" 
  23.    "Device/directory for temporary files: "
  24. #define T2 "Device/directory to extract to      : "
  25. #define T1LEN (sizeof(T1)-1)
  26. #define T2LEN (sizeof(T2)-1)
  27. static void xgetcwd (__QP_t *s)
  28. {
  29.     extern char *_sys_var;
  30.     static __QP_t **q;
  31.     if (q = (__QP_t ** q) (_sys_var + 0xAC + 4))
  32.     {
  33.         memcpy (s->chrs, (*q)->chrs, (*q)->len);
  34.         s->len = (*q)->len;
  35.         *(s->chrs+s->len) = 0;
  36.     }
  37. }
  38. int checkdir(__QP_t *dir)
  39. {
  40.     qdirect_t s;
  41.     int r,ch;
  42.     if(dir->len > 1)
  43.     {
  44.         if(*(dir->chrs + dir->len-2) == '_')
  45.         {
  46.             *(dir->chrs + dir->len-1) = 0;
  47.             dir->len--;
  48.         }
  49.         else
  50.         {
  51.             *(dir->chrs + dir->len-1) = '_';
  52.         }
  53.     }
  54.     else
  55.     {
  56.         xgetcwd(dir);
  57.     }
  58.     r = ERR_NF;
  59.     if((ch = io_open(dir->chrs, 4)) > 0)
  60.     {
  61.         if((r = fs_headr(ch, -1, &s, sizeof(s))) > 0)
  62.         {
  63.             r = (s.d_type == 0xff) ? 0 : ERR_NF;
  64.         }
  65.         io_close(ch);
  66.     }
  67.     return r;
  68. }
  69. int makesfx(__QP_t *tmp)
  70. {
  71.     char *p = (char *)&ds;
  72.     char *q;
  73.     char txt[PATH_MAX];
  74.     int fd,r = 0;
  75.     qdirect_t qd;
  76.     memcpy(txt, tmp->chrs, tmp->len);
  77.     memcpy(txt+tmp->len, "SFX_EXE", 8);
  78.     q = p + ds.offset;
  79.     if((fd = io_open(txt, NEW_OVER)) > 0)
  80.     {
  81.         memcpy(txt+tmp->len+4, "DAT", 4);
  82.         memcpy(q+ds.sfxnam, txt, tmp->len+8);
  83.         fs_save(fd, q, ds.sfxlen);
  84.         qd.d_length = ds.sfxlen;
  85.         qd.d_datalen = ds.sfxdsiz;
  86.         qd.d_type = 1;
  87.         fs_heads(fd, -1, &qd, sizeof(qd));
  88.         io_close(fd);
  89.         if((fd = io_open(txt, NEW_OVER)) > 0)
  90.         {
  91.             q += ds.sfxlen;
  92.             fs_save(fd, q, ds.ziplen);
  93.             io_close(fd);
  94.         }
  95.         else r = fd;
  96.     }
  97.     else r = fd;
  98.     return r;
  99. }
  100. #define T3 "nnTo extract the files, run the command "LRUN "
  101. #define T4 "Press any key to exit "
  102. #define T3LEN (sizeof(T3)-1)
  103. #define T4LEN (sizeof(T4)-1)
  104. int unpackit ( __QP_t *tmpdir, __QP_t *outdir, char *basfil, int con)
  105. {
  106.     int ch, r = 0;
  107.     char c;
  108.     memcpy(basfil, tmpdir->chrs,tmpdir->len);
  109.     memcpy(basfil+tmpdir->len,"SFX_BAS", 8);
  110.     if((ch = io_open(basfil, NEW_OVER)) > 0)
  111.     {
  112.         char *p,txt[80];
  113.         int l;
  114.         p = txt;
  115.         *p++ = 'E';
  116.         *p++ = 'W';
  117.         *p++ = ' ';
  118.         memcpy(p, tmpdir->chrs, tmpdir->len);
  119.         p += tmpdir->len;
  120.         memcpy(p, "SFX_EXE;'-d ", 12);
  121.         p += 12;
  122.         memcpy(p, outdir->chrs, outdir->len);
  123.         p += outdir->len;
  124.         *p++ = ''';
  125.         *p++ = 'n';
  126.         io_sstrg(ch, -1, txt, (int)(p-txt));
  127.         memcpy(txt, "delete ", 7);
  128.         p = txt + 7;
  129.         memcpy(p, tmpdir->chrs, tmpdir->len);
  130.         p += tmpdir->len;
  131.         memcpy(p, "SFX_EXEn", 8);
  132.         p += 4;
  133.         l = (int)(p+4-txt);
  134.         io_sstrg(ch, -1, txt, l);
  135.         memcpy(p, "DATn", 4);
  136.         io_sstrg(ch, -1, txt, l);
  137.         memcpy(p, "BASn", 4);
  138.         io_sstrg(ch, -1, txt, l);
  139.         io_close(ch);
  140.         makesfx((__QP_t *)tmpdir);
  141.     }
  142.     else r = ch;
  143.     if(r == 0)
  144.     {
  145.         char t3[80];
  146.         char *p;
  147.         p = t3;
  148.         memcpy(p, T3, T3LEN);
  149.         p += T3LEN;
  150.         memcpy (p, basfil, tmpdir->len+7);
  151.         p += tmpdir->len+7;
  152.         *p++ = '"';
  153.         *p++ = 'n';
  154.         io_sstrg(con, -1, t3, (int)(p-t3));
  155.     }
  156.     io_sstrg(con, -1, T4, T4LEN);
  157.     io_fbyte(con, (5*60*50), &c);
  158.     return r;
  159. }
  160. int main(void)
  161. {
  162.     int con;
  163.     int r,n;
  164.     __QA(PATH_MAX) tmpdir;
  165.     __QA(PATH_MAX) outdir;
  166.     char basfil[PATH_MAX];
  167.     con = io_open("con_480x160a16x38", 0);
  168.     sd_bordr(con, -1, 7, 2);
  169.     sd_clear(con, -1);
  170.     sd_cure (con, -1);
  171.     io_sstrg(con, -1, T1, T1LEN);
  172.     if((tmpdir.len = io_fline(con, -1, tmpdir.chrs, PATH_MAX-1)) > 1)
  173.     {
  174.         if((r = checkdir((__QP_t *)&tmpdir)) == 0)
  175.         {
  176.             io_sstrg(con, -1, T2, T2LEN);
  177.             if((outdir.len = io_fline(con, -1, outdir.chrs, PATH_MAX-1)) > 0)
  178.             {
  179.                 if((r = checkdir((__QP_t *)&outdir)) == 0)
  180.                 {
  181.                     r = unpackit ((__QP_t *)&tmpdir, (__QP_t *)&outdir,
  182.                                     basfil, con);
  183.                 }
  184.             }
  185.         }
  186.     }
  187.     sd_bordr(con, -1, 0, 0);
  188.     sd_clear(con, -1);
  189.     io_close(con);
  190.     return r;
  191. }