mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-12-16 03:27:49 +07:00
[PATCH] $local user
We once implemented the devfsd feature to set the owner of a device node to the "local" user. This was before we had the dev.d/ scripts. We discussed a similar issue with D-BUS recently and this should be better handled depending on the distributions way to do such a thing. I'm for removing this here as this can be easily covered by a dev.d/ script. Here is the patch if nobody objects :)
This commit is contained in:
parent
1da6b0d0a7
commit
9cd1b46a13
@ -125,38 +125,4 @@ struct group *getgrnam(const char *name)
|
||||
return &gr;
|
||||
}
|
||||
|
||||
|
||||
int ufd = -1;
|
||||
|
||||
void setutent()
|
||||
{
|
||||
if (ufd < 0)
|
||||
ufd = open(UTMP_FILE, O_RDONLY);
|
||||
fcntl(ufd, F_SETFD, FD_CLOEXEC);
|
||||
lseek(ufd, 0, SEEK_SET);
|
||||
}
|
||||
|
||||
void endutent() {
|
||||
if (ufd < 0)
|
||||
return;
|
||||
close(ufd);
|
||||
ufd = -1;
|
||||
}
|
||||
|
||||
struct utmp *getutent(void)
|
||||
{
|
||||
static struct utmp utmp;
|
||||
int retval;
|
||||
|
||||
if (ufd < 0) {
|
||||
setutent();
|
||||
if (ufd < 0)
|
||||
return NULL;
|
||||
}
|
||||
retval = read(ufd, &utmp, sizeof(struct utmp));
|
||||
if (retval < 1)
|
||||
return NULL;
|
||||
return &utmp;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -62,10 +62,5 @@ struct utmp
|
||||
char __unused[20]; /* reserved for future use */
|
||||
};
|
||||
|
||||
struct utmp *getutent(void);
|
||||
void setutent(void);
|
||||
void endutent(void);
|
||||
|
||||
|
||||
#endif /* KLIBC_FIXUPS_H */
|
||||
#endif /* __KLIBC__ */
|
||||
|
11
udev.8.in
11
udev.8.in
@ -335,17 +335,6 @@ video*:root:video:0660
|
||||
dsp1:::0666
|
||||
.fi
|
||||
.P
|
||||
The value
|
||||
.I $local
|
||||
can be used instead of a specific username. In that case, udev will determine
|
||||
the current local user at the time of device node creation and substitute
|
||||
that username as the owner of the new device node. This is useful, for
|
||||
example, to let hot-plugged devices, such as cameras, be owned by the user at
|
||||
the current console. Note that if no user is currently logged in, or if udev
|
||||
otherwise fails to determine a current user, the
|
||||
.I default_owner
|
||||
value is used in lieu.
|
||||
.P
|
||||
A number of different fields in the above configuration files support a simple
|
||||
form of shell style pattern matching. It supports the following pattern characters:
|
||||
.TP
|
||||
|
35
udev_add.c
35
udev_add.c
@ -48,8 +48,6 @@
|
||||
#include "udevdb.h"
|
||||
#include "klibc_fixups.h"
|
||||
|
||||
#define LOCAL_USER "$local"
|
||||
|
||||
#include "selinux.h"
|
||||
|
||||
/*
|
||||
@ -155,37 +153,6 @@ exit:
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* get the local logged in user */
|
||||
static void set_to_local_user(char *user)
|
||||
{
|
||||
struct utmp *u;
|
||||
time_t recent = 0;
|
||||
|
||||
strfieldcpymax(user, default_owner_str, OWNER_SIZE);
|
||||
setutent();
|
||||
while (1) {
|
||||
u = getutent();
|
||||
if (u == NULL)
|
||||
break;
|
||||
|
||||
/* is this a user login ? */
|
||||
if (u->ut_type != USER_PROCESS)
|
||||
continue;
|
||||
|
||||
/* is this a local login ? */
|
||||
if (strcmp(u->ut_host, ""))
|
||||
continue;
|
||||
|
||||
if (u->ut_time > recent) {
|
||||
recent = u->ut_time;
|
||||
strfieldcpymax(user, u->ut_user, OWNER_SIZE);
|
||||
dbg("local user is '%s'", user);
|
||||
break;
|
||||
}
|
||||
}
|
||||
endutent();
|
||||
}
|
||||
|
||||
static int create_node(struct udevice *udev)
|
||||
{
|
||||
char filename[NAME_SIZE];
|
||||
@ -229,8 +196,6 @@ static int create_node(struct udevice *udev)
|
||||
uid = (uid_t) id;
|
||||
else {
|
||||
struct passwd *pw;
|
||||
if (strncmp(udev->owner, LOCAL_USER, sizeof(LOCAL_USER)) == 0)
|
||||
set_to_local_user(udev->owner);
|
||||
|
||||
pw = getpwnam(udev->owner);
|
||||
if (pw == NULL)
|
||||
|
Loading…
Reference in New Issue
Block a user