chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] remove udev_lib dependency from udevsend, which makes it smaller
[elogind.git]
/
udev_lib.c
diff --git
a/udev_lib.c
b/udev_lib.c
index e9c16c863a3407ac0705923c375b8264441b3f39..84daf9fd19fba4bac7c5d3356c73ab6e27ca542e 100644
(file)
--- a/
udev_lib.c
+++ b/
udev_lib.c
@@
-29,77
+29,74
@@
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/mman.h>
-#include "libsysfs/sysfs/libsysfs.h"
#include "udev.h"
#include "logging.h"
#include "udev_lib.h"
#include "list.h"
#include "udev.h"
#include "logging.h"
#include "udev_lib.h"
#include "list.h"
-char *get_action(void)
-{
- char *action;
-
- action = getenv("ACTION");
- if (action != NULL && strlen(action) > ACTION_SIZE)
- action[ACTION_SIZE-1] = '\0';
-
- return action;
-}
+#define BLOCK_PATH "/block/"
+#define CLASS_PATH "/class/"
+#define NET_PATH "/class/net/"
-char
*get_devpath(void
)
+char
get_device_type(const char *path, const char *subsystem
)
{
{
- char *devpath;
+ if (strcmp(subsystem, "block") == 0)
+ return 'b';
- devpath = getenv("DEVPATH");
- if (devpath != NULL && strlen(devpath) > DEVPATH_SIZE)
- devpath[DEVPATH_SIZE-1] = '\0';
+ if (strcmp(subsystem, "net") == 0)
+ return 'n';
- return devpath;
-}
+ if (strncmp(path, BLOCK_PATH, strlen(BLOCK_PATH)) == 0 &&
+ strlen(path) > strlen(BLOCK_PATH))
+ return 'b';
-char *get_devnode(void)
-{
-
char *devnode
;
+ if (strncmp(path, NET_PATH, strlen(NET_PATH)) == 0 &&
+ strlen(path) > strlen(NET_PATH))
+
return 'n'
;
- devnode = getenv("DEVNODE");
-
if (devnode != NULL && strlen(devnode) > NAME_SIZE
)
-
devnode[NAME_SIZE-1] = '\0
';
+ if (strncmp(path, CLASS_PATH, strlen(CLASS_PATH)) == 0 &&
+
strlen(path) > strlen(CLASS_PATH)
)
+
return 'c
';
- return
devnode
;
+ return
'\0'
;
}
}
-char *get_seqnum(void)
+void udev_set_values(struct udevice *udev, const char* devpath,
+ const char *subsystem, const char* action)
{
{
-
char *seqnum
;
-
- s
eqnum = getenv("SEQNUM"
);
-
-
return seqnum
;
+
memset(udev, 0x00, sizeof(struct udevice))
;
+ strfieldcpy(udev->devpath, devpath);
+ s
trfieldcpy(udev->subsystem, subsystem
);
+ strfieldcpy(udev->action, action);
+
udev->type = get_device_type(devpath, subsystem)
;
}
}
-
char *get_subsystem(char *subsystem
)
+
int create_path(const char *path
)
{
{
- if (subsystem != NULL && strlen(subsystem) > SUBSYSTEM_SIZE)
- subsystem[SUBSYSTEM_SIZE-1] = '\0';
+ char p[NAME_SIZE];
+ char *pos;
+ struct stat stats;
- return subsystem;
-}
+ strcpy (p, path);
+ pos = strrchr(p, '/');
+ if (pos == p || pos == NULL)
+ return 0;
-char get_device_type(const char *path, const char *subsystem)
-{
- if (strcmp(subsystem, "block") == 0 ||
- strstr(path, "/block/") != NULL)
- return 'b';
+ while (pos[-1] == '/')
+ pos--;
- if (strcmp(subsystem, "net") == 0 ||
- strstr(path, "/class/net/") != NULL)
- return 'n';
+ pos[0] = '\0';
- if (strstr(path, "/class/") != NULL)
- return 'c';
+ dbg("stat '%s'\n", p);
+ if (stat (p, &stats) == 0 && (stats.st_mode & S_IFMT) == S_IFDIR)
+ return 0;
- return '\0';
+ if (create_path (p) != 0)
+ return -1;
+
+ dbg("mkdir '%s'\n", p);
+ return mkdir(p, 0755);
}
int file_map(const char *filename, char **buf, size_t *bufsize)
}
int file_map(const char *filename, char **buf, size_t *bufsize)
@@
-113,11
+110,13
@@
int file_map(const char *filename, char **buf, size_t *bufsize)
}
if (fstat(fd, &stats) < 0) {
}
if (fstat(fd, &stats) < 0) {
+ close(fd);
return -1;
}
*buf = mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (*buf == MAP_FAILED) {
return -1;
}
*buf = mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (*buf == MAP_FAILED) {
+ close(fd);
return -1;
}
*bufsize = stats.st_size;
return -1;
}
*bufsize = stats.st_size;
@@
-141,6
+140,15
@@
size_t buf_get_line(char *buf, size_t buflen, size_t cur)
return count - cur;
}
return count - cur;
}
+void no_trailing_slash(char *path)
+{
+ int len;
+
+ len = strlen(path);
+ if (len > 0 && path[len-1] == '/')
+ path[len-1] = '\0';
+}
+
struct files {
struct list_head list;
char name[NAME_SIZE];
struct files {
struct list_head list;
char name[NAME_SIZE];
@@
-169,7
+177,7
@@
static int file_list_insert(char *filename, struct list_head *file_list)
return 0;
}
return 0;
}
-/* calls function for
file or every file found in
directory */
+/* calls function for
every file found in specified
directory */
int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix)
{
struct dirent *ent;
int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix)
{
struct dirent *ent;
@@
-209,9
+217,8
@@
int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix)
/* call function for every file in the list */
list_for_each_entry_safe(loop_file, tmp_file, &file_list, list) {
/* call function for every file in the list */
list_for_each_entry_safe(loop_file, tmp_file, &file_list, list) {
- strfieldcpy(file, dirname);
- strfieldcat(file, "/");
- strfieldcat(file, loop_file->name);
+ snprintf(file, NAME_SIZE-1, "%s/%s", dirname, loop_file->name);
+ file[NAME_SIZE-1] = '\0';
fnct(file);
fnct(file);