diff --git a/Makefile b/Makefile index 65a901cb..aac32e23 100755 --- a/Makefile +++ b/Makefile @@ -24,6 +24,7 @@ # # Changelog # --------- +# 29Oct25 mab add prefix program # 18Sep15 gwb Specifically copy the gcat and GPL.BP directories if a previous # installation exists. (Git issue #90) # 03Sep25 gwb Updated CFLAGS for newer gcc versions. @@ -138,7 +139,7 @@ QMUSERS := $(shell cat /etc/group | grep qmusers) qm: ARCH := qm: BITSIZE := 64 qm: C_FLAGS := $(CSTD) -Wall -Wformat=2 -Wno-format-nonliteral -D_DEFAULT_SOURCE=1 -DLINUX -D_FILE_OFFSET_BITS=64 -I$(GPLSRC) -DGPL -g $(ARCH) -fPIE -qm: $(QMOBJS) qmclilib.so qmtic qmfix qmconv qmidx qmlnxd +qm: $(QMOBJS) qmclilib.so qmtic qmfix qmconv qmidx qmlnxd prefix @echo Linking $@ @cd $(GPLOBJ) @$(COMP) $(ARCH) $(L_FLAGS) $(QMOBJSD) -o $(GPLBIN)qm @@ -146,7 +147,7 @@ qm: $(QMOBJS) qmclilib.so qmtic qmfix qmconv qmidx qmlnxd qm32: ARCH := -m32 qm32: BITSIZE := 32 qm32: C_FLAGS := -Wall -Wformat=2 -Wno-format-nonliteral -DLINUX -D_FILE_OFFSET_BITS=64 -I$(GPLSRC) -DGPL -g $(ARCH) -qm32: $(QMOBJS) qmclilib.so qmtic qmfix qmconv qmidx qmlnxd +qm32: $(QMOBJS) qmclilib.so qmtic qmfix qmconv qmidx qmlnxd prefix @echo Linking $@ @$(COMP) $(ARCH) $(L_FLAGS) $(QMOBJSD) -o $(GPLBIN)qm @@ -163,6 +164,11 @@ qmfix: qmfix.o ctype.o linuxlb.o dh_hash.o inipath.o @echo Linking $@ @$(COMP) $(C_FLAGS) -lc $(GPLOBJ)qmfix.o $(GPLOBJ)ctype.o $(GPLOBJ)linuxlb.o $(GPLOBJ)dh_hash.o $(GPLOBJ)inipath.o -o $(GPLBIN)qmfix +prefix: prefix.o ctype.o linuxlb.o inipath.o + @echo Linking $@ + @$(COMP) $(C_FLAGS) -lc $(GPLOBJ)prefix.o $(GPLOBJ)ctype.o $(GPLOBJ)linuxlb.o $(GPLOBJ)inipath.o -o $(GPLBIN)prefix + + qmconv: qmconv.o ctype.o linuxlb.o dh_hash.o @echo Linking $@ @$(COMP) $(C_FLAGS) -lc $(GPLOBJ)qmconv.o $(GPLOBJ)ctype.o $(GPLOBJ)linuxlb.o $(GPLOBJ)dh_hash.o -o $(GPLBIN)qmconv @@ -211,6 +217,9 @@ qmconv.o: qmconv.c qm.h dh_int.h header.h revstamp.h qmfix.o: qmfix.c qm.h dh_int.h revstamp.h @$(COMP) $(C_FLAGS) -c $< -o $(GPLOBJ)qmfix.o + +prefix.o: prefix.c qm.h dh_int.h revstamp.h + @$(COMP) $(C_FLAGS) -c $< -o $(GPLOBJ)prefix.o qmidx.o: qmidx.c qm.h dh_int.h revstamp.h @$(COMP) $(C_FLAGS) -c $< -o $(GPLOBJ)qmidx.o diff --git a/gplsrc/dh_ak.c b/gplsrc/dh_ak.c index 28dfcaf5..91b5a9d9 100644 --- a/gplsrc/dh_ak.c +++ b/gplsrc/dh_ak.c @@ -21,6 +21,7 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (Scarlet DME): + * 17Oct25 mab Change dyn file prefix to % * 03Sep25 gwb Fix for potential buffer overrun due to an insufficiently sized sprintf() target. * git issue #82 * 06Feb22 gwb Fixed an uninitialized variable warning in ak_read(). @@ -1729,7 +1730,8 @@ Private int16_t create_ak(char *data_path, /* Data file path name */ /* Open primary subfile. We do this outside of the file sharing mechanism to guarantee that we are the only user of the file. */ - sprintf(path, "%s%c~0", data_path, DS); +// 17Oct25 mab Change dyn file prefix to % + sprintf(path, "%s%c%%0", data_path, DS); fu = dio_open(path, DIO_UPDATE); if (!ValidFileHandle(fu)) { dh_err = DHE_FILE_NOT_FOUND; @@ -1787,7 +1789,8 @@ Private int16_t create_ak(char *data_path, /* Data file path name */ strcpy(header.akpath, ak_path); /* Only relevant on first index */ } - sprintf(path, "%s%c~%d", ak_path, DS, subfile); +// 17Oct25 mab Change dyn file prefix to % + sprintf(path, "%s%c%%%d", ak_path, DS, subfile); akfu = dio_open(path, DIO_NEW); if (!ValidFileHandle(akfu)) { dh_err = DHE_AK_CREATE_ERR; @@ -1927,8 +1930,9 @@ Private bool delete_ak(char *pathname, /* File path name */ /* Open primary subfile. We do this outside of the file sharing mechanism to guarantee that we are the only user of the file. */ - - sprintf(path, "%s%c~0", pathname, DS); + +// 17Oct25 mab Change dyn file prefix to % + sprintf(path, "%s%c%%0", pathname, DS); fu = dio_open(path, DIO_UPDATE); if (!ValidFileHandle(fu)) { dh_err = DHE_FILE_NOT_FOUND; @@ -1966,8 +1970,9 @@ Private bool delete_ak(char *pathname, /* File path name */ relocated = (header.akpath[0] != '\0'); /* Delete the AK subfile */ - - sprintf(path, "%s%c~%d", (relocated) ? header.akpath : pathname, DS, (int)(akno + AK_BASE_SUBFILE)); + +// 17Oct25 mab Change dyn file prefix to % + sprintf(path, "%s%c%%%d", (relocated) ? header.akpath : pathname, DS, (int)(akno + AK_BASE_SUBFILE)); if (remove(path) != 0) { dh_err = DHE_AK_DELETE_ERROR; process.os_error = OSError; diff --git a/gplsrc/dh_creat.c b/gplsrc/dh_creat.c index 17884dd2..6d9fe731 100644 --- a/gplsrc/dh_creat.c +++ b/gplsrc/dh_creat.c @@ -21,6 +21,7 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (ScarletDME): + * 17Oct25 mab Change dyn file prefix to % * 28Feb20 gwb Changed integer declarations to be portable across address * space sizes (32 vs 64 bit) * @@ -143,8 +144,9 @@ bool dh_create_file(char path[], } /* Create primary subfile */ - - sprintf(primary_subfile, "%s%c~0", path, DS); + +// 17Oct25 mab Change dyn file prefix to % + sprintf(primary_subfile, "%s%c%%0", path, DS); fu = dio_open(primary_subfile, DIO_NEW); if (!ValidFileHandle(fu)) { @@ -206,7 +208,8 @@ bool dh_create_file(char path[], /* Create overflow subfile */ - sprintf(overflow_subfile, "%s%c~1", path, DS); +// 17Oct25 mab Change dyn file prefix to % + sprintf(overflow_subfile, "%s%c%%1", path, DS); fu = dio_open(overflow_subfile, DIO_NEW); if (!ValidFileHandle(fu)) { diff --git a/gplsrc/dh_file.c b/gplsrc/dh_file.c index d5ebdf93..3326e413 100644 --- a/gplsrc/dh_file.c +++ b/gplsrc/dh_file.c @@ -21,6 +21,8 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (ScarletDME): + + * 17Oct25 mab Change dyn file prefix to % * 15Jan22 gwb Fixed argument formatting issues (CwE-686) * * 29Feb20 gwb Changed LONG_MAX to INT32_MAX. When building for a 64 bit @@ -141,9 +143,10 @@ bool dh_open_subfile(DH_FILE* dh_file, mode = DIO_UPDATE; if ((subfile >= AK_BASE_SUBFILE) && (dh_file->akpath != NULL)) { - sprintf(filename, "%s%c~%d", dh_file->akpath, DS, (int)subfile); +// 17Oct25 mab Change dyn file prefix to % + sprintf(filename, "%s%c%%%d", dh_file->akpath, DS, (int)subfile); } else { - sprintf(filename, "%s%c~%d", pathname, DS, (int)subfile); + sprintf(filename, "%s%c%%%d", pathname, DS, (int)subfile); } dh_file->sf[subfile].fu = dio_open(filename, mode); diff --git a/gplsrc/dh_open.c b/gplsrc/dh_open.c index c8165116..0fbcaea8 100644 --- a/gplsrc/dh_open.c +++ b/gplsrc/dh_open.c @@ -21,6 +21,7 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (ScarletDME): + * 17Oct25 mab Change dyn file prefix to % * 28Feb20 gwb Changed integer declarations to be portable across address * space sizes (32 vs 64 bit) * 22Feb20 gwb Replaced a pair of sprintf() with snprintf() in dh_open(). @@ -138,7 +139,8 @@ DH_FILE* dh_open(char path[]) { /* Open primary subfile */ /* replaced sprintf() -gwb 22Feb20 */ - if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c~0", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { +// 17Oct25 mab Change dyn file prefix to % + if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c%%0", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { /* TODO: this should be added to the system log file. */ k_error("Overflowed directory/filename path length in dh_open()!"); goto exit_dh_open; @@ -197,7 +199,8 @@ DH_FILE* dh_open(char path[]) { /* Open overflow subfile */ /* converted to snprintf() -gwb 22Feb20 */ - if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c~1", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c%%1", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { /* TODO: this should be added to the system log file. */ k_error("Overflowed directory/filename path length in dh_open()!"); goto exit_dh_open; diff --git a/gplsrc/op_dio1.c b/gplsrc/op_dio1.c index 85770651..16bf35e0 100644 --- a/gplsrc/op_dio1.c +++ b/gplsrc/op_dio1.c @@ -21,6 +21,7 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (ScarletDME): + * 17Oct25 mab Change dyn file prefix to % * 28Feb20 gwb Changed integer declarations to be portable across address * space sizes (32 vs 64 bit) * @@ -709,18 +710,20 @@ Private void open_file(bool map_name) /* Map file name via VOC entry */ /* !LINUX! There appears to be no reliable way to do this */ /* Determine file type by examination of the directory. This should contain - a file named ~0 if it is a DH file. Otherwise assume it to be directory. */ + a file named %0 if it is a DH file. Otherwise assume it to be directory. */ if (pathname[strlen(pathname) - 1] == DS) { /* converted to snprintf() -gwb 22Feb20 */ - if (snprintf(s, MAX_PATHNAME_LEN + 1, "%s~0", pathname) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(s, MAX_PATHNAME_LEN + 1, "%s%%0", pathname) >= (MAX_PATHNAME_LEN + 1)) { /* TODO: this error should be sent out to a log file with more info */ k_error("Overflow of path/filename max lengthn in open_file()"); goto exit_op_open; } } else /* converted to snprintf() - gwb 22Feb20 */ - if (snprintf(s, MAX_PATHNAME_LEN + 1,"%s%c~0", pathname, DS) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(s, MAX_PATHNAME_LEN + 1,"%s%c%%0", pathname, DS) >= (MAX_PATHNAME_LEN + 1)) { /* TODO: this error should be sent out to a log file with more info */ k_error("Overflow of path/filename max lengthn in open_file()"); goto exit_op_open; diff --git a/gplsrc/op_seqio.c b/gplsrc/op_seqio.c index 87cc483a..bc2d592f 100644 --- a/gplsrc/op_seqio.c +++ b/gplsrc/op_seqio.c @@ -21,6 +21,7 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (ScarletDME): + * 17Oct25 mab Change dyn file prefix to % * 28Feb20 gwb Changed integer declarations to be portable across address * space sizes (32 vs 64 bit) * @@ -488,11 +489,11 @@ Private void openseq(bool map_name) { process.status = ER_FNF; goto exit_op_openseq; } - + // 17Oct25 mab Change dyn file prefix to % /* Check if it is a directory file. The best we can do here is to check that - it is a directory and that there is no ~0 subfile. */ + it is a directory and that there is no %0 subfile. */ /* converted to snprintf() -gwb 22Feb20 */ - if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c~0", file_name, DS) >= + if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c%%0", file_name, DS) >= (MAX_PATHNAME_LEN + 1)) { /* TODO: this should be logged to disk with more information */ k_error("Overflowed path/filename size in openseq()"); diff --git a/gplsrc/prefix.c b/gplsrc/prefix.c new file mode 100644 index 00000000..cecb9e2a --- /dev/null +++ b/gplsrc/prefix.c @@ -0,0 +1,369 @@ +/* PREFIX.C + * convert dynamic (hashed) files from ~ prefix to % + * assume usage: prefix path_to_account/wildcard* + * based on QM program QMFIX + * QM file fix tool + * Copyright (c) 2007 Ladybridge Systems, All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Ladybridge Systems can be contacted via the www.openqm.com web site. + * + * ScarletDME Wiki: https://scarlet.deltasoft.com + * + * START-HISTORY (ScarletDME): + * 24Oct25 mab Initial release + + * START-CODE + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define Public +#define init(a) = a + +#include "qm.h" +#include "dh_int.h" +#include "revstamp.h" + +#include + +#include +#include "linuxlb.h" + +#define MAX_SUBFILES (AK_BASE_SUBFILE + MAX_INDICES) + + +static u_char cfg_debug = 0; /* DEBUG config parameter */ + + +static FILE *log = NULL; +static bool logging = FALSE; +static char filename[MAX_PATHNAME_LEN + 1] = ""; /* File being processed */ + +int16_t display_lines; /* Available lines for display */ +int16_t emitted_lines; /* Lines emitted */ +static jmp_buf quit_command; +static bool quit = FALSE; + +bool read_qmconfig(void); +bool is_dh_file(void); +bool rename_subfile(int16_t subfile); +void process_file(void); +void fix_file(char *fn); +bool yesno(char *prompt); +void emit(char msg[], ...); +void event_handler(int signum); +char *strupr(char *s); + +/* ====================================================================== + // assume usage: prefix path_to_account/wildcard* + * Where command is issued from within account root directory + * As displayed when sorting accounts file from qmsys + * note - + * The linux shell will replace the * with a list of full qulified file + * names (at least that is what i am told.....) + * ====================================================================== */ + int main(int argc, char *argv[]) { + int status = 1; + int arg; + + set_default_character_maps(); + + display_lines = 24; + + emitted_lines = 0; + + emit( + "[ PREFIX %s The ScarletDME project. " + "]\n\n", + QM_REV_STAMP); + + filename[0] = '\0'; + + if (!read_qmconfig()) + goto exit_qmfix; + + signal(SIGINT, event_handler); + + /* Check command arguments */ + + if (argc == 1) + goto usage; /* No filenames */ + + arg = 1; + while (arg < argc) { + printf("File: %s\n",argv[arg]); + fix_file(argv[arg]); + arg++; + } + +exit_qmfix: + return status; + +usage: + printf("Usage: PREFIX path_to_account\\*\n\n"); + return status; +} + +/* ====================================================================== + fix_file() */ + +void fix_file(char *fn) { + + strcpy(filename, fn); + + if (is_dh_file()) { + process_file(); + } + + return; +} + +/* ====================================================================== + is_dh_file() by looking for ~0 file */ + +bool is_dh_file() { + bool status = FALSE; + char pathname[MAX_PATHNAME_LEN + 1]; + struct stat statbuf; + // converted to snprintf() -gwb 23Feb20 + // rem looking for old style blob name (~0) + if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c~0", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { + emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", pathname); + } + + /* file exist?, if not skip */ + if (stat(pathname, &statbuf) != 0){ + goto exit_is_dh_file; + } + + /* regular file?, if not skip */ + if (!(statbuf.st_mode & S_IFREG)){ + goto exit_is_dh_file; + } + + status = TRUE; + +exit_is_dh_file: + return status; +} + +/* ====================================================================== + process_file() - Process a file */ + +void process_file() { + + int16_t i; + + emit("Processing %s\n", filename); + + if (setjmp(quit_command)) + goto exit_process_file; + + /* look for primary and overflow subfiles, renmae here? */ + + if (rename_subfile(PRIMARY_SUBFILE) != 0) { + perror("Cannot rename primary subfile"); + goto exit_process_file; + } + + if (rename_subfile(OVERFLOW_SUBFILE) != 0) { + perror("Cannot rename overflow subfile"); + goto exit_process_file; + } + + for (i = 0; i < MAX_INDICES; i++) { + rename_subfile(AK_BASE_SUBFILE + i); + } + +exit_process_file: + return; +} + +/* ====================================================================== + rename_subfile() - rename a subfile from ~ to % */ + +bool rename_subfile(int16_t sf) { + char new_path[MAX_PATHNAME_LEN + 1]; // was hardcoded to 160. + char old_path[MAX_PATHNAME_LEN + 1]; // was hardcoded to 160. + struct stat statbuf; + int status; + + if (snprintf(old_path, MAX_PATHNAME_LEN + 1, "%s%c~%d", filename, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { + emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", old_path); + } + + if (snprintf(new_path, MAX_PATHNAME_LEN + 1, "%s%c%%%d", filename, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { + emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", new_path); + } + + /* file exist?, if not skip */ + if (stat(old_path, &statbuf) != 0){ + status = 1; // file does not exist or is not accessable + } else { + emit("Renaming %s to %s\n", old_path,new_path); + status = rename(old_path,new_path); + } + return status; +} + +/* ====================================================================== + read_qmconfig() - Read config file */ + +bool read_qmconfig() { + char path[200 + 1]; + char rec[200 + 1]; + FILE *ini_file; + char section[32 + 1]; + char *p; + int n; + + if (!GetConfigPath(path)) + return FALSE; + + if ((ini_file = fopen(path, "rt")) == NULL) { + fprintf(stderr, "%s not found\n", path); + return FALSE; + } + + section[0] = '\0'; + while (fgets(rec, 200, ini_file) != NULL) { + if ((p = strchr(rec, '\n')) != NULL) + *p = '\0'; + + if ((rec[0] == '#') || (rec[0] == '\0')) + continue; + + if (rec[0] == '[') { + if ((p = strchr(rec, ']')) != NULL) + *p = '\0'; + strcpy(section, rec + 1); + strupr(section); + continue; + } + + if (strcmp(section, "QM") == 0) /* [qm] items */ + { + if (sscanf(rec, "DEBUG=%d", &n) == 1) + cfg_debug = n; + } + } + + fclose(ini_file); + return TRUE; +} + +/* ====================================================================== + emit() - Paginated printf() */ + +void emit(char msg[], ...) { + va_list arg_ptr; + char c; + char text[500]; + char *p; + char *q; + + va_start(arg_ptr, msg); + vsprintf(text, msg, arg_ptr); + va_end(arg_ptr); + + q = text; + do { + if (emitted_lines == display_lines) { + printf("Press return to continue..."); + fflush(stdout); + read(0, &c, 1); + printf("\n"); + + switch (toupper(c)) { + case 'Q': + emitted_lines = 0; + longjmp(quit_command, 1); + break; + + case 'S': + emitted_lines = -1; /* Suppress pagination */ + break; + + default: + emitted_lines = 0; + break; + } + } + + p = strchr(q, '\n'); + if (p == NULL) { + printf("%s", q); + if (logging) + fprintf(log, "%s", q); + } else { + *p = '\0'; + puts(q); + if (logging) + fprintf(log, "%s\n", q); + if (emitted_lines >= 0) + emitted_lines++; + } + + q = p + 1; + } while (p); +} + +/* ====================================================================== */ + +bool yesno(char *prompt) { + char c; + + printf("%s? ", prompt); + fflush(stdout); + do { + read(0, &c, 1); + c = toupper(c); + if (c >= 32) + printf("%c", c); + } while ((c != 'Y') && (c != 'N')); + printf("\n"); + return (c == 'Y'); +} + +/* ====================================================================== + Console event handler */ + +void event_handler(int signum) { + emit("\nQuit\n"); + quit = TRUE; +} + +/* ====================================================================== + strupr() - Convert string to upper case */ + +char *strupr(char *s) { + char *p; + p = s; + while ((*(p++) = UpperCase(*p)) != '\0') { + } + return s; +} + +/* END-CODE */ diff --git a/gplsrc/qmconv.c b/gplsrc/qmconv.c index 040683b3..5563149d 100644 --- a/gplsrc/qmconv.c +++ b/gplsrc/qmconv.c @@ -21,6 +21,7 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (ScarletDME): + * 17Oct25 mab Change dyn file prefix to % * 09Jan22 gwb Fixups for 64 bit builds. (see #ifndef __LP64__ blocks) * * 28Feb20 gwb Changed integer declarations to be portable across address @@ -228,8 +229,9 @@ bool is_dh_file(char* filename) { int dhfu = -1; char pathname[MAX_PATHNAME_LEN + 1]; struct stat statbuf; - - sprintf(pathname, "%s%c~0", filename, DS); + + //* 17Oct25 mab Change dyn file prefix to % + sprintf(pathname, "%s%c%%0", filename, DS); if (stat(pathname, &statbuf) != 0) goto exit_is_dh_file; @@ -747,8 +749,9 @@ int process_file(char* filename) { bool open_subfile(char* filename, int16_t sf) { char path[160 + 1]; - - sprintf(path, "%s%c~%d", filename, DS, (int)sf); + + // 17Oct25 mab Change dyn file prefix to % + sprintf(path, "%s%c%%%d", filename, DS, (int)sf); fu[sf] = open(path, (int)(O_RDWR | O_BINARY), default_access); return (fu[sf] >= 0); } diff --git a/gplsrc/qmfix.c b/gplsrc/qmfix.c index febc615b..b2c01bbe 100644 --- a/gplsrc/qmfix.c +++ b/gplsrc/qmfix.c @@ -21,6 +21,7 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (ScarletDME): + * 17Oct25 mab Change dyn file prefix to % * 12Sep25 gwb Git Issue #86: Uncomment out code that was commented out in error...in 2020. * 03Sep25 gwb Remove K&R-isms. * 15Jan22 gwb Fixed dozens of instances of "Wrong type of arguments to fomatting @@ -390,7 +391,8 @@ bool is_dh_file() { char pathname[MAX_PATHNAME_LEN + 1]; struct stat statbuf; // converted to snprintf() -gwb 23Feb20 - if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c~0", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c%%0", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", pathname); } @@ -2027,11 +2029,13 @@ bool open_subfile(int16_t sf) { char path[MAX_PATHNAME_LEN + 1]; // was hardcoded to 160. // converted to snprintf() -gwb 23Feb20 if ((sf >= AK_BASE_SUBFILE) && (header.akpath[0] != '\0')) { - if (snprintf(path, MAX_PATHNAME_LEN + 1, "%s%c~%d", header.akpath, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(path, MAX_PATHNAME_LEN + 1, "%s%c%%%d", header.akpath, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", path); } } else { - if (snprintf(path, MAX_PATHNAME_LEN + 1, "%s%c~%d", filename, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(path, MAX_PATHNAME_LEN + 1, "%s%c%%%d", filename, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", path); } } @@ -2105,11 +2109,13 @@ bool delete_subfile(int16_t sf) { char path[MAX_PATHNAME_LEN + 1]; // was hardcoded 160 // converted to snprintf() -gwb 23Feb20 if ((sf >= AK_BASE_SUBFILE) && (header.akpath[0] != '0')) { - if (snprintf(path, MAX_PATHNAME_LEN + 1, "%s%c~%d", header.akpath, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(path, MAX_PATHNAME_LEN + 1, "%s%c%%%d", header.akpath, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", path); } } else { - if (snprintf(path, MAX_PATHNAME_LEN + 1, "%s%c~%d", filename, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(path, MAX_PATHNAME_LEN + 1, "%s%c%%%d", filename, DS, (int)sf) >= (MAX_PATHNAME_LEN + 1)) { emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", path); } } @@ -2490,10 +2496,12 @@ bool recover_space() { /* ---------- Overflow subfile - Create a new overflow subfile */ // converted to snprintf() -gwb 23Feb20 - if (snprintf(oldpath, MAX_PATHNAME_LEN + 1, "%s%c~1", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(oldpath, MAX_PATHNAME_LEN + 1, "%s%c%%1", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", oldpath); } - if (snprintf(newpath, MAX_PATHNAME_LEN + 1, "%s%c~~1", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(newpath, MAX_PATHNAME_LEN + 1, "%s%c%%%%1", filename, DS) >= (MAX_PATHNAME_LEN + 1)) { emit("Overflow of max file/pathname size. Truncated to:\n\"%s\"\n", newpath); } ofu = open(newpath, O_RDWR | O_BINARY | O_CREAT, default_access); diff --git a/gplsrc/qmidx.c b/gplsrc/qmidx.c index 20f46ba3..dea6db4e 100644 --- a/gplsrc/qmidx.c +++ b/gplsrc/qmidx.c @@ -21,6 +21,7 @@ * ScarletDME Wiki: https://scarlet.deltasoft.com * * START-HISTORY (ScarletDME): + * 17Oct25 mab Change dyn file prefix to % * 03Sep25 gwb Fix for potential buffer overrun due to an insufficiently sized sprintf() target. * git issue #82 * 15Jan22 gwb Reformatted code. @@ -174,8 +175,9 @@ int main(int argc, char *argv[]) { for (ak = 0; ak < MAX_INDICES; ak++) { if (header.ak_map & (1 << ak)) { // converted to snprintf() -gwb 25Feb20 - if (snprintf(path, MAX_ACCOUNT_NAME_LEN + 1, "%s%c~%d", data_path, DS, SF(ak)) >= (MAX_ACCOUNT_NAME_LEN + 1)) { - printf("Overflowed path/filename buffer. Truncated to:\n%s%c~%d", data_path, DS, SF(ak)); + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(path, MAX_ACCOUNT_NAME_LEN + 1, "%s%c%%%d", data_path, DS, SF(ak)) >= (MAX_ACCOUNT_NAME_LEN + 1)) { + printf("Overflowed path/filename buffer. Truncated to:\n%s%c%%%d", data_path, DS, SF(ak)); } remove(path); } @@ -249,8 +251,9 @@ int main(int argc, char *argv[]) { for (ak = 0; ak < MAX_INDICES; ak++) { if (header.ak_map & (1 << ak)) { // converted to snprintf() -gwb 25Feb20 - if (snprintf(path, MAX_ACCOUNT_NAME_LEN + 1, "%s%c~%d", data_path, DS, SF(ak)) >= (MAX_ACCOUNT_NAME_LEN + 1)) { - printf("Overflowed path/filename buffer. Truncated to:\n%s%c~%d", data_path, DS, SF(ak)); + // 17Oct25 mab Change dyn file prefix to % + if (snprintf(path, MAX_ACCOUNT_NAME_LEN + 1, "%s%c%%%d", data_path, DS, SF(ak)) >= (MAX_ACCOUNT_NAME_LEN + 1)) { + printf("Overflowed path/filename buffer. Truncated to:\n%s%c%%%d", data_path, DS, SF(ak)); } remove(path); } @@ -350,8 +353,10 @@ bool open_primary() { int fno; FILE_ENTRY *fptr; // converted to snprintf() -gwb 25Feb20 - if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c~0", data_path, DS) >= (MAX_PATHNAME_LEN + 1)) { - printf("Overflowed path/filename buffer. Truncated to:\n%s%c~0\n", data_path, DS); + // 17Oct25 mab Change dyn file prefix to % + + if (snprintf(pathname, MAX_PATHNAME_LEN + 1, "%s%c%%0", data_path, DS) >= (MAX_PATHNAME_LEN + 1)) { + printf("Overflowed path/filename buffer. Truncated to:\n%s%c%%0\n", data_path, DS); } /* Check that this file is not currently in use within QM */ @@ -422,7 +427,8 @@ bool cross_check(char *path) { for (ak = 0; ak < MAX_INDICES; ak++) { if (header.ak_map & (1 << ak)) { - sprintf(pathname, "%s%c~%d", (path[0] != '\0') ? path : data_path, DS, SF(ak)); + // 17Oct25 mab Change dyn file prefix to % + sprintf(pathname, "%s%c%%%d", (path[0] != '\0') ? path : data_path, DS, SF(ak)); akfu = open(pathname, (int)(O_RDONLY | O_BINARY), default_access); if (akfu < 0) { printf("Cannot open index subfile %d [%d]\n", SF(ak), errno); @@ -479,8 +485,9 @@ bool copy_indices() { printf("Moving index subfile %d\n", SF(ak)); /* Form source path and open subfile */ + // 17Oct25 mab Change dyn file prefix to % - sprintf(src, "%s%c~%d", (header.akpath[0] != '\0') ? header.akpath : data_path, DS, SF(ak)); + sprintf(src, "%s%c%%%d", (header.akpath[0] != '\0') ? header.akpath : data_path, DS, SF(ak)); src_fu = open(src, (int)(O_RDONLY | O_BINARY), default_access); if (src_fu < 0) { @@ -489,8 +496,9 @@ bool copy_indices() { } /* Form target path and open subfile */ - - sprintf(tgt, "%s%c~%d", (ak_path[0] != '\0') ? ak_path : data_path, DS, SF(ak)); + // 17Oct25 mab Change dyn file prefix to % + + sprintf(tgt, "%s%c%%%d", (ak_path[0] != '\0') ? ak_path : data_path, DS, SF(ak)); tgt_fu = open(tgt, (int)(O_RDWR | O_CREAT | O_EXCL | O_BINARY), default_access); if (tgt_fu < 0) { diff --git a/qmsys/$IPC/~0 b/qmsys/$IPC/%0 similarity index 100% rename from qmsys/$IPC/~0 rename to qmsys/$IPC/%0 diff --git a/qmsys/$IPC/~1 b/qmsys/$IPC/%1 similarity index 100% rename from qmsys/$IPC/~1 rename to qmsys/$IPC/%1 diff --git a/qmsys/$LOGINS/~0 b/qmsys/$LOGINS/%0 similarity index 100% rename from qmsys/$LOGINS/~0 rename to qmsys/$LOGINS/%0 diff --git a/qmsys/$LOGINS/~1 b/qmsys/$LOGINS/%1 similarity index 100% rename from qmsys/$LOGINS/~1 rename to qmsys/$LOGINS/%1 diff --git a/qmsys/$MAP.DIC/~0 b/qmsys/$MAP.DIC/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/$MAP.DIC/~0 rename to qmsys/$MAP.DIC/%0 diff --git a/qmsys/$MAP.DIC/~1 b/qmsys/$MAP.DIC/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/$MAP.DIC/~1 rename to qmsys/$MAP.DIC/%1 diff --git a/qmsys/$MAP/~0 b/qmsys/$MAP/%0 similarity index 100% rename from qmsys/$MAP/~0 rename to qmsys/$MAP/%0 diff --git a/qmsys/$MAP/~1 b/qmsys/$MAP/%1 similarity index 100% rename from qmsys/$MAP/~1 rename to qmsys/$MAP/%1 diff --git a/qmsys/$SCREENS.DIC/~0 b/qmsys/$SCREENS.DIC/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/$SCREENS.DIC/~0 rename to qmsys/$SCREENS.DIC/%0 diff --git a/qmsys/$SCREENS.DIC/~1 b/qmsys/$SCREENS.DIC/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/$SCREENS.DIC/~1 rename to qmsys/$SCREENS.DIC/%1 diff --git a/qmsys/$SCREENS/~0 b/qmsys/$SCREENS/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/$SCREENS/~0 rename to qmsys/$SCREENS/%0 diff --git a/qmsys/$SCREENS/~1 b/qmsys/$SCREENS/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/$SCREENS/~1 rename to qmsys/$SCREENS/%1 diff --git a/qmsys/ACCOUNTS.DIC/~0 b/qmsys/ACCOUNTS.DIC/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/ACCOUNTS.DIC/~0 rename to qmsys/ACCOUNTS.DIC/%0 diff --git a/qmsys/ACCOUNTS.DIC/~1 b/qmsys/ACCOUNTS.DIC/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/ACCOUNTS.DIC/~1 rename to qmsys/ACCOUNTS.DIC/%1 diff --git a/qmsys/ACCOUNTS/~0 b/qmsys/ACCOUNTS/%0 similarity index 100% rename from qmsys/ACCOUNTS/~0 rename to qmsys/ACCOUNTS/%0 diff --git a/qmsys/ACCOUNTS/~1 b/qmsys/ACCOUNTS/%1 similarity index 100% rename from qmsys/ACCOUNTS/~1 rename to qmsys/ACCOUNTS/%1 diff --git a/qmsys/BP/PREF_T b/qmsys/BP/PREF_T new file mode 100644 index 00000000..15a36c2b --- /dev/null +++ b/qmsys/BP/PREF_T @@ -0,0 +1,123 @@ +* +* pref_t +* test changes to dyn file prefix (~ to %) +* assumes TEST_FILE exists +* create some records +* select some records +* delete some records +$define rec_cnt 100000 +DIM recs(26) +* create some dummy record templates +crt 'create template records' +for i = 1 to 26 + rec = '' + imod = mod(i-1,26) ;* char offset A - Z + ltr = char(imod+65) + sz = (i*10) + 300 + rec = str(ltr,sz) + recs(i) = rec +next i + +* +open "TEST_FILE" to tf else abort 'cannot open TEST_FILE' +* +* create some records +crt 'create ':rec_cnt: ' records' +* +for i = 1 to rec_cnt + rec = '' + imod = mod(i,26) + if imod = 0 then imod = 26 + ltr = char(imod+64) + + id = ltr : i + write recs(imod) on tf, id +next i +* +* select some records +* +sselect tf to 1 +crt @SELECTED : ' records selected, read the "A" ones' + +rc = 0 + +next.id: +readnext id from 1 then +* +* only read the 'A' records + if id[1,1] = "A" then + read rec from tf, id then + rc += 1 + end else + crt id: ' not found??!' + input ok + end + end + goto next.id +end +* +crt 'we read ':rc:' "A" records' +*compare some records +crt 'compare records to templates' +* +for i = 1 to rec_cnt + imod = mod(i,26) + if imod = 0 then imod = 26 + ltr = char(imod+64) + id = ltr : i + + read rec from tf, id then + if rec = recs(imod) then + null ;* crt id:' match' + end else + crt Id:' no match!!!!' + input ok + end + end else + crt 'cannot find ':id + input ok + end +next i +* +* deleted some records +* +sselect tf to 1 +crt @SELECTED : ' records selected, delete the "A" ones' + +rc = 0 + +next.del.id: +readnext id from 1 then +* +* only delete the 'A' records + if id[1,1] = "A" then + delete tf ,id + rc += 1 + end + goto next.del.id +end +* +crt 'we deleted ':rc:' "A" records' +* +* look for "A" records +* +sselect tf to 1 +crt @SELECTED : ' records selected, look for the "A" ones' + +rc = 0 + +next.find.id: +readnext id from 1 then +* +* count 'A' records + if id[1,1] = "A" then + crt id : ' found???!' + rc += 1 + end + goto next.find.id +end +* +crt rc : ' "A" records found' +* +crt 'all done folks!' +end diff --git a/qmsys/DICT.DIC/~0 b/qmsys/DICT.DIC/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/DICT.DIC/~0 rename to qmsys/DICT.DIC/%0 diff --git a/qmsys/DICT.DIC/~1 b/qmsys/DICT.DIC/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/DICT.DIC/~1 rename to qmsys/DICT.DIC/%1 diff --git a/qmsys/DIR_DICT/~0 b/qmsys/DIR_DICT/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/DIR_DICT/~0 rename to qmsys/DIR_DICT/%0 diff --git a/qmsys/DIR_DICT/~1 b/qmsys/DIR_DICT/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/DIR_DICT/~1 rename to qmsys/DIR_DICT/%1 diff --git a/qmsys/ERRMSG.DIC/~0 b/qmsys/ERRMSG.DIC/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/ERRMSG.DIC/~0 rename to qmsys/ERRMSG.DIC/%0 diff --git a/qmsys/ERRMSG.DIC/~1 b/qmsys/ERRMSG.DIC/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/ERRMSG.DIC/~1 rename to qmsys/ERRMSG.DIC/%1 diff --git a/qmsys/ERRMSG/~0 b/qmsys/ERRMSG/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/ERRMSG/~0 rename to qmsys/ERRMSG/%0 diff --git a/qmsys/ERRMSG/~1 b/qmsys/ERRMSG/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/ERRMSG/~1 rename to qmsys/ERRMSG/%1 diff --git a/qmsys/GPL.BP/CPROC b/qmsys/GPL.BP/CPROC index 47665ee9..50536c9b 100644 --- a/qmsys/GPL.BP/CPROC +++ b/qmsys/GPL.BP/CPROC @@ -19,6 +19,7 @@ * Ladybridge Systems can be contacted via the www.openqm.com web site. * * START-HISTORY: +* 17 Oct 25 mab as part of dyn file prefix to %, test for converted account on logto * 11 Oct 07 2.6-5 Added trap for very early abort. * 03 Oct 07 2.6-5 Use parse.pathname.tokens() when processing ACCOUNTS record. * 20 Aug 07 2.6-0 Added CMDSTACK parameter. @@ -2527,7 +2528,15 @@ int.logto: display sysmsg(5162) ;* Fatal error : Cannot return to previous account return to abort.cproc end - + + * 17Oct25 mab as part of dyn file prefix to %, test for converted account + if not( ospath(acc.rec:@ds:"VOC":@ds:"%0",OS$EXISTS)) then + display 'Notice - Account is using outdated subfile names, update required.' + if ospath(account.path, OS$CD) then return + display sysmsg(5162) ;* Fatal error : Cannot return to previous account + return to abort.cproc + end + openpath "VOC" to new.voc else display sysmsg(5163) ;* Directory is not a QM account if ospath(account.path, OS$CD) then return diff --git a/qmsys/GPL.BP/CREATEF b/qmsys/GPL.BP/CREATEF index 87dd9f3c..05465997 100644 --- a/qmsys/GPL.BP/CREATEF +++ b/qmsys/GPL.BP/CREATEF @@ -17,6 +17,9 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Ladybridge Systems can be contacted via the www.openqm.com web site. +* +* START-HISTORY (ScarletDME): +* 17Oct25 mab Change dyn file prefix to % * * START-HISTORY: * 02 Nov 06 2.4-15 VOC record types now case insensitive. @@ -326,12 +329,12 @@ $define default.split.load 80 if not(ospath(new.path, OS$MKDIR)) then stop sysmsg(6196, new.path) ;* Unable to create %1 end - - * Move the ~n components down into the new sub directory + * 17Oct25 mab Change dyn file prefix to % + * Move the %n components down into the new sub directory for i = dcount(subfiles, @fm) to 1 step -1 s = subfiles - if s[1,1] = '~' then + if s[1,1] = '%' then if not(osrename(old.path:@ds:s, new.path:@ds:s)) then stop sysmsg(6197, status(), os.error(), old.path:@ds:s) * Error %1.%2 moving %3 diff --git a/qmsys/GPL.BP/LOGIN b/qmsys/GPL.BP/LOGIN index 9f2c40bc..ec425bee 100644 --- a/qmsys/GPL.BP/LOGIN +++ b/qmsys/GPL.BP/LOGIN @@ -19,6 +19,7 @@ * Ladybridge Systems can be contacted via the www.openqm.com web site. * * START-HISTORY: +* 29 Oct 25 mab as part of dyn file prefix mod, test for converted account * 10 Jan 22 gwb Rebranded signon message. * 20 Mar 09 gwb Took the sharp edges off the signon message. * 03 Oct 07 2.6-5 Use parse.pathname.tokens() when processing ACCOUNTS record. @@ -470,10 +471,16 @@ $include keycode.h end case * Open the VOC file - - openpath "VOC" to voc on error - display 'Error ' : status() : ' opening VOC file. Check access rights.' - goto terminate.connection + openpath "VOC" to voc on error display 'Error ' : status() : ' opening VOC file. Check access rights.' ; goto terminate.connection + + then + * 29Oct25 mab as part of dyn file prefix to %, test for converted account + * there is a VOC, is it using the new prefix (%)? + if not( ospath(account.path:@ds:"VOC":@ds:"%0",OS$EXISTS)) then + display 'Notice - Account is using outdated subfile names, update required, Run prefix on account folder.' + goto terminate.connection + end + end else gosub create.account end diff --git a/qmsys/QM.VOCLIB/~0 b/qmsys/QM.VOCLIB/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/QM.VOCLIB/~0 rename to qmsys/QM.VOCLIB/%0 diff --git a/qmsys/QM.VOCLIB/~1 b/qmsys/QM.VOCLIB/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/QM.VOCLIB/~1 rename to qmsys/QM.VOCLIB/%1 diff --git a/qmsys/TEST/$HOLD.DIC/~0 b/qmsys/TEST/$HOLD.DIC/%0 similarity index 100% rename from qmsys/TEST/$HOLD.DIC/~0 rename to qmsys/TEST/$HOLD.DIC/%0 diff --git a/qmsys/TEST/$HOLD.DIC/~1 b/qmsys/TEST/$HOLD.DIC/%1 similarity index 100% rename from qmsys/TEST/$HOLD.DIC/~1 rename to qmsys/TEST/$HOLD.DIC/%1 diff --git a/qmsys/TEST/BP.DIC/~0 b/qmsys/TEST/BP.DIC/%0 similarity index 100% rename from qmsys/TEST/BP.DIC/~0 rename to qmsys/TEST/BP.DIC/%0 diff --git a/qmsys/TEST/BP.DIC/~1 b/qmsys/TEST/BP.DIC/%1 similarity index 100% rename from qmsys/TEST/BP.DIC/~1 rename to qmsys/TEST/BP.DIC/%1 diff --git a/qmsys/TEST/VOC/~0 b/qmsys/TEST/VOC/%0 similarity index 100% rename from qmsys/TEST/VOC/~0 rename to qmsys/TEST/VOC/%0 diff --git a/qmsys/TEST/VOC/~1 b/qmsys/TEST/VOC/%1 similarity index 100% rename from qmsys/TEST/VOC/~1 rename to qmsys/TEST/VOC/%1 diff --git a/qmsys/VOC.DIC/~0 b/qmsys/VOC.DIC/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/VOC.DIC/~0 rename to qmsys/VOC.DIC/%0 diff --git a/qmsys/VOC.DIC/~1 b/qmsys/VOC.DIC/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/VOC.DIC/~1 rename to qmsys/VOC.DIC/%1 diff --git a/qmsys/VOC/~0 b/qmsys/VOC/%0 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/VOC/~0 rename to qmsys/VOC/%0 diff --git a/qmsys/VOC/~1 b/qmsys/VOC/%1 old mode 100755 new mode 100644 similarity index 100% rename from qmsys/VOC/~1 rename to qmsys/VOC/%1 diff --git a/qmsys/gcat/$CPROC b/qmsys/gcat/$CPROC index 2cfd6e8a..4aaa6537 100644 Binary files a/qmsys/gcat/$CPROC and b/qmsys/gcat/$CPROC differ diff --git a/qmsys/gcat/$LOGIN b/qmsys/gcat/$LOGIN index bc84543c..5650dd6c 100644 Binary files a/qmsys/gcat/$LOGIN and b/qmsys/gcat/$LOGIN differ