Subversion Repositories SvarDOS

Rev

Rev 226 | Rev 237 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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