mirror of
https://github.com/Stichting-MINIX-Research-Foundation/pkgsrc-ng.git
synced 2025-08-04 02:08:49 -04:00
410 lines
16 KiB
Plaintext
410 lines
16 KiB
Plaintext
$NetBSD: patch-ae,v 1.1 2009/04/09 03:33:13 manu Exp $
|
|
--- src/chirctl.c.orig 2008-06-19 03:27:08.000000000 +0200
|
|
+++ src/chirctl.c 2009-03-28 22:54:07.000000000 +0100
|
|
@@ -29,9 +29,11 @@
|
|
#include <fuse/fuse_opt.h>
|
|
|
|
#else
|
|
|
|
+#ifndef __NetBSD__
|
|
typedef uint64_t cpuset_t;
|
|
+#endif
|
|
|
|
//
|
|
// The lines below are from a patch contributed by Antti Kantee
|
|
// to make ChironFS run on NetBSD
|
|
--- src/chiron-conf.c.orig 2008-06-12 03:55:22.000000000 +0200
|
|
+++ src/chiron-conf.c 2009-03-28 22:54:07.000000000 +0100
|
|
@@ -188,8 +188,13 @@
|
|
fo[i] = 0;
|
|
quiet_mode = 1;
|
|
sprintf(fo+start,"%s",fo+6);
|
|
i = start - 1;
|
|
+ } else if (!strncmp(fo+start,"nochown", 7)) {
|
|
+ fo[i] = 0;
|
|
+ nochown_mode = 1;
|
|
+ sprintf(fo+start,"%s",fo+7);
|
|
+ i = start - 1;
|
|
} else {
|
|
start = i + 1;
|
|
}
|
|
}
|
|
--- src/chirondbg.c.orig 2008-06-15 21:10:49.000000000 +0200
|
|
+++ src/chirondbg.c 2009-03-29 12:14:03.000000000 +0200
|
|
@@ -40,9 +40,11 @@
|
|
#include <fuse/fuse_opt.h>
|
|
|
|
#else
|
|
|
|
+#ifndef __NetBSD__
|
|
typedef uint64_t cpuset_t;
|
|
+#endif
|
|
|
|
//
|
|
// The lines below are from a patch contributed by Antti Kantee
|
|
// to make ChironFS run on NetBSD
|
|
@@ -204,18 +206,24 @@
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
void print_err(int err, char *specifier)
|
|
{
|
|
+ char errbuf[1024];
|
|
+
|
|
if (!quiet_mode) {
|
|
if (specifier==NULL) {
|
|
if (err>0) {
|
|
- fprintf(stderr,"%s\n",strerror(err));
|
|
+ if (strerror_r(err, errbuf, sizeof(errbuf)) != 0)
|
|
+ strncpy(errbuf, "strerror_r() failure", sizeof(errbuf));
|
|
+ fprintf(stderr,"%s\n",errbuf);
|
|
} else {
|
|
fprintf(stderr,"%s\n",errtab[-(err+1)]);
|
|
}
|
|
} else {
|
|
if (err>0) {
|
|
- fprintf(stderr,"%s: %s\n",specifier,strerror(err));
|
|
+ if (strerror_r(err, errbuf, sizeof(errbuf)) != 0)
|
|
+ strncpy(errbuf, "strerror_r() failure", sizeof(errbuf));
|
|
+ fprintf(stderr,"%s: %s\n",specifier,errbuf);
|
|
} else {
|
|
fprintf(stderr,"%s: %s\n",specifier,errtab[-(err+1)]);
|
|
}
|
|
}
|
|
@@ -225,16 +233,17 @@
|
|
|
|
void call_log(char *fnname, char *resource, int err)
|
|
{
|
|
time_t t;
|
|
- struct tm *ptm;
|
|
+ struct tm *ptm, tmbuf;
|
|
char tmstr[20];
|
|
+ char errbuf[1024];
|
|
|
|
if (logfd!=NULL) {
|
|
attach_log();
|
|
flockfile(logfd);
|
|
t = time(NULL);
|
|
- ptm = localtime(&t);
|
|
+ ptm = localtime_r(&t, &tmbuf);
|
|
strftime(tmstr,19,"%Y/%m/%d %H:%M ",ptm);
|
|
fputs(tmstr,logfd);
|
|
fputs(fnname,logfd);
|
|
if (err!=CHIRONFS_ADM_FORCED) {
|
|
@@ -245,9 +254,11 @@
|
|
fputs(resource,logfd);
|
|
if (err) {
|
|
fputs(" ",logfd);
|
|
if (err>0) {
|
|
- fputs(strerror(err),logfd);
|
|
+ if (strerror_r(err, errbuf, sizeof(errbuf)) != 0)
|
|
+ strncpy(errbuf, "strerror_r() failure", sizeof(errbuf));
|
|
+ fputs(errbuf,logfd);
|
|
} else {
|
|
fputs(errtab[-(err+1)],logfd);
|
|
}
|
|
}
|
|
--- src/chironfn.c.orig 2008-06-09 20:02:39.000000000 +0200
|
|
+++ src/chironfn.c 2009-03-29 11:46:25.000000000 +0200
|
|
@@ -104,4 +104,79 @@
|
|
dbg(("\nxlate:%s",rname));
|
|
return(rname);
|
|
}
|
|
|
|
+/*
|
|
+ * chiron_dirname is derived from NetBSD's libc dirname(3), with
|
|
+ * changes from Emmanuel Dreyfus <manu@netbsd.org>. This code is
|
|
+ * subject to the 2-clauses BSD license below
|
|
+ */
|
|
+
|
|
+/*-
|
|
+ * Copyright (c) 1997, 2002 The NetBSD Foundation, Inc.
|
|
+ * All rights reserved.
|
|
+ *
|
|
+ * This code is derived from software contributed to The NetBSD Foundation
|
|
+ * by Klaus Klein and Jason R. Thorpe.
|
|
+ *
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
+ * modification, are permitted provided that the following conditions
|
|
+ * are met:
|
|
+ * 1. Redistributions of source code must retain the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer.
|
|
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
+ *
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
+ * POSSIBILITY OF SUCH DAMAGE.
|
|
+ */
|
|
+
|
|
+char *
|
|
+chiron_dirname(char *path) {
|
|
+ static char singledot[] = ".";
|
|
+ const char *lastp;
|
|
+ size_t len;
|
|
+
|
|
+ /*
|
|
+ * If `path' is a null pointer or points to an empty string,
|
|
+ * return a pointer to the string ".".
|
|
+ */
|
|
+ if ((path == NULL) || (*path == '\0'))
|
|
+ return (singledot);
|
|
+
|
|
+ /* Strip trailing slashes, if any. */
|
|
+ lastp = path + strlen(path) - 1;
|
|
+ while (lastp != path && *lastp == '/')
|
|
+ lastp--;
|
|
+
|
|
+ /* Terminate path at the last occurence of '/'. */
|
|
+ do {
|
|
+ if (*lastp == '/') {
|
|
+ /* Strip trailing slashes, if any. */
|
|
+ while (lastp != path && *lastp == '/')
|
|
+ lastp--;
|
|
+
|
|
+ /* ...and copy the result into the result buffer. */
|
|
+ len = (lastp - path) + 1 /* last char */;
|
|
+ if (len > (PATH_MAX - 1))
|
|
+ len = PATH_MAX - 1;
|
|
+
|
|
+ path[len] = '\0';
|
|
+ return(path);
|
|
+ }
|
|
+ } while (--lastp >= path);
|
|
+
|
|
+ /* No /'s found, return a pointer to the string ".". */
|
|
+ return (singledot);
|
|
+}
|
|
+
|
|
+
|
|
--- src/chironfn.h.orig 2008-06-08 08:26:58.000000000 +0200
|
|
+++ src/chironfn.h 2009-03-28 22:55:55.000000000 +0100
|
|
@@ -10,4 +10,5 @@
|
|
|
|
|
|
int read_a_line(char **buf, int *c, FILE *f);
|
|
char *xlate(const char *fname, char *rpath);
|
|
+char *chiron_dirname(char *path);
|
|
--- src/chironfs.c.orig 2008-06-21 03:09:19.000000000 +0200
|
|
+++ src/chironfs.c 2009-03-29 12:12:26.000000000 +0200
|
|
@@ -37,9 +37,11 @@
|
|
#include <fuse/fuse_opt.h>
|
|
|
|
#else
|
|
|
|
+#ifndef __NetBSD__
|
|
typedef uint64_t cpuset_t;
|
|
+#endif
|
|
|
|
//
|
|
// The line below are from a patch contributed by Antti Kantee
|
|
// to make ChironFS run on NetBSD
|
|
@@ -125,8 +127,9 @@
|
|
#include "chironfn.h"
|
|
#define _CHIRON_H_
|
|
#include "chironfs.h"
|
|
|
|
+int nochown_mode = 0;
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
@@ -405,13 +408,18 @@
|
|
} \
|
|
if (result!=NULL) { \
|
|
member = result->gr_mem; \
|
|
while (*member) { \
|
|
- pw = getpwnam(*member); \
|
|
- pw_uid = pw->pw_uid; \
|
|
- if (pw_uid==context->uid) { \
|
|
- perm = (stbuf.st_mode&070) >> 3; \
|
|
- break; \
|
|
+ struct passwd pwres; \
|
|
+ char pwbuf[1024]; \
|
|
+ \
|
|
+ if (getpwnam_r(*member, &pwres, pwbuf, \
|
|
+ sizeof(pwbuf), &pw) == 0) { \
|
|
+ pw_uid = pw->pw_uid; \
|
|
+ if (pw_uid==context->uid) { \
|
|
+ perm = (stbuf.st_mode&070) >> 3; \
|
|
+ break; \
|
|
+ } \
|
|
} \
|
|
member++; \
|
|
} \
|
|
if (*member==NULL) { \
|
|
@@ -432,9 +440,9 @@
|
|
return(-1); \
|
|
} \
|
|
bkdname = dname; \
|
|
do { \
|
|
- dname = dirname(dname); \
|
|
+ dname = chiron_dirname(dname); \
|
|
get_rights(stat,dname); \
|
|
process_rights(); \
|
|
if (!(perm&1)) { \
|
|
free(dname); \
|
|
@@ -570,9 +578,9 @@
|
|
if (dname==NULL) {
|
|
errno = ENOMEM;
|
|
perm = -1;
|
|
} else {
|
|
- perm = get_rights_by_name(dirname(dname));
|
|
+ perm = get_rights_by_name(chiron_dirname(dname));
|
|
free(dname);
|
|
}
|
|
} else {
|
|
perm = get_rights_by_name(fname);
|
|
@@ -600,9 +608,9 @@
|
|
err_list[i] = errno;
|
|
} else {
|
|
if (!file_exists) {
|
|
get_ownership();
|
|
- if (lchown(fname, context->uid, gid)==(-1)) {
|
|
+ if (!nochown_mode && lchown(fname, context->uid, gid)==(-1)) {
|
|
fail_cnt++;
|
|
err_list[i] = -errno;
|
|
close(fd[i]);
|
|
fd[i] = -1;
|
|
@@ -1245,9 +1253,9 @@
|
|
if (dname==NULL) {
|
|
perm = -1;
|
|
errno = ENOMEM;
|
|
} else {
|
|
- perm = get_rights_by_name(dirname(dname));
|
|
+ perm = get_rights_by_name(chiron_dirname(dname));
|
|
free(dname);
|
|
}
|
|
if (perm<0) {
|
|
fail_cnt++;
|
|
@@ -1262,9 +1270,9 @@
|
|
fd[i] = open(fname, O_CREAT | O_EXCL | O_WRONLY, mode);
|
|
if (fd[i] >= 0) {
|
|
fd[i] = close(fd[i]);
|
|
get_ownership();
|
|
- if (lchown(fname, context->uid, gid)==(-1)) {
|
|
+ if (!nochown_mode && lchown(fname, context->uid, gid)==(-1)) {
|
|
fail_cnt++;
|
|
err_list[i] = -errno;
|
|
fd[i] = -1;
|
|
} else {
|
|
@@ -1288,9 +1296,9 @@
|
|
}
|
|
}
|
|
if (fd[i]==0) {
|
|
get_ownership();
|
|
- if (lchown(fname, context->uid, gid)==(-1)) {
|
|
+ if (!nochown_mode && lchown(fname, context->uid, gid)==(-1)) {
|
|
fail_cnt++;
|
|
err_list[i] = -errno;
|
|
fd[i] = -1;
|
|
} else {
|
|
@@ -1519,9 +1527,9 @@
|
|
dbg(("\nrmdir: %s\n",path_orig));
|
|
do_byname_rw(rmdir(fname), "rmdir",(
|
|
((dname=strdup(fname))==NULL)
|
|
? ( errno = ENOMEM, -1 )
|
|
- : ( tmpperm = get_rights_by_name(dirname(dname)), free(dname), tmpperm)
|
|
+ : ( tmpperm = get_rights_by_name(chiron_dirname(dname)), free(dname), tmpperm)
|
|
),||,0,EACCES);
|
|
}
|
|
|
|
static int chiron_unlink(const char *path_orig)
|
|
@@ -1531,9 +1539,9 @@
|
|
dbg(("\nunlink: %s\n",path_orig));
|
|
do_byname_rw(unlink(fname), "unlink",(
|
|
((dname=strdup(fname))==NULL)
|
|
? ( errno = ENOMEM, -1 )
|
|
- : ( tmpperm = get_rights_by_name(dirname(dname)), free(dname), tmpperm)
|
|
+ : ( tmpperm = get_rights_by_name(chiron_dirname(dname)), free(dname), tmpperm)
|
|
),||,0,EACCES);
|
|
}
|
|
|
|
int chiron_mkdir(const char *path_orig, mode_t mode)
|
|
@@ -1571,9 +1579,9 @@
|
|
if (dname==NULL) {
|
|
perm = -1;
|
|
errno = ENOMEM;
|
|
} else {
|
|
- perm = get_rights_by_name(dirname(dname));
|
|
+ perm = get_rights_by_name(chiron_dirname(dname));
|
|
free(dname);
|
|
}
|
|
if (perm<0) {
|
|
fail_cnt++;
|
|
@@ -1586,9 +1594,9 @@
|
|
} else {
|
|
fd[i] = mkdir(fname, mode);
|
|
if (fd[i]==0) {
|
|
get_ownership();
|
|
- if (lchown(fname, context->uid, gid)==(-1)) {
|
|
+ if (!nochown_mode && lchown(fname, context->uid, gid)==(-1)) {
|
|
fail_cnt++;
|
|
err_list[i] = -errno;
|
|
fd[i] = -1;
|
|
} else {
|
|
@@ -1683,9 +1691,9 @@
|
|
if (dname==NULL) {
|
|
perm = -1;
|
|
errno = ENOMEM;
|
|
} else {
|
|
- perm = get_rights_by_name(dirname(dname));
|
|
+ perm = get_rights_by_name(chiron_dirname(dname));
|
|
free(dname);
|
|
}
|
|
if (perm<0) {
|
|
fail_cnt++;
|
|
@@ -1701,9 +1709,9 @@
|
|
fail_cnt++;
|
|
err_list[i] = errno;
|
|
} else {
|
|
get_ownership();
|
|
- if (lchown(fname, context->uid, gid)==(-1)) {
|
|
+ if (!nochown_mode && lchown(fname, context->uid, gid)==(-1)) {
|
|
fail_cnt++;
|
|
err_list[i] = -errno;
|
|
fd[i] = -1;
|
|
} else {
|
|
@@ -1775,9 +1783,9 @@
|
|
if (dname==NULL) { \
|
|
perm = -1; \
|
|
errno = -ENOMEM; \
|
|
} else { \
|
|
- perm = get_rights_by_name(dirname(dname)); \
|
|
+ perm = get_rights_by_name(chiron_dirname(dname)); \
|
|
free(dname); \
|
|
} \
|
|
} \
|
|
if (perm<0) { \
|
|
@@ -1798,9 +1806,9 @@
|
|
if (dname==NULL) { \
|
|
perm = -1; \
|
|
errno = -ENOMEM; \
|
|
} else { \
|
|
- perm = get_rights_by_name(dirname(dname)); \
|
|
+ perm = get_rights_by_name(chiron_dirname(dname)); \
|
|
free(dname); \
|
|
} \
|
|
} \
|
|
if (perm<0) { \
|
|
--- src/chironfs.h.orig 2008-06-16 01:32:23.000000000 +0200
|
|
+++ src/chironfs.h 2009-03-28 22:54:07.000000000 +0100
|
|
@@ -150,8 +150,9 @@
|
|
extern int mount_ctl;
|
|
|
|
#endif
|
|
|
|
+extern int nochown_mode;
|
|
|
|
void help(void);
|
|
void free_tab_fd(void);
|
|
int **mk_round_robin(int *tmp_list, int dim);
|