/*
- * udev_utils.c - generic stuff used by udev
- *
* Copyright (C) 2004-2005 Kay Sievers <kay.sievers@vrfy.org>
*
* This program is free software; you can redistribute it and/or modify it
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
- * 675 Mass Ave, Cambridge, MA 02139, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <ctype.h>
#include <dirent.h>
#include <syslog.h>
+#include <pwd.h>
+#include <grp.h>
+#include <sys/types.h>
#include <sys/utsname.h>
-#include "udev_libc_wrapper.h"
#include "udev.h"
-#include "logging.h"
-#include "udev_utils.h"
-#include "list.h"
int log_priority(const char *priority)
return 0;
}
-int name_list_add(struct list_head *name_list, const char *name, int sort)
+char *name_list_add(struct list_head *name_list, const char *name, int sort)
{
struct name_entry *loop_name;
struct name_entry *new_name;
/* avoid doubles */
if (strcmp(loop_name->name, name) == 0) {
dbg("'%s' is already in the list", name);
- return 0;
+ return loop_name->name;
}
}
}
new_name = malloc(sizeof(struct name_entry));
- if (new_name == NULL) {
- dbg("error malloc");
- return -ENOMEM;
- }
+ if (new_name == NULL)
+ return NULL;
strlcpy(new_name->name, name, sizeof(new_name->name));
dbg("adding '%s'", new_name->name);
list_add_tail(&new_name->node, &loop_name->node);
- return 0;
+ return new_name->name;
}
-int name_list_key_add(struct list_head *name_list, const char *key, const char *value)
+char *name_list_key_add(struct list_head *name_list, const char *key, const char *value)
{
struct name_entry *loop_name;
struct name_entry *new_name;
dbg("key already present '%s', replace it", loop_name->name);
snprintf(loop_name->name, sizeof(loop_name->name), "%s=%s", key, value);
loop_name->name[sizeof(loop_name->name)-1] = '\0';
- return 0;
+ return loop_name->name;
}
}
new_name = malloc(sizeof(struct name_entry));
- if (new_name == NULL) {
- dbg("error malloc");
- return -ENOMEM;
- }
+ if (new_name == NULL)
+ return NULL;
snprintf(new_name->name, sizeof(new_name->name), "%s=%s", key, value);
new_name->name[sizeof(new_name->name)-1] = '\0';
dbg("adding '%s'", new_name->name);
list_add_tail(&new_name->node, &loop_name->node);
- return 0;
+ return new_name->name;
+}
+
+int name_list_key_remove(struct list_head *name_list, const char *key)
+{
+ struct name_entry *name_loop;
+ struct name_entry *temp_loop;
+ size_t keylen = strlen(key);
+ int retval = 0;
+
+ list_for_each_entry_safe(name_loop, temp_loop, name_list, node) {
+ if (strncmp(name_loop->name, key, keylen) != 0)
+ continue;
+ if (name_loop->name[keylen] != '=')
+ continue;
+ list_del(&name_loop->node);
+ free(name_loop);
+ retval = 1;
+ break;
+ }
+ return retval;
}
void name_list_cleanup(struct list_head *name_list)
{
struct dirent *ent;
DIR *dir;
- char *ext;
char filename[PATH_SIZE];
dbg("open directory '%s'", dirname);
dir = opendir(dirname);
if (dir == NULL) {
- dbg("unable to open '%s'", dirname);
+ err("unable to open '%s': %s", dirname, strerror(errno));
return -1;
}
continue;
/* look for file matching with specified suffix */
- ext = strrchr(ent->d_name, '.');
- if (ext == NULL)
- continue;
-
- if (strcmp(ext, suffix) != 0)
- continue;
-
- dbg("put file '%s/%s' in list", dirname, ent->d_name);
+ if (suffix != NULL) {
+ const char *ext;
+
+ ext = strrchr(ent->d_name, '.');
+ if (ext == NULL)
+ continue;
+ if (strcmp(ext, suffix) != 0)
+ continue;
+ }
+ dbg("put file '%s/%s' into list", dirname, ent->d_name);
snprintf(filename, sizeof(filename), "%s/%s", dirname, ent->d_name);
filename[sizeof(filename)-1] = '\0';
closedir(dir);
return 0;
}
+
+uid_t lookup_user(const char *user)
+{
+ struct passwd *pw;
+ uid_t uid = 0;
+
+ errno = 0;
+ pw = getpwnam(user);
+ if (pw == NULL) {
+ if (errno == 0 || errno == ENOENT || errno == ESRCH)
+ err("specified user '%s' unknown", user);
+ else
+ err("error resolving user '%s': %s", user, strerror(errno));
+ } else
+ uid = pw->pw_uid;
+
+ return uid;
+}
+
+extern gid_t lookup_group(const char *group)
+{
+ struct group *gr;
+ gid_t gid = 0;
+
+ errno = 0;
+ gr = getgrnam(group);
+ if (gr == NULL) {
+ if (errno == 0 || errno == ENOENT || errno == ESRCH)
+ err("specified group '%s' unknown", group);
+ else
+ err("error resolving group '%s': %s", group, strerror(errno));
+ } else
+ gid = gr->gr_gid;
+
+ return gid;
+}
+