Cover old NCP lock compatibility calls
Source release / source-package (push) Successful in 1m39s

This commit is contained in:
Mario Fetka
2026-06-22 12:56:24 +02:00
parent a9df0f7a42
commit ca8cf7928f
3 changed files with 219 additions and 16 deletions
+15 -8
View File
@@ -1280,6 +1280,8 @@ int nw_log_logical_record(int lock_flag,
static char *path_share_lock_files=NULL;
uint8 fn[256];
uint8 fullpath[400];
int original_len = len;
uint8 *original_data = data;
uint32 offset;
LOCK_FILE *lf = NULL;
LOCK_AREA *la = NULL;
@@ -1287,7 +1289,7 @@ int nw_log_logical_record(int lock_flag,
flockd.l_whence = SEEK_SET;
flockd.l_len = 1;
if (lock_flag != -1) {
if (lock_flag > -1) {
if (share_set_logrec_add_rm(lock_flag, timeout, len, data))
return (-0xff);
}
@@ -1319,16 +1321,16 @@ int nw_log_logical_record(int lock_flag,
if (len > 0) {
int i=-1;
if (len > sizeof(fn))
len = sizeof(fn-1);
len = sizeof(fn)-1;
memcpy(fn, data+4, len);
while (++i < len) {
if (fn[i]=='/') {
fn[i] = '-';
if (len < sizeof(fn-1))
if (len < sizeof(fn)-1)
fn[len++] = '_';
} else if (fn[i] == '\0') {
fn[i] = '_';
if (len < sizeof(fn-1))
if (len < sizeof(fn)-1)
fn[len++] = '_';
}
}
@@ -1354,8 +1356,10 @@ int nw_log_logical_record(int lock_flag,
if (!lf) {
int fd;
if (lock_flag < 0) /* unlock */
return(-0xff);
if (lock_flag < 0) { /* unlock */
share_set_logrec_add_rm(lock_flag, timeout, original_len, original_data);
return(0);
}
if (seteuid(0)) {}
fd = open(fullpath, O_RDWR|O_CREAT, 0600);
@@ -1377,8 +1381,10 @@ int nw_log_logical_record(int lock_flag,
la = find_lockarea(lf, offset);
if (!la) {
if (lock_flag < 0) /* unlock */
return (-0xff);
if (lock_flag < 0) { /* unlock */
share_set_logrec_add_rm(lock_flag, timeout, original_len, original_data);
return(0);
}
if (fcntl(lf->fd, F_SETLK, &flockd))
/* already locked by other process */
@@ -1427,6 +1433,7 @@ int nw_log_logical_record(int lock_flag,
root_lf = lf->next;
xfree(lf);
}
share_set_logrec_add_rm(lock_flag, timeout, original_len, original_data);
}
return(0);
}
+27 -8
View File
@@ -765,7 +765,19 @@ int share_set_file_add_rm(int lock_flag, dev_t dev, ino_t inode)
int share_set_logrec_add_rm(int lock_flag, int timeout, int len, char *data)
{
if (lock_flag > -1) {
SHARESET *ps = (SHARESET*)xcmalloc(sizeof(SHARESET));
SHARESET *ps;
for (ps = first_set; ps; ps = ps->next) {
if (ps->type == 2 &&
ps->datalen == len &&
!memcmp(ps->data, data, len)) {
if (lock_flag) {
ps->lock_flag = lock_flag;
ps->timeout = timeout;
}
return(0);
}
}
ps = (SHARESET*)xcmalloc(sizeof(SHARESET));
ps->next = first_set;
first_set = ps;
ps->type = 2;
@@ -773,15 +785,25 @@ int share_set_logrec_add_rm(int lock_flag, int timeout, int len, char *data)
ps->data = xcmalloc(len+1);
memcpy(ps->data, data, len);
ps->lock_flag = lock_flag;
} else if (lock_flag == -2) {
ps->timeout = timeout;
} else if (lock_flag == -1 || lock_flag == -2) {
SHARESET **pset = &first_set;
while (*pset) {
SHARESET *ps = *pset;
*pset = (*pset)->next;
if (2 == ps->type) {
if (ps->type == 2 &&
ps->datalen == len &&
!memcmp(ps->data, data, len)) {
if (lock_flag == -1) {
ps->locked = 0;
pset = &ps->next;
continue;
}
*pset = ps->next;
xfree(ps->data);
xfree(ps);
}
continue;
}
pset = &ps->next;
}
}
return(0);
@@ -861,6 +883,3 @@ int share_handle_lock_sets(int type, int lock_flag, int timeout)
}
return(0);
}
+177
View File
@@ -9,6 +9,8 @@
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <time.h>
#include <unistd.h>
#include <ncp/nwcalls.h>
#include <ncp/ncplib.h>
@@ -35,6 +37,8 @@ static void usage(const char *prog)
" 21/00 Send Broadcast Message (old)\n"
" 21/01 Get Broadcast Message (old)\n"
" 21/02 Disable Broadcasts, 21/03 Enable Broadcasts\n"
" 03-08 old file log/lock/release/clear set\n"
" 09-0E old logical-record log/lock/release/clear set\n"
"\n"
"Example:\n"
" %s -S MARS -U SUPERVISOR -P secret SYS:PUBLIC\n",
@@ -46,6 +50,32 @@ static uint16_t be16_to_cpu(const uint8_t p[2])
return ((uint16_t)p[0] << 8) | (uint16_t)p[1];
}
static void cpu_to_be16(uint8_t p[2], uint16_t v)
{
p[0] = (uint8_t)(v >> 8);
p[1] = (uint8_t)v;
}
static int join_path(char *out, size_t out_size, const char *parent,
const char *leaf)
{
const char *sep = "";
size_t len = strlen(parent);
if (len && parent[len - 1] != ':' && parent[len - 1] != '/' &&
parent[len - 1] != '\\')
sep = "/";
return snprintf(out, out_size, "%s%s%s", parent, sep, leaf) < (int)out_size
? 0 : -1;
}
static void generated_name(char *out, size_t out_size, const char *prefix)
{
unsigned long seed = (unsigned long)time(NULL) ^ (unsigned long)getpid();
snprintf(out, out_size, "%s%06lu", prefix, seed % 1000000UL);
}
static long get_station_number(NWCONN_HANDLE conn, uint8_t *station)
{
uint8_t reply_buf[3];
@@ -120,6 +150,136 @@ static long check_volume_info(NWCONN_HANDLE conn, const char *path)
return 0;
}
static long request_no_reply(NWCONN_HANDLE conn, unsigned int function,
const uint8_t *request, size_t request_len)
{
return NWRequestSimple(conn, function, (void *)request, request_len, NULL);
}
static long check_old_file_locks(NWCONN_HANDLE conn, const char *parent_path)
{
struct ncp_file_info finfo;
char leaf[16];
char full_path[512];
uint8_t request[5 + 255];
uint8_t timeout[2];
size_t path_len;
long err;
generated_name(leaf, sizeof(leaf), "P22F");
if (join_path(full_path, sizeof(full_path), parent_path, leaf))
return NWE_INVALID_PATH;
memset(&finfo, 0, sizeof(finfo));
err = ncp_create_file(conn, 0, full_path, 0, &finfo);
if (err)
return err;
path_len = strlen(full_path);
if (!path_len || path_len > 255) {
(void)ncp_erase_file(conn, 0, full_path, 0);
return NWE_INVALID_PATH;
}
request[0] = 0; /* base directory handle; full volume path follows */
request[1] = 0; /* log only */
cpu_to_be16(request + 2, 0);
cpu_to_be16(timeout, 0);
request[4] = (uint8_t)path_len;
memcpy(request + 5, full_path, path_len);
err = request_no_reply(conn, 0x03, request, 5 + path_len);
if (!err)
err = request_no_reply(conn, 0x04, timeout, sizeof(timeout));
if (!err) {
request[0] = 0;
err = request_no_reply(conn, 0x06, request, 1);
}
if (!err)
err = request_no_reply(conn, 0x04, timeout, sizeof(timeout));
if (!err) {
request[0] = 0;
request[1] = (uint8_t)path_len;
memcpy(request + 2, full_path, path_len);
err = request_no_reply(conn, 0x05, request, 2 + path_len);
}
if (!err)
err = request_no_reply(conn, 0x04, timeout, sizeof(timeout));
if (!err) {
request[0] = 0;
request[1] = (uint8_t)path_len;
memcpy(request + 2, full_path, path_len);
err = request_no_reply(conn, 0x07, request, 2 + path_len);
}
if (!err) {
request[0] = 0;
err = request_no_reply(conn, 0x08, request, 1);
}
(void)ncp_erase_file(conn, 0, full_path, 0);
if (err)
return err;
printf("NCP 03-08 old file log/lock/release/clear path=%s\n", full_path);
return 0;
}
static long check_old_logical_record_locks(NWCONN_HANDLE conn)
{
char name[32];
uint8_t request[4 + 128];
size_t name_len;
long err;
generated_name(name, sizeof(name), "P22L");
name_len = strlen(name);
if (!name_len || name_len > 128)
return NWE_INVALID_PATH;
request[0] = 0; /* log only */
cpu_to_be16(request + 1, 0);
request[3] = (uint8_t)name_len;
memcpy(request + 4, name, name_len);
err = request_no_reply(conn, 0x09, request, 4 + name_len);
if (!err) {
request[0] = 1; /* exclusive lock */
err = request_no_reply(conn, 0x0a, request, 3);
}
if (!err) {
request[0] = 0;
err = request_no_reply(conn, 0x0d, request, 1);
}
if (!err) {
request[0] = 3; /* shared lock */
err = request_no_reply(conn, 0x0a, request, 3);
}
if (!err) {
request[0] = (uint8_t)name_len;
memcpy(request + 1, name, name_len);
err = request_no_reply(conn, 0x0c, request, 1 + name_len);
}
if (!err) {
request[0] = 1;
err = request_no_reply(conn, 0x0a, request, 3);
}
if (!err) {
request[0] = (uint8_t)name_len;
memcpy(request + 1, name, name_len);
err = request_no_reply(conn, 0x0b, request, 1 + name_len);
}
if (!err) {
request[0] = 0;
err = request_no_reply(conn, 0x0e, request, 1);
}
if (err)
return err;
printf("NCP 09-0E old logical-record log/lock/release/clear name=%s\n",
name);
return 0;
}
static long check_datetime(NWCONN_HANDLE conn)
{
uint8_t reply_buf[7];
@@ -271,6 +431,23 @@ int main(int argc, char **argv)
return 1;
}
err = check_old_file_locks(conn, path);
if (err) {
fprintf(stderr, "NCP 03-08 old file lock check failed: error=0x%04x\n",
(unsigned int)err);
ncp_close(conn);
return 1;
}
err = check_old_logical_record_locks(conn);
if (err) {
fprintf(stderr,
"NCP 09-0E old logical-record lock check failed: error=0x%04x\n",
(unsigned int)err);
ncp_close(conn);
return 1;
}
ncp_close(conn);
return 0;
}