From 98a7f915f7b21b6b90de54ac31bfdafac2770598 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 5 Nov 2003 23:26:21 +0000 Subject: [PATCH] Variant symlink support stage 1/2: Implement support for storing and retrieving system-specific, user-specific, and process-specific variables. --- sys/conf/files | 3 +- sys/i386/i386/machdep.c | 3 +- sys/kern/init_sysent.c | 62 ++++++- sys/kern/kern_exec.c | 7 +- sys/kern/kern_fork.c | 6 +- sys/kern/kern_resource.c | 4 +- sys/kern/kern_varsym.c | 282 +++++++++++++++++++++++++++++++ sys/kern/syscalls.c | 62 ++++++- sys/kern/syscalls.master | 64 ++++++- sys/platform/pc32/i386/machdep.c | 3 +- sys/sys/proc.h | 9 +- sys/sys/resourcevar.h | 7 +- sys/sys/syscall-hide.h | 6 +- sys/sys/syscall.h | 8 +- sys/sys/syscall.mk | 8 +- sys/sys/sysproto.h | 25 ++- sys/sys/sysunion.h | 6 +- sys/sys/varsym.h | 63 +++++++ 18 files changed, 597 insertions(+), 31 deletions(-) create mode 100644 sys/kern/kern_varsym.c create mode 100644 sys/sys/varsym.h diff --git a/sys/conf/files b/sys/conf/files index 9f92f5a2c6..e5d82238f9 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -1,5 +1,5 @@ # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $ -# $DragonFly: src/sys/conf/files,v 1.24 2003/11/04 20:30:53 dillon Exp $ +# $DragonFly: src/sys/conf/files,v 1.25 2003/11/05 23:26:15 dillon Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -737,6 +737,7 @@ kern/inflate.c optional gzip kern/init_main.c standard kern/init_sysent.c standard kern/kern_intr.c standard +kern/kern_varsym.c standard kern/kern_module.c standard kern/kern_linker.c standard kern/link_aout.c standard diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index b8600cf723..99e3686b39 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -36,7 +36,7 @@ * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $ - * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.42 2003/11/03 22:50:11 dillon Exp $ + * $DragonFly: src/sys/i386/i386/Attic/machdep.c,v 1.43 2003/11/05 23:26:18 dillon Exp $ */ #include "use_apm.h" @@ -1707,6 +1707,7 @@ init386(int first) proc0.p_addr = (void *)thread0.td_kstack; proc0.p_thread = &thread0; proc0.p_flag |= P_CP_RELEASED; /* early set. See also init_main.c */ + varsymset_init(&proc0.p_varsymset, NULL); thread0.td_flags |= TDF_RUNNING; thread0.td_proc = &proc0; thread0.td_switch = cpu_heavy_switch; /* YYY eventually LWKT */ diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 8c1804ff50..4ac3c056f9 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -2,8 +2,8 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/kern/init_sysent.c,v 1.9 2003/10/24 14:10:46 daver Exp $ - * created from DragonFly + * $DragonFly: src/sys/kern/init_sysent.c,v 1.10 2003/11/05 23:26:20 dillon Exp $ + * created from DragonFly: src/sys/kern/syscalls.master,v 1.6 2003/10/24 14:10:46 daver Exp */ #include "opt_compat.h" @@ -416,4 +416,62 @@ struct sysent sysent[] = { { 0, (sy_call_t *)nosys }, /* 391 = nosys */ { 0, (sy_call_t *)nosys }, /* 392 = nosys */ { AS(sendfile_args), (sy_call_t *)sendfile }, /* 393 = sendfile */ + { 0, (sy_call_t *)nosys }, /* 394 = nosys */ + { 0, (sy_call_t *)nosys }, /* 395 = nosys */ + { 0, (sy_call_t *)nosys }, /* 396 = nosys */ + { 0, (sy_call_t *)nosys }, /* 397 = nosys */ + { 0, (sy_call_t *)nosys }, /* 398 = nosys */ + { 0, (sy_call_t *)nosys }, /* 399 = nosys */ + { 0, (sy_call_t *)nosys }, /* 400 = nosys */ + { 0, (sy_call_t *)nosys }, /* 401 = nosys */ + { 0, (sy_call_t *)nosys }, /* 402 = nosys */ + { 0, (sy_call_t *)nosys }, /* 403 = nosys */ + { 0, (sy_call_t *)nosys }, /* 404 = nosys */ + { 0, (sy_call_t *)nosys }, /* 405 = nosys */ + { 0, (sy_call_t *)nosys }, /* 406 = nosys */ + { 0, (sy_call_t *)nosys }, /* 407 = nosys */ + { 0, (sy_call_t *)nosys }, /* 408 = nosys */ + { 0, (sy_call_t *)nosys }, /* 409 = nosys */ + { 0, (sy_call_t *)nosys }, /* 410 = nosys */ + { 0, (sy_call_t *)nosys }, /* 411 = nosys */ + { 0, (sy_call_t *)nosys }, /* 412 = nosys */ + { 0, (sy_call_t *)nosys }, /* 413 = nosys */ + { 0, (sy_call_t *)nosys }, /* 414 = nosys */ + { 0, (sy_call_t *)nosys }, /* 415 = nosys */ + { 0, (sy_call_t *)nosys }, /* 416 = nosys */ + { 0, (sy_call_t *)nosys }, /* 417 = nosys */ + { 0, (sy_call_t *)nosys }, /* 418 = nosys */ + { 0, (sy_call_t *)nosys }, /* 419 = nosys */ + { 0, (sy_call_t *)nosys }, /* 420 = nosys */ + { 0, (sy_call_t *)nosys }, /* 421 = nosys */ + { 0, (sy_call_t *)nosys }, /* 422 = nosys */ + { 0, (sy_call_t *)nosys }, /* 423 = nosys */ + { 0, (sy_call_t *)nosys }, /* 424 = nosys */ + { 0, (sy_call_t *)nosys }, /* 425 = nosys */ + { 0, (sy_call_t *)nosys }, /* 426 = nosys */ + { 0, (sy_call_t *)nosys }, /* 427 = nosys */ + { 0, (sy_call_t *)nosys }, /* 428 = nosys */ + { 0, (sy_call_t *)nosys }, /* 429 = nosys */ + { 0, (sy_call_t *)nosys }, /* 430 = nosys */ + { 0, (sy_call_t *)nosys }, /* 431 = nosys */ + { 0, (sy_call_t *)nosys }, /* 432 = nosys */ + { 0, (sy_call_t *)nosys }, /* 433 = nosys */ + { 0, (sy_call_t *)nosys }, /* 434 = nosys */ + { 0, (sy_call_t *)nosys }, /* 435 = nosys */ + { 0, (sy_call_t *)nosys }, /* 436 = nosys */ + { 0, (sy_call_t *)nosys }, /* 437 = nosys */ + { 0, (sy_call_t *)nosys }, /* 438 = nosys */ + { 0, (sy_call_t *)nosys }, /* 439 = nosys */ + { 0, (sy_call_t *)nosys }, /* 440 = nosys */ + { 0, (sy_call_t *)nosys }, /* 441 = nosys */ + { 0, (sy_call_t *)nosys }, /* 442 = nosys */ + { 0, (sy_call_t *)nosys }, /* 443 = nosys */ + { 0, (sy_call_t *)nosys }, /* 444 = nosys */ + { 0, (sy_call_t *)nosys }, /* 445 = nosys */ + { 0, (sy_call_t *)nosys }, /* 446 = nosys */ + { 0, (sy_call_t *)nosys }, /* 447 = nosys */ + { 0, (sy_call_t *)nosys }, /* 448 = nosys */ + { 0, (sy_call_t *)nosys }, /* 449 = nosys */ + { AS(varsym_set_args), (sy_call_t *)varsym_set }, /* 450 = varsym_set */ + { AS(varsym_get_args), (sy_call_t *)varsym_get }, /* 451 = varsym_get */ }; diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index eca09b674c..c83b534997 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/kern/kern_exec.c,v 1.107.2.15 2002/07/30 15:40:46 nectar Exp $ - * $DragonFly: src/sys/kern/kern_exec.c,v 1.12 2003/09/23 05:03:51 dillon Exp $ + * $DragonFly: src/sys/kern/kern_exec.c,v 1.13 2003/11/05 23:26:20 dillon Exp $ */ #include @@ -337,6 +337,11 @@ interpret: change_euid(attr.va_uid); if (attr.va_mode & VSGID) p->p_ucred->cr_gid = attr.va_gid; + + /* + * Clear local varsym variables + */ + varsymset_clean(&p->p_varsymset); } else { if (p->p_ucred->cr_uid == p->p_ucred->cr_ruid && p->p_ucred->cr_gid == p->p_ucred->cr_rgid) diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 04f63b244b..841a377f12 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -37,7 +37,7 @@ * * @(#)kern_fork.c 8.6 (Berkeley) 4/8/94 * $FreeBSD: src/sys/kern/kern_fork.c,v 1.72.2.13 2003/06/06 20:21:32 tegge Exp $ - * $DragonFly: src/sys/kern/kern_fork.c,v 1.15 2003/07/30 00:19:14 dillon Exp $ + * $DragonFly: src/sys/kern/kern_fork.c,v 1.16 2003/11/05 23:26:20 dillon Exp $ */ #include "opt_ktrace.h" @@ -429,8 +429,7 @@ again: * Shared file descriptor table, and * different process leaders */ - fdtol = filedesc_to_leader_alloc(p1->p_fdtol, - p2); + fdtol = filedesc_to_leader_alloc(p1->p_fdtol, p2); } } p2->p_fdtol = fdtol; @@ -474,6 +473,7 @@ again: p2->p_pptr = pptr; LIST_INSERT_HEAD(&pptr->p_children, p2, p_sibling); LIST_INIT(&p2->p_children); + varsymset_init(&p2->p_varsymset, &p1->p_varsymset); #ifdef KTRACE /* diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 926f88748a..b08af85ba8 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -37,7 +37,7 @@ * * @(#)kern_resource.c 8.5 (Berkeley) 1/21/94 * $FreeBSD: src/sys/kern/kern_resource.c,v 1.55.2.5 2001/11/03 01:41:08 ps Exp $ - * $DragonFly: src/sys/kern/kern_resource.c,v 1.16 2003/11/05 20:24:37 dillon Exp $ + * $DragonFly: src/sys/kern/kern_resource.c,v 1.17 2003/11/05 23:26:20 dillon Exp $ */ #include "opt_compat.h" @@ -558,6 +558,7 @@ uicreate(uid_t uid) uip->ui_proccnt = 0; uip->ui_sbsize = 0; uip->ui_ref = 0; + varsymset_init(&uip->ui_varsymset, NULL); return (uip); } @@ -584,6 +585,7 @@ uifree(struct uidinfo *uip) printf("freeing uidinfo: uid = %d, proccnt = %ld\n", uip->ui_uid, uip->ui_proccnt); LIST_REMOVE(uip, ui_hash); + varsymset_clean(&uip->ui_varsymset); FREE(uip, M_UIDINFO); } diff --git a/sys/kern/kern_varsym.c b/sys/kern/kern_varsym.c new file mode 100644 index 0000000000..4b8bce2366 --- /dev/null +++ b/sys/kern/kern_varsym.c @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2003 Matthew Dillon + * All rights reserved. + * + * 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 AUTHOR 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 AUTHOR 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. + * + * $DragonFly: src/sys/kern/kern_varsym.c,v 1.1 2003/11/05 23:26:20 dillon Exp $ + */ + +/* + * This module implements variable storage and management for variant + * symlinks. These variables may also be used for general purposes. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MALLOC_DEFINE(M_VARSYM, "varsym", "variable sets for variant symlinks"); + +struct varsymset varsymset_sys; + +/* + * Initialize the variant symlink subsystem + */ +static void +varsym_sysinit(void *dummy) +{ + varsymset_init(&varsymset_sys, NULL); +} +SYSINIT(announce, SI_SUB_INTRINSIC, SI_ORDER_FIRST, varsym_sysinit, NULL); + +/* + * varsym_set() system call + * + * (int level, const char *name, const char *data) + */ +int +varsym_set(struct varsym_set_args *uap) +{ + char name[MAXVARSYM_NAME]; + char *buf; + int error; + + if ((error = copyinstr(uap->name, name, sizeof(name), NULL)) != 0) + goto done2; + buf = malloc(MAXVARSYM_DATA, M_TEMP, 0); + if (uap->data && + (error = copyinstr(uap->data, buf, MAXVARSYM_DATA, NULL)) != 0) + { + goto done1; + } + switch(uap->level) { + case VARSYM_SYS: + if ((error = suser(curthread)) != 0) + break; + /* XXX implement per-jail sys */ + /* fall through */ + case VARSYM_USER: + /* XXX check jail / implement per-jail user */ + /* fall through */ + case VARSYM_PROC: + if (uap->data) { + (void)varsymmake(uap->level, name, NULL); + error = varsymmake(uap->level, name, buf); + } else { + error = varsymmake(uap->level, name, NULL); + } + break; + } +done1: + free(buf, M_TEMP); +done2: + return(error); +} + +/* + * varsym_get() system call + * + * (int mask, const char *wild, char *buf, int bufsize) + */ +int +varsym_get(struct varsym_get_args *uap) +{ + char wild[MAXVARSYM_NAME]; + varsym_t sym; + int error; + int dlen; + + if ((error = copyinstr(uap->wild, wild, sizeof(wild), NULL)) != 0) + goto done; + sym = varsymfind(uap->mask, wild, strlen(wild)); + if (sym == NULL) { + error = ENOENT; + goto done; + } + dlen = strlen(sym->vs_data); + if (dlen < uap->bufsize) { + copyout(sym->vs_data, uap->buf, dlen + 1); + } else if (uap->bufsize) { + copyout("", uap->buf, 1); + } + uap->sysmsg_result = dlen + 1; + varsymdrop(sym); +done: + return(error); +} + +/* + * Lookup a variant symlink. XXX use a hash table. + */ +static +struct varsyment * +varsymlookup(struct varsymset *vss, const char *name, int namelen) +{ + struct varsyment *ve; + + TAILQ_FOREACH(ve, &vss->vx_queue, ve_entry) { + varsym_t var = ve->ve_sym; + if (var->vs_namelen == namelen && + bcmp(name, var->vs_name, namelen) == 0 + ) { + return(ve); + } + } + return(NULL); +} + +varsym_t +varsymfind(int mask, const char *name, int namelen) +{ + struct proc *p; + struct varsyment *ve = NULL; + varsym_t sym; + + if ((mask & (VARSYM_PROC_MASK|VARSYM_USER_MASK)) && (p = curproc) != NULL) { + if (mask & VARSYM_PROC_MASK) + ve = varsymlookup(&p->p_varsymset, name, namelen); + if (ve == NULL && (mask & VARSYM_USER_MASK)) + ve = varsymlookup(&p->p_ucred->cr_uidinfo->ui_varsymset, name, namelen); + } + if (ve == NULL && (mask & VARSYM_SYS_MASK)) + ve = varsymlookup(&varsymset_sys, name, namelen); + if (ve) { + sym = ve->ve_sym; + ++sym->vs_refs; + return(sym); + } else { + return(NULL); + } +} + +int +varsymmake(int level, const char *name, const char *data) +{ + struct varsymset *vss = NULL; + struct varsyment *ve; + struct proc *p = curproc; + varsym_t sym; + int namelen = strlen(name); + int datalen; + int error; + + switch(level) { + case VARSYM_PROC: + if (p) + vss = &p->p_varsymset; + break; + case VARSYM_USER: + if (p) + vss = &p->p_ucred->cr_uidinfo->ui_varsymset; + break; + case VARSYM_SYS: + vss = &varsymset_sys; + break; + } + if (vss == NULL) { + error = EINVAL; + } else if (data && vss->vx_setsize >= MAXVARSYM_SET) { + error = E2BIG; + } else if (data) { + datalen = strlen(data); + ve = malloc(sizeof(struct varsyment), M_VARSYM, M_ZERO); + sym = malloc(sizeof(struct varsym) + namelen + datalen + 2, M_VARSYM, 0); + ve->ve_sym = sym; + sym->vs_refs = 1; + sym->vs_namelen = namelen; + sym->vs_name = (char *)(sym + 1); + sym->vs_data = sym->vs_name + namelen + 1; + strcpy(sym->vs_name, name); + strcpy(sym->vs_data, data); + TAILQ_INSERT_TAIL(&vss->vx_queue, ve, ve_entry); + vss->vx_setsize += sizeof(struct varsyment) + sizeof(struct varsym) + namelen + datalen + 8; + error = 0; + } else { + if ((ve = varsymlookup(vss, name, namelen)) != NULL) { + TAILQ_REMOVE(&vss->vx_queue, ve, ve_entry); + vss->vx_setsize -= sizeof(struct varsyment) + sizeof(struct varsym) + namelen + strlen(ve->ve_sym->vs_data) + 8; + varsymdrop(ve->ve_sym); + free(ve, M_VARSYM); + error = 0; + } else { + error = ENOENT; + } + } + return(error); +} + +void +varsymdrop(varsym_t sym) +{ + KKASSERT(sym->vs_refs > 0); + if (--sym->vs_refs == 0) { + free(sym, M_VARSYM); + } +} + +static void +varsymdup(struct varsymset *vss, struct varsyment *ve) +{ + struct varsyment *nve; + + nve = malloc(sizeof(struct varsyment), M_VARSYM, M_ZERO); + nve->ve_sym = ve->ve_sym; + ++nve->ve_sym->vs_refs; + TAILQ_INSERT_TAIL(&vss->vx_queue, nve, ve_entry); +} + +void +varsymset_init(struct varsymset *vss, struct varsymset *copy) +{ + struct varsyment *ve; + + TAILQ_INIT(&vss->vx_queue); + if (copy) { + TAILQ_FOREACH(ve, ©->vx_queue, ve_entry) { + varsymdup(vss, ve); + } + vss->vx_setsize = copy->vx_setsize; + } +} + +void +varsymset_clean(struct varsymset *vss) +{ + struct varsyment *ve; + + while ((ve = TAILQ_FIRST(&vss->vx_queue)) != NULL) { + TAILQ_REMOVE(&vss->vx_queue, ve, ve_entry); + varsymdrop(ve->ve_sym); + free(ve, M_VARSYM); + } + vss->vx_setsize = 0; +} + diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index 1906874eee..0c9a9ae00e 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -2,8 +2,8 @@ * System call names. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/kern/syscalls.c,v 1.9 2003/10/24 14:10:46 daver Exp $ - * created from DragonFly + * $DragonFly: src/sys/kern/syscalls.c,v 1.10 2003/11/05 23:26:20 dillon Exp $ + * created from DragonFly: src/sys/kern/syscalls.master,v 1.6 2003/10/24 14:10:46 daver Exp */ char *syscallnames[] = { @@ -401,4 +401,62 @@ char *syscallnames[] = { "#391", /* 391 = nosys */ "#392", /* 392 = nosys */ "sendfile", /* 393 = sendfile */ + "#394", /* 394 = nosys */ + "#395", /* 395 = nosys */ + "#396", /* 396 = nosys */ + "#397", /* 397 = nosys */ + "#398", /* 398 = nosys */ + "#399", /* 399 = nosys */ + "#400", /* 400 = nosys */ + "#401", /* 401 = nosys */ + "#402", /* 402 = nosys */ + "#403", /* 403 = nosys */ + "#404", /* 404 = nosys */ + "#405", /* 405 = nosys */ + "#406", /* 406 = nosys */ + "#407", /* 407 = nosys */ + "#408", /* 408 = nosys */ + "#409", /* 409 = nosys */ + "#410", /* 410 = nosys */ + "#411", /* 411 = nosys */ + "#412", /* 412 = nosys */ + "#413", /* 413 = nosys */ + "#414", /* 414 = nosys */ + "#415", /* 415 = nosys */ + "#416", /* 416 = nosys */ + "#417", /* 417 = nosys */ + "#418", /* 418 = nosys */ + "#419", /* 419 = nosys */ + "#420", /* 420 = nosys */ + "#421", /* 421 = nosys */ + "#422", /* 422 = nosys */ + "#423", /* 423 = nosys */ + "#424", /* 424 = nosys */ + "#425", /* 425 = nosys */ + "#426", /* 426 = nosys */ + "#427", /* 427 = nosys */ + "#428", /* 428 = nosys */ + "#429", /* 429 = nosys */ + "#430", /* 430 = nosys */ + "#431", /* 431 = nosys */ + "#432", /* 432 = nosys */ + "#433", /* 433 = nosys */ + "#434", /* 434 = nosys */ + "#435", /* 435 = nosys */ + "#436", /* 436 = nosys */ + "#437", /* 437 = nosys */ + "#438", /* 438 = nosys */ + "#439", /* 439 = nosys */ + "#440", /* 440 = nosys */ + "#441", /* 441 = nosys */ + "#442", /* 442 = nosys */ + "#443", /* 443 = nosys */ + "#444", /* 444 = nosys */ + "#445", /* 445 = nosys */ + "#446", /* 446 = nosys */ + "#447", /* 447 = nosys */ + "#448", /* 448 = nosys */ + "#449", /* 449 = nosys */ + "varsym_set", /* 450 = varsym_set */ + "varsym_get", /* 451 = varsym_get */ }; diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index e2e2613768..c8b8128e4c 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ - $DragonFly: src/sys/kern/syscalls.master,v 1.6 2003/10/24 14:10:46 daver Exp $ + $DragonFly: src/sys/kern/syscalls.master,v 1.7 2003/11/05 23:26:20 dillon Exp $ ; @(#)syscalls.master 8.2 (Berkeley) 1/13/94 ; $FreeBSD: src/sys/kern/syscalls.master,v 1.72.2.10 2002/07/12 08:22:46 alfred Exp $ @@ -521,6 +521,7 @@ struct kevent *eventlist, int nevents, \ const struct timespec *timeout); } +; 364-392 used by FreeBSD-current 364 UNIMPL NOHIDE nosys 365 UNIMPL NOHIDE nosys 366 UNIMPL NOHIDE nosys @@ -552,3 +553,64 @@ 392 UNIMPL NOHIDE nosys 393 STD BSD { int sendfile(int fd, int s, off_t offset, size_t nbytes, \ struct sf_hdtr *hdtr, off_t *sbytes, int flags); } +; 394-439 used by FreeBSD-current +394 UNIMPL NOHIDE nosys +395 UNIMPL NOHIDE nosys +396 UNIMPL NOHIDE nosys +397 UNIMPL NOHIDE nosys +398 UNIMPL NOHIDE nosys +399 UNIMPL NOHIDE nosys +400 UNIMPL NOHIDE nosys +401 UNIMPL NOHIDE nosys +402 UNIMPL NOHIDE nosys +403 UNIMPL NOHIDE nosys +404 UNIMPL NOHIDE nosys +405 UNIMPL NOHIDE nosys +406 UNIMPL NOHIDE nosys +407 UNIMPL NOHIDE nosys +408 UNIMPL NOHIDE nosys +409 UNIMPL NOHIDE nosys +410 UNIMPL NOHIDE nosys +411 UNIMPL NOHIDE nosys +412 UNIMPL NOHIDE nosys +413 UNIMPL NOHIDE nosys +414 UNIMPL NOHIDE nosys +415 UNIMPL NOHIDE nosys +416 UNIMPL NOHIDE nosys +417 UNIMPL NOHIDE nosys +418 UNIMPL NOHIDE nosys +419 UNIMPL NOHIDE nosys +420 UNIMPL NOHIDE nosys +421 UNIMPL NOHIDE nosys +422 UNIMPL NOHIDE nosys +423 UNIMPL NOHIDE nosys +424 UNIMPL NOHIDE nosys +425 UNIMPL NOHIDE nosys +426 UNIMPL NOHIDE nosys +427 UNIMPL NOHIDE nosys +428 UNIMPL NOHIDE nosys +429 UNIMPL NOHIDE nosys +430 UNIMPL NOHIDE nosys +431 UNIMPL NOHIDE nosys +432 UNIMPL NOHIDE nosys +433 UNIMPL NOHIDE nosys +434 UNIMPL NOHIDE nosys +435 UNIMPL NOHIDE nosys +436 UNIMPL NOHIDE nosys +437 UNIMPL NOHIDE nosys +438 UNIMPL NOHIDE nosys +439 UNIMPL NOHIDE nosys +; 440-449 reserved for FreeBSD-5.x growth +440 UNIMPL NOHIDE nosys +441 UNIMPL NOHIDE nosys +442 UNIMPL NOHIDE nosys +443 UNIMPL NOHIDE nosys +444 UNIMPL NOHIDE nosys +445 UNIMPL NOHIDE nosys +446 UNIMPL NOHIDE nosys +447 UNIMPL NOHIDE nosys +448 UNIMPL NOHIDE nosys +449 UNIMPL NOHIDE nosys +; 450 DragonFly system calls +450 STD BSD { int varsym_set(int level, const char *name, const char *data); } +451 STD BSD { int varsym_get(int mask, const char *wild, char *buf, int bufsize); } diff --git a/sys/platform/pc32/i386/machdep.c b/sys/platform/pc32/i386/machdep.c index 91d0e6d97a..58ce14d65a 100644 --- a/sys/platform/pc32/i386/machdep.c +++ b/sys/platform/pc32/i386/machdep.c @@ -36,7 +36,7 @@ * * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91 * $FreeBSD: src/sys/i386/i386/machdep.c,v 1.385.2.30 2003/05/31 08:48:05 alc Exp $ - * $DragonFly: src/sys/platform/pc32/i386/machdep.c,v 1.42 2003/11/03 22:50:11 dillon Exp $ + * $DragonFly: src/sys/platform/pc32/i386/machdep.c,v 1.43 2003/11/05 23:26:18 dillon Exp $ */ #include "use_apm.h" @@ -1707,6 +1707,7 @@ init386(int first) proc0.p_addr = (void *)thread0.td_kstack; proc0.p_thread = &thread0; proc0.p_flag |= P_CP_RELEASED; /* early set. See also init_main.c */ + varsymset_init(&proc0.p_varsymset, NULL); thread0.td_flags |= TDF_RUNNING; thread0.td_proc = &proc0; thread0.td_switch = cpu_heavy_switch; /* YYY eventually LWKT */ diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 0f36e7080c..611c389eab 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -37,7 +37,7 @@ * * @(#)proc.h 8.15 (Berkeley) 5/19/95 * $FreeBSD: src/sys/sys/proc.h,v 1.99.2.9 2003/06/06 20:21:32 tegge Exp $ - * $DragonFly: src/sys/sys/proc.h,v 1.34 2003/10/17 07:30:40 dillon Exp $ + * $DragonFly: src/sys/sys/proc.h,v 1.35 2003/11/05 23:26:21 dillon Exp $ */ #ifndef _SYS_PROC_H_ @@ -54,6 +54,7 @@ #include #include /* For struct klist */ #include +#include #ifdef _KERNEL #include #endif @@ -149,11 +150,9 @@ struct proc { struct proc *p_pptr; /* Pointer to parent process. */ LIST_ENTRY(proc) p_sibling; /* List of sibling processes. */ LIST_HEAD(, proc) p_children; /* Pointer to list of children. */ + struct callout_handle p_ithandle; /* for scheduling p_realtimer */ + struct varsymset p_varsymset; - struct callout_handle p_ithandle; /* - * Callout handle for scheduling - * p_realtimer. - */ /* The following fields are all zeroed upon creation in fork. */ #define p_startzero p_oppid diff --git a/sys/sys/resourcevar.h b/sys/sys/resourcevar.h index 495a8ce3e5..73b74176a4 100644 --- a/sys/sys/resourcevar.h +++ b/sys/sys/resourcevar.h @@ -32,7 +32,7 @@ * * @(#)resourcevar.h 8.4 (Berkeley) 1/9/95 * $FreeBSD: src/sys/sys/resourcevar.h,v 1.16.2.1 2000/09/07 19:13:55 truckman Exp $ - * $DragonFly: src/sys/sys/resourcevar.h,v 1.5 2003/11/05 20:24:38 dillon Exp $ + * $DragonFly: src/sys/sys/resourcevar.h,v 1.6 2003/11/05 23:26:21 dillon Exp $ */ #ifndef _SYS_RESOURCEVAR_H_ @@ -41,6 +41,10 @@ #include #include +#ifndef _SYS_VARSYM_H_ +#include +#endif + /* * Kernel per-process accounting / statistics * (not necessarily resident except when running). @@ -91,6 +95,7 @@ struct uidinfo { long ui_proccnt; /* number of processes */ uid_t ui_uid; /* uid */ int ui_ref; /* reference count */ + struct varsymset ui_varsymset; /* variant symlinks */ }; #ifdef _KERNEL diff --git a/sys/sys/syscall-hide.h b/sys/sys/syscall-hide.h index b47ef648dc..6527308d0a 100644 --- a/sys/sys/syscall-hide.h +++ b/sys/sys/syscall-hide.h @@ -2,8 +2,8 @@ * System call hiders. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/syscall-hide.h,v 1.10 2003/10/24 14:10:46 daver Exp $ - * created from DragonFly + * $DragonFly: src/sys/sys/syscall-hide.h,v 1.11 2003/11/05 23:26:21 dillon Exp $ + * created from DragonFly: src/sys/kern/syscalls.master,v 1.6 2003/10/24 14:10:46 daver Exp */ HIDE_POSIX(fork) @@ -275,3 +275,5 @@ HIDE_BSD(getresgid) HIDE_BSD(kqueue) HIDE_BSD(kevent) HIDE_BSD(sendfile) +HIDE_BSD(varsym_set) +HIDE_BSD(varsym_get) diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h index 404be43102..f8f2cdfbc4 100644 --- a/sys/sys/syscall.h +++ b/sys/sys/syscall.h @@ -2,8 +2,8 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/syscall.h,v 1.10 2003/10/24 14:10:46 daver Exp $ - * created from DragonFly + * $DragonFly: src/sys/sys/syscall.h,v 1.11 2003/11/05 23:26:21 dillon Exp $ + * created from DragonFly: src/sys/kern/syscalls.master,v 1.6 2003/10/24 14:10:46 daver Exp */ #define SYS_syscall 0 @@ -286,4 +286,6 @@ #define SYS_kqueue 362 #define SYS_kevent 363 #define SYS_sendfile 393 -#define SYS_MAXSYSCALL 394 +#define SYS_varsym_set 450 +#define SYS_varsym_get 451 +#define SYS_MAXSYSCALL 452 diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk index 28b2810251..8826e027f6 100644 --- a/sys/sys/syscall.mk +++ b/sys/sys/syscall.mk @@ -1,7 +1,7 @@ # DragonFly system call names. # DO NOT EDIT-- this file is automatically generated. -# $DragonFly: src/sys/sys/syscall.mk,v 1.10 2003/10/24 14:10:46 daver Exp $ -# created from DragonFly +# $DragonFly: src/sys/sys/syscall.mk,v 1.11 2003/11/05 23:26:21 dillon Exp $ +# created from DragonFly: src/sys/kern/syscalls.master,v 1.6 2003/10/24 14:10:46 daver Exp MIASM = \ syscall.o \ exit.o \ @@ -235,4 +235,6 @@ MIASM = \ getresgid.o \ kqueue.o \ kevent.o \ - sendfile.o + sendfile.o \ + varsym_set.o \ + varsym_get.o diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h index 0d7067c953..1f266f002c 100644 --- a/sys/sys/sysproto.h +++ b/sys/sys/sysproto.h @@ -2,8 +2,8 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/sysproto.h,v 1.10 2003/10/24 14:10:46 daver Exp $ - * created from DragonFly + * $DragonFly: src/sys/sys/sysproto.h,v 1.11 2003/11/05 23:26:21 dillon Exp $ + * created from DragonFly: src/sys/kern/syscalls.master,v 1.6 2003/10/24 14:10:46 daver Exp */ #ifndef _SYS_SYSPROTO_H_ @@ -1956,6 +1956,25 @@ struct sendfile_args { off_t * sbytes; char sbytes_[PAD_(off_t *)]; int flags; char flags_[PAD_(int)]; }; +struct varsym_set_args { +#ifdef _KERNEL + union sysmsg sysmsg; +#endif + union usrmsg usrmsg; + int level; char level_[PAD_(int)]; + const char * name; char name_[PAD_(const char *)]; + const char * data; char data_[PAD_(const char *)]; +}; +struct varsym_get_args { +#ifdef _KERNEL + union sysmsg sysmsg; +#endif + union usrmsg usrmsg; + int mask; char mask_[PAD_(int)]; + const char * wild; char wild_[PAD_(const char *)]; + char * buf; char buf_[PAD_(char *)]; + int bufsize; char bufsize_[PAD_(int)]; +}; #ifdef _KERNEL @@ -2190,6 +2209,8 @@ int getresgid (struct getresgid_args *); int kqueue (struct kqueue_args *); int kevent (struct kevent_args *); int sendfile (struct sendfile_args *); +int varsym_set (struct varsym_set_args *); +int varsym_get (struct varsym_get_args *); #endif /* _KERNEL */ diff --git a/sys/sys/sysunion.h b/sys/sys/sysunion.h index 8f031193d5..fc255ab3e9 100644 --- a/sys/sys/sysunion.h +++ b/sys/sys/sysunion.h @@ -2,8 +2,8 @@ * Union of syscall args for messaging. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/sysunion.h,v 1.7 2003/10/24 14:10:46 daver Exp $ - * created from DragonFly + * $DragonFly: src/sys/sys/sysunion.h,v 1.8 2003/11/05 23:26:21 dillon Exp $ + * created from DragonFly: src/sys/kern/syscalls.master,v 1.6 2003/10/24 14:10:46 daver Exp */ union sysunion { @@ -320,4 +320,6 @@ union sysunion { struct kqueue_args kqueue; struct kevent_args kevent; struct sendfile_args sendfile; + struct varsym_set_args varsym_set; + struct varsym_get_args varsym_get; }; diff --git a/sys/sys/varsym.h b/sys/sys/varsym.h new file mode 100644 index 0000000000..2f60f59937 --- /dev/null +++ b/sys/sys/varsym.h @@ -0,0 +1,63 @@ +/* + * SYS/VARSYM.H + * + * Implements structures used for variant symlink support. + * + * $DragonFly: src/sys/sys/varsym.h,v 1.1 2003/11/05 23:26:21 dillon Exp $ + */ + +#ifndef _SYS_VARSYM_H_ +#define _SYS_VARSYM_H_ + +/*#if defined(_KERNEL) || defined(_KERNEL_STRUCTURES) FUTURE */ +#if 1 + +#ifndef _SYS_QUEUE_H_ +#include /* TAILQ_* macros */ +#endif + +struct varsym { + int vs_refs; /* a lot of sharing occurs */ + int vs_namelen; + char *vs_name; /* variable name */ + char *vs_data; /* variable contents */ +}; + +typedef struct varsym *varsym_t; + +struct varsyment { + TAILQ_ENTRY(varsyment) ve_entry; + varsym_t ve_sym; +}; + +struct varsymset { + TAILQ_HEAD(, varsyment) vx_queue; + int vx_setsize; +}; + +#endif /* _KERNEL || _KERNEL_STRUCTURES */ + +#define VARSYM_PROC 1 +#define VARSYM_USER 2 +#define VARSYM_SYS 3 + +#define VARSYM_PROC_MASK (1 << VARSYM_PROC) +#define VARSYM_USER_MASK (1 << VARSYM_USER) +#define VARSYM_SYS_MASK (1 << VARSYM_SYS) +#define VARSYM_ALL_MASK (VARSYM_PROC_MASK|VARSYM_USER_MASK|VARSYM_SYS_MASK) + +#define MAXVARSYM_NAME 64 +#define MAXVARSYM_DATA 256 +#define MAXVARSYM_SET 8192 + +#ifdef _KERNEL + +varsym_t varsymfind(int mask, const char *name, int namelen); +int varsymmake(int level, const char *name, const char *data); +void varsymdrop(varsym_t var); +void varsymset_init(struct varsymset *varsymset, struct varsymset *copy); +void varsymset_clean(struct varsymset *varsymset); + +#endif /* _KERNEL */ + +#endif -- 2.41.0