]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/libutil/cpuset.c
login.conf(5): umask has no default value
[FreeBSD/FreeBSD.git] / lib / libutil / cpuset.c
1 /*
2  * Copyright (c) 2007, 2008     Jeffrey Roberson <jeff@freebsd.org>
3  * All rights reserved.
4  *
5  * Copyright (c) 2008 Nokia Corporation
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
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
30 #include <sys/types.h>
31 #include <sys/cpuset.h>
32
33 #include <stdlib.h>
34 #include <string.h>
35 #include <libutil.h>
36 #include <ctype.h>
37
38 int
39 cpuset_parselist(const char *list, cpuset_t *mask)
40 {
41         enum { NONE, NUM, DASH } state;
42         int lastnum;
43         int curnum;
44         const char *l;
45
46         if (strcasecmp(list, "all") == 0) {
47                 if (cpuset_getaffinity(CPU_LEVEL_ROOT, CPU_WHICH_PID, -1,
48                     sizeof(*mask), mask) != 0)
49                         return (CPUSET_PARSE_GETAFFINITY);
50                 return (CPUSET_PARSE_OK);
51         }
52         state = NONE;
53         curnum = lastnum = 0;
54         for (l = list; *l != '\0';) {
55                 if (isdigit(*l)) {
56                         curnum = atoi(l);
57                         if (curnum > CPU_SETSIZE)
58                                 return (CPUSET_PARSE_INVALID_CPU);
59                         while (isdigit(*l))
60                                 l++;
61                         switch (state) {
62                         case NONE:
63                                 lastnum = curnum;
64                                 state = NUM;
65                                 break;
66                         case DASH:
67                                 for (; lastnum <= curnum; lastnum++)
68                                         CPU_SET(lastnum, mask);
69                                 state = NONE;
70                                 break;
71                         case NUM:
72                         default:
73                                 goto parserr;
74                         }
75                         continue;
76                 }
77                 switch (*l) {
78                 case ',':
79                         switch (state) {
80                         case NONE:
81                                 break;
82                         case NUM:
83                                 CPU_SET(curnum, mask);
84                                 state = NONE;
85                                 break;
86                         case DASH:
87                                 goto parserr;
88                                 break;
89                         }
90                         break;
91                 case '-':
92                         if (state != NUM)
93                                 goto parserr;
94                         state = DASH;
95                         break;
96                 default:
97                         goto parserr;
98                 }
99                 l++;
100         }
101         switch (state) {
102                 case NONE:
103                         break;
104                 case NUM:
105                         CPU_SET(curnum, mask);
106                         break;
107                 case DASH:
108                         goto parserr;
109         }
110         return (CPUSET_PARSE_OK);
111 parserr:
112         return (CPUSET_PARSE_ERROR);
113 }