[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[hurd] 01/03: New upstream snapshot
From: |
Samuel Thibault |
Subject: |
[hurd] 01/03: New upstream snapshot |
Date: |
Mon, 24 Oct 2016 00:16:42 +0000 |
This is an automated email from the git hooks/post-receive script.
sthibault pushed a commit to branch master
in repository hurd.
commit cb8b393b29fdb5e4c017a03be3969a886b239bd8
Author: Samuel Thibault <address@hidden>
Date: Sun Oct 23 22:22:42 2016 +0000
New upstream snapshot
---
boot/boot.c | 3 +-
console-client/trans.c | 4 +-
daemons/Makefile | 7 +-
daemons/{runsystem.hurd => runsystem.hurd.sh} | 0
eth-multiplexer/device_impl.c | 12 --
exec/exec.c | 15 +-
exec/hashexec.c | 12 +-
ext2fs/ext2fs.c | 9 ++
ext2fs/ext2fs.h | 14 +-
ext2fs/pager.c | 2 +-
ext2fs/pokel.c | 6 +-
hurd/auth_request.defs | 2 +-
hurd/io_request.defs | 2 +-
hurd/process_request.defs | 2 +-
init/init.c | 2 +-
libddekit/thread.c | 208 ++++----------------------
libdiskfs/file-set-trans.c | 15 +-
libdiskfs/init-startup.c | 2 +-
libfshelp/fetch-control.c | 15 +-
libfshelp/translator-list.c | 9 +-
libports/manage-multithread.c | 5 +
proc/main.c | 7 +-
procfs/rootdir.c | 44 ++++--
random/gnupg-random.c | 19 ++-
random/random.c | 2 +-
startup/startup.c | 2 +
trans/crash.c | 30 +++-
trans/remap.c | 7 +
utils/fakeroot.sh | 3 +
utils/msgids.c | 5 +-
30 files changed, 207 insertions(+), 258 deletions(-)
diff --git a/boot/boot.c b/boot/boot.c
index 462243c..02af068 100644
--- a/boot/boot.c
+++ b/boot/boot.c
@@ -742,7 +742,8 @@ main (int argc, char **argv, char **envp)
FD_SET (0, &rmask);
if (select (1, &rmask, 0, 0, 0) == 1)
read_reply ();
- else /* We hosed */
+ else if (errno != EINTR)
+ /* We hosed */
error (5, errno, "select");
}
}
diff --git a/console-client/trans.c b/console-client/trans.c
index 224229e..4b9c92b 100644
--- a/console-client/trans.c
+++ b/console-client/trans.c
@@ -865,7 +865,6 @@ console_unregister_consnode (consnode_t cn)
error_t
console_setup_node (char *path)
{
- mach_port_t bootstrap;
error_t err;
struct stat ul_stat;
file_t node;
@@ -876,8 +875,7 @@ console_setup_node (char *path)
node = file_name_lookup (path, O_CREAT|O_NOTRANS, 0664);
if (node == MACH_PORT_NULL)
return errno;
-
- task_get_bootstrap_port (mach_task_self (), &bootstrap);
+
netfs_init ();
/* Create the root node (some attributes initialized below). */
diff --git a/daemons/Makefile b/daemons/Makefile
index 9d32617..289fbf6 100644
--- a/daemons/Makefile
+++ b/daemons/Makefile
@@ -20,10 +20,10 @@
dir := daemons
makemode := utilities
-targets = rc getty mail.local console-run runttys runsystem
-special-targets = rc runsystem
+targets = rc getty mail.local console-run runttys runsystem runsystem.hurd
+special-targets = rc runsystem runsystem.hurd
SRCS = rc.sh runsystem.sh getty.c lmail.c console-run.c runttys.c \
- runsystem.hurd \
+ runsystem.hurd.sh \
installationdir = $(libexecdir)
@@ -45,3 +45,4 @@ runttys: runttys.o
runttys-LDLIBS = -lutil
runsystem: runsystem.sh
+runsystem.hurd: runsystem.hurd.sh
diff --git a/daemons/runsystem.hurd b/daemons/runsystem.hurd.sh
similarity index 100%
rename from daemons/runsystem.hurd
rename to daemons/runsystem.hurd.sh
diff --git a/eth-multiplexer/device_impl.c b/eth-multiplexer/device_impl.c
index 7d82b8d..b15a009 100644
--- a/eth-multiplexer/device_impl.c
+++ b/eth-multiplexer/device_impl.c
@@ -51,8 +51,6 @@ ds_device_open (mach_port_t master_port, mach_port_t
reply_port,
mach_msg_type_name_t *devicetype)
{
struct vether_device *dev;
- int openstat;
- int right_mode = 1;
struct protid *pi = ports_lookup_port (netfs_port_bucket, master_port, 0);
if (pi == NULL)
return D_NO_SUCH_DEVICE;
@@ -85,18 +83,8 @@ ds_device_open (mach_port_t master_port, mach_port_t
reply_port,
}
dev = (struct vether_device *) pi->po->np->nn->ln;
- /* check the mode */
- openstat = pi->po->openstat;
- if (mode & D_READ && !(openstat & O_READ))
- right_mode = 0;
- if (mode & D_WRITE && !(openstat & O_WRITE))
- right_mode = 0;
- ports_port_deref (pi);
-
if (dev)
{
- if (!right_mode)
- return EBADF;
*device = dev->dev_port;
*devicetype = MACH_MSG_TYPE_MAKE_SEND;
return 0;
diff --git a/exec/exec.c b/exec/exec.c
index ea352fa..d6dd5d8 100644
--- a/exec/exec.c
+++ b/exec/exec.c
@@ -109,19 +109,20 @@ load_section (void *section, struct execdata *u)
vm_address_t mapstart = round_page (addr);
/* Allocate space in the task and write CONTENTS into it. */
- void write_to_task (vm_address_t mapstart, vm_size_t size,
+ void write_to_task (vm_address_t * mapstart, vm_size_t size,
vm_prot_t vm_prot, vm_address_t contents)
{
vm_size_t off = size % vm_page_size;
/* Allocate with vm_map to set max protections. */
u->error = vm_map (u->task,
- &mapstart, size, mask, anywhere,
+ mapstart, size, mask, anywhere,
MACH_PORT_NULL, 0, 1,
vm_prot|VM_PROT_WRITE,
VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE,
VM_INHERIT_COPY);
+ /* vm_write only works on integral multiples of vm_page_size */
if (! u->error && size >= vm_page_size)
- u->error = vm_write (u->task, mapstart, contents, size - off);
+ u->error = vm_write (u->task, *mapstart, contents, size - off);
if (! u->error && off != 0)
{
vm_address_t page = 0;
@@ -135,14 +136,14 @@ load_section (void *section, struct execdata *u)
(void *) (contents + (size - off)),
off);
if (! u->error)
- u->error = vm_write (u->task, mapstart + (size - off),
+ u->error = vm_write (u->task, *mapstart + (size - off),
page, vm_page_size);
munmap ((caddr_t) page, vm_page_size);
}
}
/* Reset the current protections to the desired state. */
if (! u->error && (vm_prot & VM_PROT_WRITE) == 0)
- u->error = vm_protect (u->task, mapstart, size, 0, vm_prot);
+ u->error = vm_protect (u->task, *mapstart, size, 0, vm_prot);
}
if (mapstart - addr < filesz)
@@ -154,7 +155,7 @@ load_section (void *section, struct execdata *u)
#define SECTION_CONTENTS (u->file_data + filepos)
if (SECTION_IN_MEMORY_P)
/* Data is already in memory; write it into the task. */
- write_to_task (mapstart, filesz - (mapstart - addr), vm_prot,
+ write_to_task (&mapstart, filesz - (mapstart - addr), vm_prot,
(vm_address_t) SECTION_CONTENTS
+ (mapstart - addr));
else if (u->filemap != MACH_PORT_NULL)
@@ -173,7 +174,7 @@ load_section (void *section, struct execdata *u)
const vm_size_t size = filesz - (mapstart - addr);
void *buf = map (u, filepos + (mapstart - addr), size);
if (buf)
- write_to_task (mapstart, size, vm_prot, (vm_address_t) buf);
+ write_to_task (&mapstart, size, vm_prot, (vm_address_t) buf);
}
if (u->error)
return 0;
diff --git a/exec/hashexec.c b/exec/hashexec.c
index e53d2ee..6337f0a 100644
--- a/exec/hashexec.c
+++ b/exec/hashexec.c
@@ -97,22 +97,24 @@ check_hashbang (struct execdata *e,
mach_port_t port = ((which < nports &&
portarray[which] != MACH_PORT_NULL)
? portarray[which] :
- (flags & EXEC_DEFAULTS) ? std_ports[which]
- : MACH_PORT_NULL);
+ (flags & EXEC_DEFAULTS && which < std_nports)
+ ? std_ports[which]
+ : MACH_PORT_NULL);
/* Reauthenticate dir ports if they are the defaults. */
switch (which)
{
case INIT_PORT_CRDIR:
/* If secure, always use the default root. */
- if ((flags & EXEC_SECURE) ||
- port == std_ports[which])
+ if ((which < std_nports && flags & EXEC_SECURE) ||
+ (which < std_nports && port == std_ports[which]))
return (reauthenticate (std_ports[which], &user_crdir) ?:
(*operate) (user_crdir));
break;
case INIT_PORT_CWDIR:
/* If secure, reauthenticate cwd whether default or given. */
- if ((flags & EXEC_SECURE) || port == std_ports[which])
+ if ((flags & EXEC_SECURE) ||
+ (which < std_nports && port == std_ports[which]))
return (reauthenticate (port, &user_cwdir) ?:
(*operate) (user_cwdir));
break;
diff --git a/ext2fs/ext2fs.c b/ext2fs/ext2fs.c
index 03c9eed..1ead6d2 100644
--- a/ext2fs/ext2fs.c
+++ b/ext2fs/ext2fs.c
@@ -69,8 +69,11 @@ options[] =
" (not compiled in)"
#endif
},
+#ifdef ALTERNATE_SBLOCK
+ /* XXX This is not implemented. */
{"sblock", 'S', "BLOCKNO", 0,
"Use alternate superblock location (1kb blocks)"},
+#endif
{0}
};
@@ -83,7 +86,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
struct
{
int debug_flag;
+#ifdef ALTERNATE_SBLOCK
unsigned int sb_block;
+#endif
} *values = state->hook;
switch (key)
@@ -91,6 +96,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
case 'D':
values->debug_flag = 1;
break;
+#ifdef ALTERNATE_SBLOCK
case 'S':
values->sb_block = strtoul (arg, &arg, 0);
if (!arg || *arg != '\0')
@@ -99,6 +105,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
return EINVAL;
}
break;
+#endif
case ARGP_KEY_INIT:
state->child_inputs[0] = state->input;
@@ -107,7 +114,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
return ENOMEM;
state->hook = values;
memset (values, 0, sizeof *values);
+#ifdef ALTERNATE_SBLOCK
values->sb_block = SBLOCK_BLOCK;
+#endif
break;
case ARGP_KEY_SUCCESS:
diff --git a/ext2fs/ext2fs.h b/ext2fs/ext2fs.h
index 070d5bd..afcd25c 100644
--- a/ext2fs/ext2fs.h
+++ b/ext2fs/ext2fs.h
@@ -271,7 +271,9 @@ extern pthread_cond_t disk_cache_reassociation;
void *disk_cache_block_ref (block_t block);
void disk_cache_block_ref_ptr (void *ptr);
-void disk_cache_block_deref (void *ptr);
+void _disk_cache_block_deref (void *ptr);
+#define disk_cache_block_deref(PTR) \
+ do { _disk_cache_block_deref (PTR); PTR = NULL; } while (0)
int disk_cache_block_is_ref (block_t block);
/* Our in-core copy of the super-block (pointer into the disk_cache). */
@@ -412,12 +414,14 @@ dino_ref (ino_t inum)
}
EXT2FS_EI void
-dino_deref (struct ext2_inode *inode)
+_dino_deref (struct ext2_inode *inode)
{
ext2_debug ("(%p)", inode);
disk_cache_block_deref (inode);
}
#endif /* Use extern inlines. */
+#define dino_deref(INODE) \
+ do { _dino_deref (INODE); INODE = NULL; } while (0)
/* ---------------------------------------------------------------- */
/* inode.c */
@@ -481,11 +485,11 @@ record_global_poke (void *ptr)
/* This syncs a modification to a non-file block. */
EXT2FS_EI void
-sync_global_ptr (void *bptr, int wait)
+sync_global_ptr (void *ptr, int wait)
{
- block_t block = boffs_block (bptr_offs (bptr));
+ block_t block = boffs_block (bptr_offs (ptr));
void *block_ptr = bptr (block);
- ext2_debug ("(%p -> %u)", bptr, block);
+ ext2_debug ("(%p -> %u)", ptr, block);
global_block_modified (block);
disk_cache_block_deref (block_ptr);
pager_sync_some (diskfs_disk_pager,
diff --git a/ext2fs/pager.c b/ext2fs/pager.c
index 456b582..6a92682 100644
--- a/ext2fs/pager.c
+++ b/ext2fs/pager.c
@@ -1197,7 +1197,7 @@ disk_cache_block_ref_ptr (void *ptr)
}
void
-disk_cache_block_deref (void *ptr)
+_disk_cache_block_deref (void *ptr)
{
int index;
diff --git a/ext2fs/pokel.c b/ext2fs/pokel.c
index 3afb32e..53dc513 100644
--- a/ext2fs/pokel.c
+++ b/ext2fs/pokel.c
@@ -71,7 +71,7 @@ pokel_add (struct pokel *pokel, void *loc, vm_size_t length)
{
if (pokel->image == disk_cache)
for (vm_offset_t i = offset; i < end; i += block_size)
- disk_cache_block_deref (disk_cache + i);
+ _disk_cache_block_deref (disk_cache + i);
break;
}
@@ -85,7 +85,7 @@ pokel_add (struct pokel *pokel, void *loc, vm_size_t length)
vm_offset_t i_begin = p_offs > offset ? p_offs : offset;
vm_offset_t i_end = p_end < end ? p_end : end;
for (vm_offset_t i = i_begin; i < i_end; i += block_size)
- disk_cache_block_deref (disk_cache + i);
+ _disk_cache_block_deref (disk_cache + i);
}
ext2_debug ("extended 0x%x[%ul] to 0x%x[%ul]",
@@ -140,7 +140,7 @@ _pokel_exec (struct pokel *pokel, int sync, int wait)
vm_offset_t begin = trunc_block (pl->offset);
vm_offset_t end = round_block (pl->offset + pl->length);
for (vm_offset_t i = begin; i != end; i += block_size)
- disk_cache_block_deref (pokel->image + i);
+ _disk_cache_block_deref (pokel->image + i);
}
}
diff --git a/hurd/auth_request.defs b/hurd/auth_request.defs
index a1f9e27..54c156c 100644
--- a/hurd/auth_request.defs
+++ b/hurd/auth_request.defs
@@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public
License
along with the GNU Hurd; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-subsystem auth_reply 25000; /* must match auth.defs */
+subsystem auth_request 25000; /* must match auth.defs */
#include <hurd/hurd_types.defs>
diff --git a/hurd/io_request.defs b/hurd/io_request.defs
index 0d5e36d..b439a5c 100644
--- a/hurd/io_request.defs
+++ b/hurd/io_request.defs
@@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public
License
along with the GNU Hurd; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-subsystem io 21000;
+subsystem io_request 21000;
/* These functions are user-side stubs for the functions in io.defs;
all the comments there apply exactly to here. */
diff --git a/hurd/process_request.defs b/hurd/process_request.defs
index a8bf820..20e0ee1 100644
--- a/hurd/process_request.defs
+++ b/hurd/process_request.defs
@@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public
License
along with the GNU Hurd; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-subsystem process 24000;
+subsystem process_request 24000;
#include <hurd/hurd_types.defs>
diff --git a/init/init.c b/init/init.c
index fe230da..c8078dd 100644
--- a/init/init.c
+++ b/init/init.c
@@ -138,7 +138,7 @@ main (int argc, char **argv)
sa.sa_flags |= SA_RESTART;
sigaction (SIGCHLD, &sa, NULL);
- char *args[] = { "/etc/hurd/runsystem.hurd", NULL };
+ char *args[] = { "/libexec/runsystem.hurd", NULL };
switch (child_pid = fork ())
{
diff --git a/libddekit/thread.c b/libddekit/thread.c
index 8f7b3ed..17d553b 100644
--- a/libddekit/thread.c
+++ b/libddekit/thread.c
@@ -1,6 +1,7 @@
#include <stdio.h>
#include <string.h>
#include <pthread.h>
+#include <semaphore.h>
#include <time.h>
#include <error.h>
#include <mach.h>
@@ -11,7 +12,6 @@
#include "ddekit/memory.h"
#include "ddekit/semaphore.h"
#include "ddekit/condvar.h"
-#include "list.h"
#include "ddekit/thread.h"
#define DDEKIT_THREAD_STACK_SIZE 0x2000 /* 8 KB */
@@ -19,11 +19,9 @@
//static struct ddekit_slab *ddekit_stack_slab = NULL;
struct _ddekit_private_data {
- struct list list;
ddekit_condvar_t *sleep_cond;
/* point to the thread who has the private data. */
struct ddekit_thread *thread;
- mach_msg_header_t wakeupmsg;
};
struct ddekit_thread {
@@ -35,57 +33,20 @@ struct ddekit_thread {
struct ddekit_sem
{
- pthread_spinlock_t lock;
- /* A list of thread waiting for the semaphore. */
- struct list head;
- int value;
+ sem_t sem;
};
static __thread struct ddekit_thread *thread_self;
static void _thread_cleanup ()
{
- mach_port_destroy (mach_task_self (),
- thread_self->private->wakeupmsg.msgh_remote_port);
ddekit_condvar_deinit (thread_self->private->sleep_cond);
ddekit_simple_free (thread_self->private);
ddekit_simple_free (thread_self->name);
ddekit_simple_free (thread_self);
}
-/* Prepare a wakeup message. */
-static error_t _create_wakeupmsg (struct _ddekit_private_data *data)
-{
- kern_return_t err;
-
- /* Build wakeup message. */
- data->wakeupmsg.msgh_bits = MACH_MSGH_BITS (MACH_MSG_TYPE_COPY_SEND, 0);
- data->wakeupmsg.msgh_size = 0;
-
- err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE,
- &data->wakeupmsg.msgh_remote_port);
- if (err)
- return EAGAIN;
-
- data->wakeupmsg.msgh_local_port = MACH_PORT_NULL;
- data->wakeupmsg.msgh_seqno = 0;
- data->wakeupmsg.msgh_id = 0;
-
- err = mach_port_insert_right (mach_task_self (),
- data->wakeupmsg.msgh_remote_port,
- data->wakeupmsg.msgh_remote_port,
- MACH_MSG_TYPE_MAKE_SEND);
- if (err) {
- mach_port_destroy (mach_task_self (),
- data->wakeupmsg.msgh_remote_port);
- return EAGAIN;
- }
-
- return 0;
-}
-
static void setup_thread (struct ddekit_thread *t, const char *name) {
- error_t err;
struct _ddekit_private_data *private_data;
if (name) {
@@ -104,14 +65,8 @@ static void setup_thread (struct ddekit_thread *t, const
char *name) {
ddekit_simple_malloc (sizeof (*private_data));
private_data->sleep_cond = ddekit_condvar_init ();
- private_data->list.prev = &private_data->list;
- private_data->list.next = &private_data->list;
private_data->thread = t;
- err = _create_wakeupmsg (private_data);
- if (err)
- error (1, err, "_create_wakeupmsg");
-
t->private = private_data;
}
@@ -267,114 +222,45 @@ void ddekit_init_threads() {
* semaphore
**********************************************************************/
-/* Block THREAD. */
-static error_t _timedblock (struct _ddekit_private_data *data,
- const int timeout)
-{
- error_t err;
- mach_msg_header_t msg;
-
- assert (timeout > 0);
-
- err = mach_msg (&msg, MACH_RCV_MSG | MACH_RCV_TIMEOUT, 0,
- sizeof msg, data->wakeupmsg.msgh_remote_port,
- timeout, MACH_PORT_NULL);
- if (err == EMACH_RCV_TIMED_OUT)
- return ETIMEDOUT;
-
- assert_perror (err);
- return 0;
-}
-
-/* Block THREAD. */
-static void _block (struct _ddekit_private_data *data)
+static int _sem_timedwait_internal (ddekit_sem_t *restrict sem, int timeout)
{
- mach_msg_header_t msg;
- error_t err;
-
- err = mach_msg (&msg, MACH_RCV_MSG, 0, sizeof msg,
- data->wakeupmsg.msgh_remote_port,
- MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
- assert_perror (err);
-}
-
-static int _sem_timedwait_internal (ddekit_sem_t *restrict sem,
- const int timeout)
-{
- pthread_spin_lock (&sem->lock);
- if (sem->value > 0) {
- /* Successful down. */
- sem->value --;
- pthread_spin_unlock (&sem->lock);
- return 0;
- }
-
- if (timeout < 0) {
- pthread_spin_unlock (&sem->lock);
- errno = EINVAL;
- return -1;
- }
-
- /* Add ourselves to the queue. */
- add_entry_head (&sem->head, &thread_self->private->list);
- pthread_spin_unlock (&sem->lock);
-
- /* Block the thread. */
- if (timeout) {
- error_t err;
-
- err = _timedblock (thread_self->private, timeout);
- if (err) {
- /* We timed out. We may need to disconnect ourself from the
- waiter queue.
-
- FIXME: What do we do if we get a wakeup message before we
- disconnect ourself? It may remain until the next time we
- block. */
- assert (err == ETIMEDOUT);
-
- pthread_spin_lock (&sem->lock);
- remove_entry (&thread_self->private->list);
- pthread_spin_unlock (&sem->lock);
-
- errno = err;
- return -1;
+ int ret;
+ if (timeout)
+ {
+ struct timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+
+ ts.tv_nsec += (timeout%1000) * 1000000;
+ if (ts.tv_nsec >= 1000000000) {
+ ts.tv_nsec -= 1000000000;
+ ts.tv_sec += 1;
}
+ ts.tv_sec += timeout/1000;
+ do
+ ret = sem_timedwait(&sem->sem, &ts);
+ while (ret == -1 && errno == EINTR);
+ return ret;
}
else
- _block (thread_self->private);
-
- return 0;
-}
-
-/* Wakeup THREAD. */
-static void _thread_wakeup (struct _ddekit_private_data *data)
-{
- error_t err;
-
- err = mach_msg (&data->wakeupmsg, MACH_SEND_MSG,
- sizeof (data->wakeupmsg), 0, MACH_PORT_NULL,
- MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
- assert_perror (err);
+ {
+ do
+ ret = sem_wait(&sem->sem);
+ while (ret == -1 && errno == EINTR);
+ return 0;
+ }
}
ddekit_sem_t *ddekit_sem_init(int value) {
ddekit_sem_t *sem =
(ddekit_sem_t *) ddekit_simple_malloc (sizeof (*sem));
- sem->lock = PTHREAD_SPINLOCK_INITIALIZER;
- sem->head.prev = &sem->head;
- sem->head.next = &sem->head;
- sem->value = value;
+ sem_init(&sem->sem, 0, value);
return sem;
}
void ddekit_sem_deinit(ddekit_sem_t *sem) {
- if (!EMPTY_LIST (&sem->head)) {
- error (0, EBUSY, "ddekit_sem_deinit");
- }
- else
- ddekit_simple_free(sem);
+ sem_destroy(&sem->sem);
+ ddekit_simple_free(sem);
}
void ddekit_sem_down(ddekit_sem_t *sem) {
@@ -383,16 +269,7 @@ void ddekit_sem_down(ddekit_sem_t *sem) {
/* returns 0 on success, != 0 when it would block */
int ddekit_sem_down_try(ddekit_sem_t *sem) {
- pthread_spin_lock (&sem->lock);
- if (sem->value > 0) {
- /* Successful down. */
- sem->value --;
- pthread_spin_unlock (&sem->lock);
- return 0;
- }
- pthread_spin_unlock (&sem->lock);
-
- return -1;
+ return sem_trywait(&sem->sem);
}
/* returns 0 on success, != 0 on timeout */
@@ -402,33 +279,6 @@ int ddekit_sem_down_timed(ddekit_sem_t *sem, int timo) {
}
void ddekit_sem_up(ddekit_sem_t *sem) {
- struct _ddekit_private_data *wakeup;
-
- pthread_spin_lock (&sem->lock);
- if (sem->value > 0) {
- /* Do a quick up. */
- assert (EMPTY_LIST (&sem->head));
- sem->value ++;
- pthread_spin_unlock (&sem->lock);
- return;
- }
-
- if (EMPTY_LIST (&sem->head)) {
- /* No one waiting. */
- sem->value = 1;
- pthread_spin_unlock (&sem->lock);
- return;
- }
-
- /* Wake someone up. */
-
- /* First dequeue someone. */
- wakeup = LIST_ENTRY (remove_entry_end (&sem->head),
- struct _ddekit_private_data, list);
-
- /* Then drop the lock and transfer control. */
- pthread_spin_unlock (&sem->lock);
- if (wakeup)
- _thread_wakeup (wakeup);
+ sem_post(&sem->sem);
}
diff --git a/libdiskfs/file-set-trans.c b/libdiskfs/file-set-trans.c
index 6e1a61d..3238037 100644
--- a/libdiskfs/file-set-trans.c
+++ b/libdiskfs/file-set-trans.c
@@ -168,7 +168,20 @@ diskfs_S_file_set_translator (struct protid *cred,
np->dn_stat.st_rdev = makedev (major, minor);
}
- diskfs_truncate (np, 0);
+ err = diskfs_truncate (np, 0);
+ if (err)
+ {
+ pthread_mutex_unlock (&np->lock);
+ return err;
+ }
+
+ err = diskfs_set_translator (np, NULL, 0, cred);
+ if (err)
+ {
+ pthread_mutex_unlock (&np->lock);
+ return err;
+ }
+
if (newmode == S_IFLNK)
{
char *arg = passive + strlen (passive) + 1;
diff --git a/libdiskfs/init-startup.c b/libdiskfs/init-startup.c
index 14da003..c1407ed 100644
--- a/libdiskfs/init-startup.c
+++ b/libdiskfs/init-startup.c
@@ -223,5 +223,5 @@ _diskfs_init_completed ()
return;
errout:
- error (0, err, "Cannot request shutdown notification");
+ error (0, err, "Warning: cannot request shutdown notification");
}
diff --git a/libfshelp/fetch-control.c b/libfshelp/fetch-control.c
index 26c12d8..91c65bb 100644
--- a/libfshelp/fetch-control.c
+++ b/libfshelp/fetch-control.c
@@ -19,13 +19,24 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "fshelp.h"
+#include <assert.h>
error_t
fshelp_fetch_control (struct transbox *box,
mach_port_t *control)
{
+ error_t err = 0;
*control = box->active;
if (*control != MACH_PORT_NULL)
- mach_port_mod_refs (mach_task_self (), *control, MACH_PORT_RIGHT_SEND, 1);
- return 0;
+ err = mach_port_mod_refs (mach_task_self (), *control,
+ MACH_PORT_RIGHT_SEND, 1);
+
+ if (err == KERN_INVALID_RIGHT)
+ {
+ err = mach_port_deallocate (mach_task_self (), *control);
+ assert_perror (err);
+ *control = box->active = MACH_PORT_NULL;
+ }
+
+ return err;
}
diff --git a/libfshelp/translator-list.c b/libfshelp/translator-list.c
index c87bbaa..e043a67 100644
--- a/libfshelp/translator-list.c
+++ b/libfshelp/translator-list.c
@@ -53,8 +53,7 @@ translator_ihash_cleanup (void *element, void *arg)
if (translator->pi)
ports_port_deref (translator->pi);
- /* No need to deallocate translator->active, we only keep the name of
- the port, not a reference. */
+ mach_port_deallocate (mach_task_self (), translator->active);
free (translator->name);
free (translator);
}
@@ -124,8 +123,10 @@ fshelp_set_active_translator (struct port_info *pi,
t->pi = pi;
}
- /* No need to increment the reference count, we only keep the
- name, not a reference. */
+ if (MACH_PORT_VALID (t->active))
+ mach_port_deallocate (mach_task_self (), t->active);
+ mach_port_mod_refs (mach_task_self (), active,
+ MACH_PORT_RIGHT_SEND, +1);
t->active = active;
}
else
diff --git a/libports/manage-multithread.c b/libports/manage-multithread.c
index 1588f63..576e767 100644
--- a/libports/manage-multithread.c
+++ b/libports/manage-multithread.c
@@ -68,6 +68,11 @@ adjust_priority (unsigned int totalthreads)
goto error_pset_priv;
err = thread_max_priority (self, pset_priv, 0);
+ /* If we are running in an unprivileged subhurd, we got a faked
+ privileged processor set port. This is indeed a kind of
+ permission problem, and we treat it as such. */
+ if (err == KERN_INVALID_ARGUMENT)
+ err = EPERM;
if (err)
goto error_max_priority;
diff --git a/proc/main.c b/proc/main.c
index c4936f6..2c5ce55 100644
--- a/proc/main.c
+++ b/proc/main.c
@@ -80,6 +80,11 @@ increase_priority (void)
goto out;
err = thread_max_priority (mach_thread_self (), psetcntl, 0);
+ /* If we are running in an unprivileged subhurd, we got a faked
+ privileged processor set port. This is indeed a kind of
+ permission problem, and we treat it as such. */
+ if (err == KERN_INVALID_ARGUMENT)
+ err = EPERM;
if (err)
goto out;
@@ -155,7 +160,7 @@ main (int argc, char **argv, char **envp)
/* Give ourselves good scheduling performance, because we are so
important. */
err = increase_priority ();
- if (err)
+ if (err && err != EPERM)
error (0, err, "Increasing priority failed");
err = register_new_task_notification (_hurd_host_priv,
diff --git a/procfs/rootdir.c b/procfs/rootdir.c
index 8e7c659..748805e 100644
--- a/procfs/rootdir.c
+++ b/procfs/rootdir.c
@@ -272,27 +272,37 @@ rootdir_gc_meminfo (void *hook, char **contents, ssize_t
*contents_len)
struct vm_statistics vmstats;
struct vm_cache_statistics cache_stats;
default_pager_info_t swap;
+ FILE *m;
error_t err;
+ m = open_memstream (contents, (size_t *) contents_len);
+ if (m == NULL)
+ {
+ err = ENOMEM;
+ goto out;
+ }
+
err = vm_statistics (mach_task_self (), &vmstats);
if (err)
- return EIO;
+ {
+ err = EIO;
+ goto out;
+ }
err = vm_cache_statistics (mach_task_self (), &cache_stats);
if (err)
- return EIO;
+ {
+ err = EIO;
+ goto out;
+ }
cnt = HOST_BASIC_INFO_COUNT;
err = host_info (mach_host_self (), HOST_BASIC_INFO, (host_info_t) &hbi,
&cnt);
if (err)
- return err;
-
- err = get_swapinfo (&swap);
- if (err)
- return err;
+ goto out;
assert (cnt == HOST_BASIC_INFO_COUNT);
- *contents_len = asprintf (contents,
+ fprintf (m,
"MemTotal: %14lu kB\n"
"MemFree: %14lu kB\n"
"Buffers: %14lu kB\n"
@@ -300,8 +310,6 @@ rootdir_gc_meminfo (void *hook, char **contents, ssize_t
*contents_len)
"Active: %14lu kB\n"
"Inactive: %14lu kB\n"
"Mlocked: %14lu kB\n"
- "SwapTotal:%14lu kB\n"
- "SwapFree: %14lu kB\n"
,
(long unsigned) hbi.memory_size / 1024,
(long unsigned) vmstats.free_count * PAGE_SIZE / 1024,
@@ -309,11 +317,23 @@ rootdir_gc_meminfo (void *hook, char **contents, ssize_t
*contents_len)
(long unsigned) cache_stats.cache_count * PAGE_SIZE / 1024,
(long unsigned) vmstats.active_count * PAGE_SIZE / 1024,
(long unsigned) vmstats.inactive_count * PAGE_SIZE / 1024,
- (long unsigned) vmstats.wire_count * PAGE_SIZE / 1024,
+ (long unsigned) vmstats.wire_count * PAGE_SIZE / 1024);
+
+ err = get_swapinfo (&swap);
+ if (err)
+ /* This is not fatal, we just omit the information. */
+ err = 0;
+ else
+ fprintf (m,
+ "SwapTotal:%14lu kB\n"
+ "SwapFree: %14lu kB\n"
+ ,
(long unsigned) swap.dpi_total_space / 1024,
(long unsigned) swap.dpi_free_space / 1024);
- return 0;
+ out:
+ fclose (m);
+ return err;
}
static error_t
diff --git a/random/gnupg-random.c b/random/gnupg-random.c
index 3cf7812..a4df694 100644
--- a/random/gnupg-random.c
+++ b/random/gnupg-random.c
@@ -276,23 +276,21 @@ mix_pool(byte *pool)
#if DIGESTLEN != 20
#error must have a digest length of 20 for ripe-md-160
#endif
- /* loop over the pool */
+ /* pool -> pool' */
pend = pool + POOLSIZE;
memcpy(hashbuf, pend - DIGESTLEN, DIGESTLEN );
memcpy(hashbuf+DIGESTLEN, pool, BLOCKLEN-DIGESTLEN);
rmd160_mixblock( &md, hashbuf);
- memcpy(pool, hashbuf, 20 );
+ memcpy(pool, hashbuf, DIGESTLEN);
+ /* Loop for the remaining iterations. */
p = pool;
for( n=1; n < POOLBLOCKS; n++ ) {
- memcpy(hashbuf, p, DIGESTLEN );
-
- p += DIGESTLEN;
- if( p+DIGESTLEN+BLOCKLEN < pend )
- memcpy(hashbuf+DIGESTLEN, p+DIGESTLEN, BLOCKLEN-DIGESTLEN);
+ if( p + BLOCKLEN < pend )
+ memcpy(hashbuf, p, BLOCKLEN);
else {
- byte *pp = p+DIGESTLEN;
- for(i=DIGESTLEN; i < BLOCKLEN; i++ ) {
+ byte *pp = p;
+ for(i=0; i < BLOCKLEN; i++ ) {
if( pp >= pend )
pp = pool;
hashbuf[i] = *pp++;
@@ -300,7 +298,8 @@ mix_pool(byte *pool)
}
rmd160_mixblock( &md, hashbuf);
- memcpy(p, hashbuf, 20 );
+ p += DIGESTLEN;
+ memcpy(p, hashbuf, DIGESTLEN);
}
burn_stack (200); /* for the rmd160_mixblock() */
}
diff --git a/random/random.c b/random/random.c
index 8f76c5b..828e83a 100644
--- a/random/random.c
+++ b/random/random.c
@@ -639,7 +639,7 @@ main (int argc, char **argv)
err = arrange_shutdown_notification ();
if (err)
- error (0, err, "Cannot request shutdown notification");
+ error (0, err, "Warning: cannot request shutdown notification");
/* Launch. */
ports_manage_port_operations_multithread (fsys->pi.bucket, random_demuxer,
diff --git a/startup/startup.c b/startup/startup.c
index 49ba9ce..f54de5e 100644
--- a/startup/startup.c
+++ b/startup/startup.c
@@ -1202,6 +1202,8 @@ launch_something (const char *why)
if (start_child (tries[try++], NULL) == 0)
return;
}
+ else
+ try++;
}
crash_system ();
diff --git a/trans/crash.c b/trans/crash.c
index 14783cf..f8e1658 100644
--- a/trans/crash.c
+++ b/trans/crash.c
@@ -30,6 +30,7 @@
#include <argz.h>
#include <sys/mman.h>
#include <assert.h>
+#include <pthread.h>
#include <version.h>
@@ -71,6 +72,7 @@ enum crash_action
static enum crash_action crash_how, crash_orphans_how;
static char *corefile_template;
+pthread_mutex_t corefile_template_lock = PTHREAD_MUTEX_INITIALIZER;
@@ -336,12 +338,15 @@ S_crash_dump_task (mach_port_t port,
if (!err)
{
file_t sink = core_file;
+ pthread_mutex_lock (&corefile_template_lock);
if (corefile_template)
{
char *file_name;
file_name = template_make_file_name (corefile_template,
task, signo);
+ pthread_mutex_unlock (&corefile_template_lock);
+
if (file_name == NULL)
error (0, errno, "template_make_file_name");
else
@@ -356,6 +361,8 @@ S_crash_dump_task (mach_port_t port,
free (file_name);
}
}
+ else
+ pthread_mutex_unlock (&corefile_template_lock);
err = dump_core (task, sink,
(off_t) -1, /* XXX should get core limit in RPC */
@@ -640,9 +647,26 @@ parse_opt (int opt, char *arg, struct argp_state *state)
{
char *errp;
if (! template_valid (arg, &errp))
- error (1, 0, "Invalid template: ...'%s'", errp);
+ {
+ argp_error (state, "Invalid template: ...'%s'", errp);
+ return EINVAL;
+ }
}
- corefile_template = arg;
+ pthread_mutex_lock (&corefile_template_lock);
+ free (corefile_template);
+ if (strlen (arg) == 0)
+ corefile_template = NULL;
+ else
+ {
+ corefile_template = strdup (arg);
+ if (corefile_template == NULL)
+ {
+ pthread_mutex_unlock (&corefile_template_lock);
+ argp_failure (state, 1, errno, "strdup");
+ return errno;
+ }
+ }
+ pthread_mutex_unlock (&corefile_template_lock);
break;
case ARGP_KEY_SUCCESS:
@@ -686,6 +710,7 @@ trivfs_append_args (struct trivfs_control *fsys,
err = argz_add (argz, argz_len, opt);
}
+ pthread_mutex_lock (&corefile_template_lock);
if (!err && corefile_template)
{
char *template;
@@ -697,6 +722,7 @@ trivfs_append_args (struct trivfs_control *fsys,
free (template);
}
}
+ pthread_mutex_unlock (&corefile_template_lock);
return err;
}
diff --git a/trans/remap.c b/trans/remap.c
index 5ee0189..5afbaa0 100644
--- a/trans/remap.c
+++ b/trans/remap.c
@@ -70,6 +70,7 @@ trivfs_S_dir_lookup (struct trivfs_protid *diruser,
return EOPNOTSUPP;
for (remap = remaps; remap; remap = remap->next)
+ /* FIXME: should match just prefix of filename too */
if (!strcmp (remap->from, filename))
{
#ifdef DEBUG
@@ -96,6 +97,12 @@ parse_opt (int key, char *arg, struct argp_state *state)
switch (key)
{
case ARGP_KEY_ARG:
+ if (arg[0] != '/')
+ {
+ argp_error (state, "remap only works with absolute paths: %s",
+ arg);
+ return EINVAL;
+ }
/* Skip heading slashes */
while (arg[0] == '/')
diff --git a/utils/fakeroot.sh b/utils/fakeroot.sh
index 7bc5dc7..daf18e7 100644
--- a/utils/fakeroot.sh
+++ b/utils/fakeroot.sh
@@ -54,6 +54,9 @@ if [ $# -eq 0 ]; then
set -- ${SHELL:-/bin/sh}
fi
+FAKED_MODE="unknown-is-root"
+export FAKED_MODE
+
# We exec settrans, which execs the "fakeauth" command in the chroot
# context provided by /hurd/fakeroot.
exec /bin/settrans \
diff --git a/utils/msgids.c b/utils/msgids.c
index 4bc08de..d17f131 100644
--- a/utils/msgids.c
+++ b/utils/msgids.c
@@ -200,7 +200,10 @@ static error_t parse_opt (int key, char *arg, struct
argp_state *state)
case 'i':
if (argz_add (&msgids_files_argz, &msgids_files_argz_len,
arg) != 0)
- error (1, errno, "argz_add");
+ {
+ argp_failure (state, 1, errno, "argz_add");
+ return errno;
+ }
break;
case 'I':
--
Alioth's /usr/local/bin/git-commit-notice on
/srv/git.debian.org/git/pkg-hurd/hurd.git