2013-09-26 17:14:40 +02:00

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);