Deleted Added
full compact
sem_new.c (201561) sem_new.c (201715)
1/*
2 * Copyright (C) 2010 David Xu <davidxu@freebsd.org>.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 12 unchanged lines hidden (view full) ---

21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
1/*
2 * Copyright (C) 2010 David Xu <davidxu@freebsd.org>.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 12 unchanged lines hidden (view full) ---

21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * $FreeBSD: head/lib/libc/gen/sem_new.c 201561 2010-01-05 06:40:27Z davidxu $
29 * $FreeBSD: head/lib/libc/gen/sem_new.c 201715 2010-01-07 04:15:49Z davidxu $
30 */
31
32#include "namespace.h"
33#include <sys/types.h>
34#include <sys/queue.h>
35#include <sys/mman.h>
36#include <sys/stat.h>
37#include <errno.h>

--- 100 unchanged lines hidden (view full) ---

138{
139 char path[PATH_MAX];
140
141 struct stat sb;
142 va_list ap;
143 struct sem_nameinfo *ni = NULL;
144 sem_t *sem = NULL;
145 int fd = -1, mode, len;
30 */
31
32#include "namespace.h"
33#include <sys/types.h>
34#include <sys/queue.h>
35#include <sys/mman.h>
36#include <sys/stat.h>
37#include <errno.h>

--- 100 unchanged lines hidden (view full) ---

138{
139 char path[PATH_MAX];
140
141 struct stat sb;
142 va_list ap;
143 struct sem_nameinfo *ni = NULL;
144 sem_t *sem = NULL;
145 int fd = -1, mode, len;
146 int value = 0;
146
147 if (name[0] != '/') {
148 errno = EINVAL;
149 return (NULL);
150 }
151 name++;
152
153 if (flags & ~(O_CREAT|O_EXCL)) {

--- 11 unchanged lines hidden (view full) ---

165 _pthread_mutex_unlock(&sem_llock);
166 return (sem);
167 }
168 }
169
170 if (flags & O_CREAT) {
171 va_start(ap, flags);
172 mode = va_arg(ap, int);
147
148 if (name[0] != '/') {
149 errno = EINVAL;
150 return (NULL);
151 }
152 name++;
153
154 if (flags & ~(O_CREAT|O_EXCL)) {

--- 11 unchanged lines hidden (view full) ---

166 _pthread_mutex_unlock(&sem_llock);
167 return (sem);
168 }
169 }
170
171 if (flags & O_CREAT) {
172 va_start(ap, flags);
173 mode = va_arg(ap, int);
174 value = va_arg(ap, int);
173 va_end(ap);
174 }
175
176 len = sizeof(*ni) + strlen(name) + 1;
177 ni = (struct sem_nameinfo *)malloc(len);
178 if (ni == NULL) {
179 errno = ENOSPC;
180 goto error;

--- 17 unchanged lines hidden (view full) ---

198 flock(fd, LOCK_UN);
199 goto error;
200 }
201 if (sb.st_size < sizeof(sem_t)) {
202 sem_t tmp;
203
204 tmp._magic = SEM_MAGIC;
205 tmp._kern._has_waiters = 0;
175 va_end(ap);
176 }
177
178 len = sizeof(*ni) + strlen(name) + 1;
179 ni = (struct sem_nameinfo *)malloc(len);
180 if (ni == NULL) {
181 errno = ENOSPC;
182 goto error;

--- 17 unchanged lines hidden (view full) ---

200 flock(fd, LOCK_UN);
201 goto error;
202 }
203 if (sb.st_size < sizeof(sem_t)) {
204 sem_t tmp;
205
206 tmp._magic = SEM_MAGIC;
207 tmp._kern._has_waiters = 0;
206 tmp._kern._count = 0;
208 tmp._kern._count = value;
207 tmp._kern._flags = USYNC_PROCESS_SHARED | SEM_NAMED;
208 if (_write(fd, &tmp, sizeof(tmp)) != sizeof(tmp)) {
209 flock(fd, LOCK_UN);
210 goto error;
211 }
212 }
213 flock(fd, LOCK_UN);
214 sem = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE,

--- 243 unchanged lines hidden ---
209 tmp._kern._flags = USYNC_PROCESS_SHARED | SEM_NAMED;
210 if (_write(fd, &tmp, sizeof(tmp)) != sizeof(tmp)) {
211 flock(fd, LOCK_UN);
212 goto error;
213 }
214 }
215 flock(fd, LOCK_UN);
216 sem = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ|PROT_WRITE,

--- 243 unchanged lines hidden ---