kern_loginclass.c (219304) | kern_loginclass.c (220137) |
---|---|
1/*- 2 * Copyright (c) 2011 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Edward Tomasz Napierala under sponsorship 6 * from the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 12 unchanged lines hidden (view full) --- 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * | 1/*- 2 * Copyright (c) 2011 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Edward Tomasz Napierala under sponsorship 6 * from the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 12 unchanged lines hidden (view full) --- 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * |
29 * $FreeBSD: head/sys/kern/kern_loginclass.c 219304 2011-03-05 12:40:35Z trasz $ | 29 * $FreeBSD: head/sys/kern/kern_loginclass.c 220137 2011-03-29 17:47:25Z trasz $ |
30 */ 31 32/* 33 * Processes may set login class name using setloginclass(2). This 34 * is usually done through call to setusercontext(3), by programs 35 * such as login(1), based on information from master.passwd(5). Kernel 36 * uses this information to enforce per-class resource limits. Current 37 * login class can be determined using id(1). Login class is inherited 38 * from the parent process during fork(2). If not set, it defaults 39 * to "default". 40 * 41 * Code in this file implements setloginclass(2) and getloginclass(2) 42 * system calls, and maintains class name storage and retrieval. 43 */ 44 45#include <sys/cdefs.h> | 30 */ 31 32/* 33 * Processes may set login class name using setloginclass(2). This 34 * is usually done through call to setusercontext(3), by programs 35 * such as login(1), based on information from master.passwd(5). Kernel 36 * uses this information to enforce per-class resource limits. Current 37 * login class can be determined using id(1). Login class is inherited 38 * from the parent process during fork(2). If not set, it defaults 39 * to "default". 40 * 41 * Code in this file implements setloginclass(2) and getloginclass(2) 42 * system calls, and maintains class name storage and retrieval. 43 */ 44 45#include <sys/cdefs.h> |
46__FBSDID("$FreeBSD: head/sys/kern/kern_loginclass.c 219304 2011-03-05 12:40:35Z trasz $"); | 46__FBSDID("$FreeBSD: head/sys/kern/kern_loginclass.c 220137 2011-03-29 17:47:25Z trasz $"); |
47 48#include <sys/param.h> 49#include <sys/eventhandler.h> 50#include <sys/kernel.h> 51#include <sys/lock.h> 52#include <sys/loginclass.h> 53#include <sys/malloc.h> 54#include <sys/mutex.h> 55#include <sys/types.h> 56#include <sys/priv.h> 57#include <sys/proc.h> 58#include <sys/queue.h> | 47 48#include <sys/param.h> 49#include <sys/eventhandler.h> 50#include <sys/kernel.h> 51#include <sys/lock.h> 52#include <sys/loginclass.h> 53#include <sys/malloc.h> 54#include <sys/mutex.h> 55#include <sys/types.h> 56#include <sys/priv.h> 57#include <sys/proc.h> 58#include <sys/queue.h> |
59#include <sys/racct.h> |
|
59#include <sys/refcount.h> 60#include <sys/sysproto.h> 61#include <sys/systm.h> 62 63static MALLOC_DEFINE(M_LOGINCLASS, "loginclass", "loginclass structures"); 64 65LIST_HEAD(, loginclass) loginclasses; 66 --- 18 unchanged lines hidden (view full) --- 85 int old; 86 87 old = lc->lc_refcount; 88 if (old > 1 && atomic_cmpset_int(&lc->lc_refcount, old, old - 1)) 89 return; 90 91 mtx_lock(&loginclasses_lock); 92 if (refcount_release(&lc->lc_refcount)) { | 60#include <sys/refcount.h> 61#include <sys/sysproto.h> 62#include <sys/systm.h> 63 64static MALLOC_DEFINE(M_LOGINCLASS, "loginclass", "loginclass structures"); 65 66LIST_HEAD(, loginclass) loginclasses; 67 --- 18 unchanged lines hidden (view full) --- 86 int old; 87 88 old = lc->lc_refcount; 89 if (old > 1 && atomic_cmpset_int(&lc->lc_refcount, old, old - 1)) 90 return; 91 92 mtx_lock(&loginclasses_lock); 93 if (refcount_release(&lc->lc_refcount)) { |
94 racct_destroy(&lc->lc_racct); |
|
93 LIST_REMOVE(lc, lc_next); 94 mtx_unlock(&loginclasses_lock); 95 free(lc, M_LOGINCLASS); 96 97 return; 98 } 99 mtx_unlock(&loginclasses_lock); 100} --- 9 unchanged lines hidden (view full) --- 110loginclass_find(const char *name) 111{ 112 struct loginclass *lc, *newlc; 113 114 if (name[0] == '\0' || strlen(name) >= MAXLOGNAME) 115 return (NULL); 116 117 newlc = malloc(sizeof(*newlc), M_LOGINCLASS, M_ZERO | M_WAITOK); | 95 LIST_REMOVE(lc, lc_next); 96 mtx_unlock(&loginclasses_lock); 97 free(lc, M_LOGINCLASS); 98 99 return; 100 } 101 mtx_unlock(&loginclasses_lock); 102} --- 9 unchanged lines hidden (view full) --- 112loginclass_find(const char *name) 113{ 114 struct loginclass *lc, *newlc; 115 116 if (name[0] == '\0' || strlen(name) >= MAXLOGNAME) 117 return (NULL); 118 119 newlc = malloc(sizeof(*newlc), M_LOGINCLASS, M_ZERO | M_WAITOK); |
120 racct_create(&newlc->lc_racct); |
|
118 119 mtx_lock(&loginclasses_lock); 120 LIST_FOREACH(lc, &loginclasses, lc_next) { 121 if (strcmp(name, lc->lc_name) != 0) 122 continue; 123 124 /* Found loginclass with a matching name? */ 125 loginclass_hold(lc); 126 mtx_unlock(&loginclasses_lock); | 121 122 mtx_lock(&loginclasses_lock); 123 LIST_FOREACH(lc, &loginclasses, lc_next) { 124 if (strcmp(name, lc->lc_name) != 0) 125 continue; 126 127 /* Found loginclass with a matching name? */ 128 loginclass_hold(lc); 129 mtx_unlock(&loginclasses_lock); |
130 racct_destroy(&newlc->lc_racct); |
|
127 free(newlc, M_LOGINCLASS); 128 return (lc); 129 } 130 131 /* Add new loginclass. */ 132 strcpy(newlc->lc_name, name); 133 refcount_init(&newlc->lc_refcount, 1); 134 LIST_INSERT_HEAD(&loginclasses, newlc, lc_next); --- 65 unchanged lines hidden (view full) --- 200 return (EINVAL); 201 newcred = crget(); 202 203 PROC_LOCK(p); 204 oldcred = crcopysafe(p, newcred); 205 newcred->cr_loginclass = newlc; 206 p->p_ucred = newcred; 207 PROC_UNLOCK(p); | 131 free(newlc, M_LOGINCLASS); 132 return (lc); 133 } 134 135 /* Add new loginclass. */ 136 strcpy(newlc->lc_name, name); 137 refcount_init(&newlc->lc_refcount, 1); 138 LIST_INSERT_HEAD(&loginclasses, newlc, lc_next); --- 65 unchanged lines hidden (view full) --- 204 return (EINVAL); 205 newcred = crget(); 206 207 PROC_LOCK(p); 208 oldcred = crcopysafe(p, newcred); 209 newcred->cr_loginclass = newlc; 210 p->p_ucred = newcred; 211 PROC_UNLOCK(p); |
208 | 212#ifdef RACCT 213 racct_proc_ucred_changed(p, oldcred, newcred); 214#endif |
209 loginclass_free(oldcred->cr_loginclass); 210 crfree(oldcred); 211 212 return (0); 213} 214 | 215 loginclass_free(oldcred->cr_loginclass); 216 crfree(oldcred); 217 218 return (0); 219} 220 |
221void 222loginclass_racct_foreach(void (*callback)(struct racct *racct, 223 void *arg2, void *arg3), void *arg2, void *arg3) 224{ 225 struct loginclass *lc; 226 227 mtx_lock(&loginclasses_lock); 228 LIST_FOREACH(lc, &loginclasses, lc_next) 229 (callback)(lc->lc_racct, arg2, arg3); 230 mtx_unlock(&loginclasses_lock); 231} 232 |
|
215static void 216lc_init(void) 217{ 218 219 mtx_init(&loginclasses_lock, "loginclasses lock", NULL, MTX_DEF); 220} | 233static void 234lc_init(void) 235{ 236 237 mtx_init(&loginclasses_lock, "loginclasses lock", NULL, MTX_DEF); 238} |