Subversion Repositories SvarDOS

Rev

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

Rev Author Line No. Line
219 mateuszvis 1
/*
2
 * FDINST - lightweigth FreeDOS package installer
3
 * Copyright (C) 2015-2017 Mateusz Viste
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
  int extpos, i;
63
  enum ACTIONTYPES res = ACTION_HELP;
64
  /* I expect exactly 2 arguments (ie argc == 3) */
65
  if (argc != 3) return(ACTION_HELP);
66
  /* look for valid actions */
67
  if (strcasecmp(argv[1], "install") == 0) {
68
    res = ACTION_INSTALL;
69
  } else if (strcasecmp(argv[1], "remove") == 0) {
70
    res = ACTION_REMOVE;
71
  }
72
  /* the argument should never be empty */
73
  if (argv[2][0] == 0) return(ACTION_INSTALL);
74
  /* for 'install', validate that the extension is '.zip' */
75
  if (res == ACTION_INSTALL) {
76
    /* find where the file's extension starts */
77
    extpos = 0;
78
    for (i = 0; argv[2][i] != 0; i++) {
79
      if (argv[2][i] == '.') extpos = i + 1;
80
    }
81
    if (extpos == 0) return(ACTION_HELP);
82
  }
83
  /* return the result */
84
  return(res);
85
}
86
 
87
 
225 mateuszvis 88
static int pkginst(char *file, int flags, char *dosdir, char *tempdir, struct customdirs *dirlist) {
219 mateuszvis 89
  char pkgname[32];
90
  int t, lastpathdelim = -1, u = 0;
91
  char *buffmem1k;
92
  struct ziplist *zipfileidx;
93
  FILE *zipfilefd;
94
  for (t = 0; file[t] != 0; t++) {
95
    if ((file[t] == '/') || (file[t] == '\\')) lastpathdelim = t;
96
  }
97
  /* copy the filename into pkgname (without path elements) */
98
  for (t = lastpathdelim + 1; file[t] != 0; t++) pkgname[u++] = file[t];
99
  pkgname[u] = 0; /* terminate the string */
100
  /* truncate the file's extension (.zip) */
101
  for (t = u; t > 0; t--) {
102
    if (pkgname[t] == '.') {
103
      pkgname[t] = 0;
104
      break;
105
    }
106
  }
107
  /* allocate some memory for pkginst_preparepackage() to do its job */
108
  buffmem1k = malloc(1024);
109
  if (buffmem1k == NULL) {
110
    puts("ERROR: Out of memory");
111
    return(1);
112
  }
113
  /* prepare the zip file and install it */
225 mateuszvis 114
  zipfileidx = pkginstall_preparepackage(pkgname, file, flags, &zipfilefd, dosdir, dirlist, buffmem1k);
219 mateuszvis 115
  free(buffmem1k);
116
  if (zipfileidx != NULL) {
117
    int res = 0;
225 mateuszvis 118
    if (pkginstall_installpackage(pkgname, dosdir, dirlist, zipfileidx, zipfilefd) != 0) res = 1;
219 mateuszvis 119
    fclose(zipfilefd);
120
    return(res);
121
  } else {
122
    fclose(zipfilefd);
123
    return(1);
124
  }
125
}
126
 
127
 
128
int main(int argc, char **argv) {
129
  int res, flags;
130
  enum ACTIONTYPES action;
131
  char *dosdir, *tempdir, *cfgfile;
132
  struct customdirs *dirlist;
133
 
134
  action = parsearg(argc, argv);
135
  if (action == ACTION_HELP) return(showhelp());
136
 
137
  /* allocate some bits for cfg file's location */
138
  cfgfile = malloc(256);
139
  if (cfgfile == NULL) {
140
    puts("ERROR: Out of memory");
141
    return(1);
142
  }
143
 
144
  /* read all necessary environment variables */
145
  if (readenv(&dosdir, &tempdir, cfgfile, 256) != 0) {
146
    free(cfgfile);
147
    return(1);
148
  }
149
 
150
  /* load configuration */
151
  flags = 0;
152
  dirlist = NULL;
225 mateuszvis 153
  if (loadconf(cfgfile, &dirlist, &flags) < 0) return(5);
219 mateuszvis 154
 
155
  /* free the cfgfile buffer, I won't need the config file's location any more */
156
  free(cfgfile);
157
  cfgfile = NULL;
158
 
159
  switch (action) {
160
    case ACTION_INSTALL:
225 mateuszvis 161
      res = pkginst(argv[2], flags, dosdir, tempdir, dirlist);
219 mateuszvis 162
      break;
163
    case ACTION_REMOVE:
225 mateuszvis 164
      res = pkgrem(argv[2], dosdir);
219 mateuszvis 165
      break;
166
    default:
167
      res = showhelp();
168
      break;
169
  }
170
 
171
  if (res != 0) return(1);
172
  return(0);
173
}