Subversion Repositories SvarDOS

Rev

Rev 226 | Rev 237 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
219 mateuszvis 1
/*
236 mateuszvis 2
 * PKGINST - lightweigth SvarDOS package installer
3
 * Copyright (C) 2015-2021 Mateusz Viste
219 mateuszvis 4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the "Software"),
7
 * to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following conditions:
11
 *
12
 * The above copyright notice and this permission notice shall be included in
13
 * all copies or substantial portions of the Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
 * IN THE SOFTWARE.
22
 */
23
 
24
 
25
#include <stdio.h>    /* printf() */
26
#include <stdlib.h>   /* malloc() and friends */
27
#include <string.h>   /* strcasecmp() */
28
 
29
#include "libunzip.h"
30
#include "pkginst.h"
31
#include "pkgrem.h"
32
#include "readenv.h"
33
#include "version.h"
34
 
35
 
36
enum ACTIONTYPES {
37
  ACTION_INSTALL,
38
  ACTION_REMOVE,
39
  ACTION_HELP
40
};
41
 
42
 
43
static int showhelp(void) {
44
  printf("FDINST v" PVER " Copyright (C) " PDATE " Mateusz Viste\n"
45
         "\n"
46
         "FDINST is a lightweigth package installer for FreeDOS. It is an alternative\n"
47
         "to FDNPKG, when only basic, local install/remove actions are necessary. FDINST\n"
48
         "is a 16-bit, 8086-compatible application running in real mode.\n"
49
         "\n"
50
         "Usage: FDINST install package.zip\n"
51
         "       FDINST remove package\n"
52
         "\n"
53
         "FDINST is published under the MIT license, and shares most of its source code\n"
54
         "with FDNPKG to guarantee consistent behaviour of both tools. It also uses\n"
55
         "FDNPKG's configuration file.\n"
56
         );
57
  return(1);
58
}
59
 
60
 
61
static enum ACTIONTYPES parsearg(int argc, char **argv) {
62
  /* I expect exactly 2 arguments (ie argc == 3) */
63
  if (argc != 3) return(ACTION_HELP);
226 mateuszvis 64
 
219 mateuszvis 65
  /* look for valid actions */
66
  if (strcasecmp(argv[1], "install") == 0) {
226 mateuszvis 67
    return(ACTION_INSTALL);
219 mateuszvis 68
  } else if (strcasecmp(argv[1], "remove") == 0) {
226 mateuszvis 69
    return(ACTION_REMOVE);
70
  } else {
71
    return(ACTION_HELP);
219 mateuszvis 72
  }
73
}
74
 
75
 
236 mateuszvis 76
static int pkginst(const char *file, int flags, const char *dosdir, struct customdirs *dirlist) {
219 mateuszvis 77
  char pkgname[32];
78
  int t, lastpathdelim = -1, u = 0;
79
  struct ziplist *zipfileidx;
80
  FILE *zipfilefd;
81
  for (t = 0; file[t] != 0; t++) {
82
    if ((file[t] == '/') || (file[t] == '\\')) lastpathdelim = t;
83
  }
84
  /* copy the filename into pkgname (without path elements) */
85
  for (t = lastpathdelim + 1; file[t] != 0; t++) pkgname[u++] = file[t];
86
  pkgname[u] = 0; /* terminate the string */
87
  /* truncate the file's extension (.zip) */
88
  for (t = u; t > 0; t--) {
89
    if (pkgname[t] == '.') {
90
      pkgname[t] = 0;
91
      break;
92
    }
93
  }
94
  /* prepare the zip file and install it */
236 mateuszvis 95
  zipfileidx = pkginstall_preparepackage(pkgname, file, flags, &zipfilefd, dosdir, dirlist);
219 mateuszvis 96
  if (zipfileidx != NULL) {
97
    int res = 0;
225 mateuszvis 98
    if (pkginstall_installpackage(pkgname, dosdir, dirlist, zipfileidx, zipfilefd) != 0) res = 1;
219 mateuszvis 99
    fclose(zipfilefd);
100
    return(res);
101
  } else {
102
    fclose(zipfilefd);
103
    return(1);
104
  }
105
}
106
 
107
 
108
int main(int argc, char **argv) {
109
  int res, flags;
110
  enum ACTIONTYPES action;
236 mateuszvis 111
  char *dosdir, *cfgfile;
219 mateuszvis 112
  struct customdirs *dirlist;
113
 
114
  action = parsearg(argc, argv);
115
  if (action == ACTION_HELP) return(showhelp());
116
 
117
  /* allocate some bits for cfg file's location */
118
  cfgfile = malloc(256);
119
  if (cfgfile == NULL) {
120
    puts("ERROR: Out of memory");
121
    return(1);
122
  }
123
 
124
  /* read all necessary environment variables */
236 mateuszvis 125
  if (readenv(&dosdir, cfgfile, 256) != 0) {
219 mateuszvis 126
    free(cfgfile);
127
    return(1);
128
  }
129
 
130
  /* load configuration */
131
  flags = 0;
132
  dirlist = NULL;
225 mateuszvis 133
  if (loadconf(cfgfile, &dirlist, &flags) < 0) return(5);
219 mateuszvis 134
 
135
  /* free the cfgfile buffer, I won't need the config file's location any more */
136
  free(cfgfile);
137
  cfgfile = NULL;
138
 
139
  switch (action) {
140
    case ACTION_INSTALL:
236 mateuszvis 141
      res = pkginst(argv[2], flags, dosdir, dirlist);
219 mateuszvis 142
      break;
143
    case ACTION_REMOVE:
225 mateuszvis 144
      res = pkgrem(argv[2], dosdir);
219 mateuszvis 145
      break;
146
    default:
147
      res = showhelp();
148
      break;
149
  }
150
 
151
  if (res != 0) return(1);
152
  return(0);
153
}