]>
git.ipfire.org Git - thirdparty/systemd.git/blob - udev_utils.c
2 * udev_lib - generic stuff used by udev
4 * Copyright (C) 2004 Kay Sievers <kay@vrfy.org>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation version 2 of the License.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 675 Mass Ave, Cambridge, MA 02139, USA.
32 #include <sys/utsname.h>
36 #include "udev_utils.h"
40 void udev_init_device(struct udevice
*udev
, const char* devpath
, const char *subsystem
)
42 memset(udev
, 0x00, sizeof(struct udevice
));
45 strfieldcpy(udev
->devpath
, devpath
);
47 strfieldcpy(udev
->subsystem
, subsystem
);
49 if (strcmp(udev
->subsystem
, "block") == 0)
51 else if (strcmp(udev
->subsystem
, "net") == 0)
53 else if (strncmp(udev
->devpath
, "/block/", 7) == 0)
55 else if (strncmp(udev
->devpath
, "/class/net/", 11) == 0)
57 else if (strncmp(udev
->devpath
, "/class/", 7) == 0)
61 strcpy(udev
->owner
, "root");
62 strcpy(udev
->group
, "root");
65 int kernel_release_satisfactory(unsigned int version
, unsigned int patchlevel
, unsigned int sublevel
)
67 static unsigned int kversion
= 0;
68 static unsigned int kpatchlevel
;
69 static unsigned int ksublevel
;
76 if (sscanf (uts
.release
, "%u.%u.%u", &kversion
, &kpatchlevel
, &ksublevel
) != 3) {
82 if (kversion
>= version
&& kpatchlevel
>= patchlevel
&& ksublevel
>= sublevel
)
88 int create_path(const char *path
)
95 pos
= strrchr(p
, '/');
96 if (pos
== p
|| pos
== NULL
)
99 while (pos
[-1] == '/')
104 dbg("stat '%s'\n", p
);
105 if (stat (p
, &stats
) == 0 && (stats
.st_mode
& S_IFMT
) == S_IFDIR
)
108 if (create_path (p
) != 0)
111 dbg("mkdir '%s'\n", p
);
112 return mkdir(p
, 0755);
115 /* Reset permissions on the device node, before unlinking it to make sure,
116 * that permisions of possible hard links will be removed too.
118 int unlink_secure(const char *filename
)
122 retval
= chown(filename
, 0, 0);
124 dbg("chown(%s, 0, 0) failed with error '%s'", filename
, strerror(errno
));
126 retval
= chmod(filename
, 0000);
128 dbg("chmod(%s, 0000) failed with error '%s'", filename
, strerror(errno
));
130 retval
= unlink(filename
);
135 dbg("unlink(%s) failed with error '%s'", filename
, strerror(errno
));
140 int parse_get_pair(char **orig_string
, char **left
, char **right
)
143 char *string
= *orig_string
;
148 /* eat any whitespace */
149 while (isspace(*string
) || *string
== ',')
152 /* split based on '=' */
153 temp
= strsep(&string
, "=");
158 /* take the right side and strip off the '"' */
159 while (isspace(*string
))
166 temp
= strsep(&string
, "\"");
167 if (!string
|| *temp
== '\0')
170 *orig_string
= string
;
175 int file_map(const char *filename
, char **buf
, size_t *bufsize
)
180 fd
= open(filename
, O_RDONLY
);
185 if (fstat(fd
, &stats
) < 0) {
190 *buf
= mmap(NULL
, stats
.st_size
, PROT_READ
, MAP_SHARED
, fd
, 0);
191 if (*buf
== MAP_FAILED
) {
195 *bufsize
= stats
.st_size
;
202 void file_unmap(char *buf
, size_t bufsize
)
204 munmap(buf
, bufsize
);
207 /* return number of chars until the next newline, skip escaped newline */
208 size_t buf_get_line(const char *buf
, size_t buflen
, size_t cur
)
213 for (count
= cur
; count
< buflen
; count
++) {
214 if (!escape
&& buf
[count
] == '\n')
217 if (buf
[count
] == '\\')
226 void no_trailing_slash(char *path
)
231 while (len
> 0 && path
[len
-1] == '/')
236 struct list_head list
;
237 char name
[NAME_SIZE
];
240 /* sort files in lexical order */
241 static int file_list_insert(char *filename
, struct list_head
*file_list
)
243 struct files
*loop_file
;
244 struct files
*new_file
;
246 list_for_each_entry(loop_file
, file_list
, list
) {
247 if (strcmp(loop_file
->name
, filename
) > 0) {
252 new_file
= malloc(sizeof(struct files
));
253 if (new_file
== NULL
) {
258 strfieldcpy(new_file
->name
, filename
);
259 list_add_tail(&new_file
->list
, &loop_file
->list
);
263 /* calls function for every file found in specified directory */
264 int call_foreach_file(file_fnct_t fnct
, const char *dirname
,
265 const char *suffix
, void *data
)
270 struct files
*loop_file
;
271 struct files
*tmp_file
;
272 LIST_HEAD(file_list
);
274 dbg("open directory '%s'", dirname
);
275 dir
= opendir(dirname
);
277 dbg("unable to open '%s'", dirname
);
283 if (ent
== NULL
|| ent
->d_name
[0] == '\0')
286 if ((ent
->d_name
[0] == '.') || (ent
->d_name
[0] == COMMENT_CHARACTER
))
289 /* look for file with specified suffix */
290 ext
= strrchr(ent
->d_name
, '.');
294 if (strcmp(ext
, suffix
) != 0)
297 dbg("put file '%s/%s' in list", dirname
, ent
->d_name
);
298 file_list_insert(ent
->d_name
, &file_list
);
301 /* call function for every file in the list */
302 list_for_each_entry_safe(loop_file
, tmp_file
, &file_list
, list
) {
303 char filename
[NAME_SIZE
];
305 snprintf(filename
, NAME_SIZE
, "%s/%s", dirname
, loop_file
->name
);
306 filename
[NAME_SIZE
-1] = '\0';
308 fnct(filename
, data
);
310 list_del(&loop_file
->list
);