2005-04-27 07:59:47 +04:00
/*
* Copyright ( C ) 2003 Greg Kroah - Hartman < greg @ kroah . com >
2012-11-12 22:36:23 +04:00
* Copyright ( C ) 2003 - 2010 Kay Sievers < kay @ vrfy . org >
2005-04-27 07:59:47 +04:00
*
2008-09-10 04:40:42 +04:00
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 2 of the License , or
* ( at your option ) any later version .
2005-04-27 07:59:47 +04:00
*
2008-09-10 04:40:42 +04:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
2005-04-27 07:59:47 +04:00
*/
2013-04-26 05:31:05 +04:00
# pragma once
2005-04-27 07:59:47 +04:00
2005-02-09 06:37:32 +03:00
# include <sys/types.h>
2003-12-02 11:26:46 +03:00
# include <sys/param.h>
2009-09-05 11:48:23 +04:00
# include <signal.h>
2006-01-09 23:18:00 +03:00
2013-04-26 05:31:05 +04:00
# include "macro.h"
2014-09-09 13:15:37 +04:00
# include "sd-rtnl.h"
2009-06-08 23:36:06 +04:00
# include "libudev.h"
# include "libudev-private.h"
2012-04-16 22:27:44 +04:00
# include "util.h"
2012-04-17 18:05:03 +04:00
# include "label.h"
2012-05-07 15:21:05 +04:00
# include "strv.h"
2005-04-27 07:59:47 +04:00
2008-10-16 19:16:58 +04:00
struct udev_event {
2012-01-10 04:34:15 +04:00
struct udev * udev ;
struct udev_device * dev ;
struct udev_device * dev_parent ;
struct udev_device * dev_db ;
char * name ;
char * program_result ;
mode_t mode ;
uid_t uid ;
gid_t gid ;
2013-10-08 03:59:10 +04:00
struct udev_list seclabel_list ;
2012-01-10 04:34:15 +04:00
struct udev_list run_list ;
int exec_delay ;
2012-11-11 23:45:05 +04:00
usec_t birth_usec ;
2014-09-09 13:15:37 +04:00
sd_rtnl * rtnl ;
2012-01-10 04:34:15 +04:00
unsigned int builtin_run ;
unsigned int builtin_ret ;
bool inotify_watch ;
bool inotify_watch_final ;
2012-12-31 07:48:44 +04:00
bool group_set ;
2012-01-10 04:34:15 +04:00
bool group_final ;
2012-12-31 07:48:44 +04:00
bool owner_set ;
2012-01-10 04:34:15 +04:00
bool owner_final ;
bool mode_set ;
bool mode_final ;
bool name_final ;
bool devlink_final ;
bool run_final ;
2008-10-16 19:16:58 +04:00
} ;
2009-02-11 20:38:56 +03:00
struct udev_watch {
2012-01-10 04:34:15 +04:00
struct udev_list_node node ;
int handle ;
char * name ;
2009-02-11 20:38:56 +03:00
} ;
2008-10-18 16:33:37 +04:00
/* udev-rules.c */
2008-10-18 21:19:56 +04:00
struct udev_rules ;
2009-04-26 15:59:39 +04:00
struct udev_rules * udev_rules_new ( struct udev * udev , int resolve_names ) ;
2011-12-25 19:37:15 +04:00
struct udev_rules * udev_rules_unref ( struct udev_rules * rules ) ;
2012-04-16 19:21:22 +04:00
bool udev_rules_check_timestamp ( struct udev_rules * rules ) ;
2014-11-13 22:35:06 +03:00
int udev_rules_apply_to_event ( struct udev_rules * rules , struct udev_event * event ,
usec_t timeout_usec , usec_t timeout_warn_usec ,
struct udev_list * properties_list ,
2014-09-11 20:49:04 +04:00
const sigset_t * sigmask ) ;
2013-07-07 20:32:34 +04:00
int udev_rules_apply_static_dev_perms ( struct udev_rules * rules ) ;
2008-10-18 21:19:56 +04:00
/* udev-event.c */
2009-04-26 15:59:39 +04:00
struct udev_event * udev_event_new ( struct udev_device * dev ) ;
void udev_event_unref ( struct udev_event * event ) ;
2009-05-20 19:57:52 +04:00
size_t udev_event_apply_format ( struct udev_event * event , const char * src , char * dest , size_t size ) ;
2009-04-26 15:59:39 +04:00
int udev_event_apply_subsys_kernel ( struct udev_event * event , const char * string ,
2012-01-10 04:34:15 +04:00
char * result , size_t maxsize , int read_value ) ;
2011-04-20 03:53:03 +04:00
int udev_event_spawn ( struct udev_event * event ,
2014-07-29 17:18:27 +04:00
usec_t timeout_usec ,
2014-09-11 20:49:04 +04:00
usec_t timeout_warn_usec ,
2012-01-10 04:34:15 +04:00
const char * cmd , char * * envp , const sigset_t * sigmask ,
char * result , size_t ressize ) ;
2014-11-13 22:35:06 +03:00
void udev_event_execute_rules ( struct udev_event * event ,
usec_t timeout_usec , usec_t timeout_warn_usec ,
struct udev_list * properties_list ,
struct udev_rules * rules ,
const sigset_t * sigset ) ;
2014-09-11 20:49:04 +04:00
void udev_event_execute_run ( struct udev_event * event , usec_t timeout_usec , usec_t timeout_warn_usec , const sigset_t * sigset ) ;
2011-12-23 05:02:44 +04:00
int udev_build_argv ( struct udev * udev , char * cmd , int * argc , char * argv [ ] ) ;
2008-10-18 16:33:37 +04:00
2009-02-11 20:38:56 +03:00
/* udev-watch.c */
2009-06-04 03:44:04 +04:00
int udev_watch_init ( struct udev * udev ) ;
2009-04-26 15:59:39 +04:00
void udev_watch_restore ( struct udev * udev ) ;
void udev_watch_begin ( struct udev * udev , struct udev_device * dev ) ;
void udev_watch_end ( struct udev * udev , struct udev_device * dev ) ;
struct udev_device * udev_watch_lookup ( struct udev * udev , int wd ) ;
2009-02-11 20:38:56 +03:00
2008-10-16 19:16:58 +04:00
/* udev-node.c */
2013-10-08 03:59:10 +04:00
void udev_node_add ( struct udev_device * dev , bool apply ,
mode_t mode , uid_t uid , gid_t gid ,
struct udev_list * seclabel_list ) ;
2012-01-29 08:37:39 +04:00
void udev_node_remove ( struct udev_device * dev ) ;
2009-04-26 15:59:39 +04:00
void udev_node_update_old_links ( struct udev_device * dev , struct udev_device * dev_old ) ;
2008-10-16 19:16:58 +04:00
2011-07-11 03:16:32 +04:00
/* udev-ctrl.c */
struct udev_ctrl ;
2011-10-10 00:52:03 +04:00
struct udev_ctrl * udev_ctrl_new ( struct udev * udev ) ;
struct udev_ctrl * udev_ctrl_new_from_fd ( struct udev * udev , int fd ) ;
2011-07-11 03:16:32 +04:00
int udev_ctrl_enable_receiving ( struct udev_ctrl * uctrl ) ;
struct udev_ctrl * udev_ctrl_unref ( struct udev_ctrl * uctrl ) ;
2011-10-10 02:38:56 +04:00
int udev_ctrl_cleanup ( struct udev_ctrl * uctrl ) ;
2011-07-11 03:16:32 +04:00
struct udev * udev_ctrl_get_udev ( struct udev_ctrl * uctrl ) ;
int udev_ctrl_get_fd ( struct udev_ctrl * uctrl ) ;
int udev_ctrl_send_set_log_level ( struct udev_ctrl * uctrl , int priority , int timeout ) ;
int udev_ctrl_send_stop_exec_queue ( struct udev_ctrl * uctrl , int timeout ) ;
int udev_ctrl_send_start_exec_queue ( struct udev_ctrl * uctrl , int timeout ) ;
2011-12-25 19:37:15 +04:00
int udev_ctrl_send_reload ( struct udev_ctrl * uctrl , int timeout ) ;
2011-07-11 03:16:32 +04:00
int udev_ctrl_send_ping ( struct udev_ctrl * uctrl , int timeout ) ;
int udev_ctrl_send_exit ( struct udev_ctrl * uctrl , int timeout ) ;
int udev_ctrl_send_set_env ( struct udev_ctrl * uctrl , const char * key , int timeout ) ;
int udev_ctrl_send_set_children_max ( struct udev_ctrl * uctrl , int count , int timeout ) ;
struct udev_ctrl_connection ;
struct udev_ctrl_connection * udev_ctrl_get_connection ( struct udev_ctrl * uctrl ) ;
struct udev_ctrl_connection * udev_ctrl_connection_ref ( struct udev_ctrl_connection * conn ) ;
struct udev_ctrl_connection * udev_ctrl_connection_unref ( struct udev_ctrl_connection * conn ) ;
struct udev_ctrl_msg ;
struct udev_ctrl_msg * udev_ctrl_receive_msg ( struct udev_ctrl_connection * conn ) ;
struct udev_ctrl_msg * udev_ctrl_msg_unref ( struct udev_ctrl_msg * ctrl_msg ) ;
int udev_ctrl_get_set_log_level ( struct udev_ctrl_msg * ctrl_msg ) ;
int udev_ctrl_get_stop_exec_queue ( struct udev_ctrl_msg * ctrl_msg ) ;
int udev_ctrl_get_start_exec_queue ( struct udev_ctrl_msg * ctrl_msg ) ;
2011-12-25 19:37:15 +04:00
int udev_ctrl_get_reload ( struct udev_ctrl_msg * ctrl_msg ) ;
2011-07-11 03:16:32 +04:00
int udev_ctrl_get_ping ( struct udev_ctrl_msg * ctrl_msg ) ;
int udev_ctrl_get_exit ( struct udev_ctrl_msg * ctrl_msg ) ;
const char * udev_ctrl_get_set_env ( struct udev_ctrl_msg * ctrl_msg ) ;
int udev_ctrl_get_set_children_max ( struct udev_ctrl_msg * ctrl_msg ) ;
2011-08-05 04:00:30 +04:00
/* built-in commands */
enum udev_builtin_cmd {
2012-11-16 04:17:18 +04:00
# ifdef HAVE_BLKID
2012-01-10 04:34:15 +04:00
UDEV_BUILTIN_BLKID ,
2012-11-16 04:17:18 +04:00
# endif
2012-09-17 01:31:11 +04:00
UDEV_BUILTIN_BTRFS ,
2012-10-22 20:23:08 +04:00
UDEV_BUILTIN_HWDB ,
2012-01-10 04:34:15 +04:00
UDEV_BUILTIN_INPUT_ID ,
2013-07-10 18:02:24 +04:00
UDEV_BUILTIN_KEYBOARD ,
2012-11-20 04:24:32 +04:00
# ifdef HAVE_KMOD
2012-01-10 04:34:15 +04:00
UDEV_BUILTIN_KMOD ,
2012-11-20 04:24:32 +04:00
# endif
2012-11-09 15:37:40 +04:00
UDEV_BUILTIN_NET_ID ,
udev: add network link configuration tool
This tool applies hardware specific settings to network devices before they
are announced via libudev.
Settings that will probably eventually be supported are MTU, Speed,
DuplexMode, WakeOnLan, MACAddress, MACAddressPolicy (e.g., 'hardware',
'synthetic' or 'random'), Name and NamePolicy (replacing our current
interface naming logic). This patch only introduces support for
Description, as a proof of concept.
Some of these settings may later be overriden by a network management
daemon/script. However, these tools should always listen and wait on libudev
before touching a device (listening on netlink is not enough). This is no
different from how things used to be, as we always supported changing the
network interface name from udev rules, which does not work if someone
has already started using it.
The tool is configured by .link files in /etc/net/links/ (with the usual
overriding logic in /run and /lib). The first (in lexicographical order)
matching .link file is applied to a given device, and all others are ignored.
The .link files contain a [Match] section with (currently) the keys
MACAddress, Driver, Type (see DEVTYPE in udevadm info) and Path (this
matches on the stable device path as exposed as ID_PATH, and not the
unstable DEVPATH). A .link file matches a given device if all of the
specified keys do. Currently the keys are treated as plain strings,
but some limited globbing may later be added to the keys where it
makes sense.
Example:
/etc/net/links/50-wireless.link
[Match]
MACAddress=98:f2:e4:42:c6:92
Path=pci-0000:02:00.0-bcma-0
Type=wlan
[Link]
Description=The wireless link
2013-10-26 02:34:01 +04:00
UDEV_BUILTIN_NET_LINK ,
2012-01-10 04:34:15 +04:00
UDEV_BUILTIN_PATH_ID ,
UDEV_BUILTIN_USB_ID ,
2012-04-09 18:37:54 +04:00
# ifdef HAVE_ACL
UDEV_BUILTIN_UACCESS ,
# endif
2012-01-10 04:34:15 +04:00
UDEV_BUILTIN_MAX
2011-08-05 04:00:30 +04:00
} ;
struct udev_builtin {
2012-01-10 04:34:15 +04:00
const char * name ;
int ( * cmd ) ( struct udev_device * dev , int argc , char * argv [ ] , bool test ) ;
const char * help ;
int ( * init ) ( struct udev * udev ) ;
void ( * exit ) ( struct udev * udev ) ;
bool ( * validate ) ( struct udev * udev ) ;
bool run_once ;
2011-08-05 04:00:30 +04:00
} ;
2012-11-16 04:17:18 +04:00
# ifdef HAVE_BLKID
2011-12-22 01:30:48 +04:00
extern const struct udev_builtin udev_builtin_blkid ;
2012-11-16 04:17:18 +04:00
# endif
2012-09-17 01:31:11 +04:00
extern const struct udev_builtin udev_builtin_btrfs ;
2012-10-22 20:23:08 +04:00
extern const struct udev_builtin udev_builtin_hwdb ;
2011-12-25 20:58:30 +04:00
extern const struct udev_builtin udev_builtin_input_id ;
2013-07-10 18:02:24 +04:00
extern const struct udev_builtin udev_builtin_keyboard ;
2012-11-20 04:24:32 +04:00
# ifdef HAVE_KMOD
2011-12-22 01:30:48 +04:00
extern const struct udev_builtin udev_builtin_kmod ;
2012-11-20 04:24:32 +04:00
# endif
2012-11-09 15:37:40 +04:00
extern const struct udev_builtin udev_builtin_net_id ;
2013-10-28 23:20:59 +04:00
extern const struct udev_builtin udev_builtin_net_setup_link ;
2011-12-25 20:58:30 +04:00
extern const struct udev_builtin udev_builtin_path_id ;
extern const struct udev_builtin udev_builtin_usb_id ;
2012-04-09 18:37:54 +04:00
extern const struct udev_builtin udev_builtin_uaccess ;
2012-10-26 05:43:56 +04:00
void udev_builtin_init ( struct udev * udev ) ;
2011-12-27 06:49:43 +04:00
void udev_builtin_exit ( struct udev * udev ) ;
2011-12-22 01:30:48 +04:00
enum udev_builtin_cmd udev_builtin_lookup ( const char * command ) ;
2011-08-05 04:00:30 +04:00
const char * udev_builtin_name ( enum udev_builtin_cmd cmd ) ;
2011-12-22 01:30:48 +04:00
bool udev_builtin_run_once ( enum udev_builtin_cmd cmd ) ;
int udev_builtin_run ( struct udev_device * dev , enum udev_builtin_cmd cmd , const char * command , bool test ) ;
2011-12-27 06:49:43 +04:00
void udev_builtin_list ( struct udev * udev ) ;
2012-04-04 07:18:14 +04:00
bool udev_builtin_validate ( struct udev * udev ) ;
2011-12-23 06:16:56 +04:00
int udev_builtin_add_property ( struct udev_device * dev , bool test , const char * key , const char * val ) ;
2013-07-08 13:44:17 +04:00
int udev_builtin_hwdb_lookup ( struct udev_device * dev , const char * prefix , const char * modalias ,
const char * filter , bool test ) ;
2011-12-25 21:59:42 +04:00
/* udevadm commands */
struct udevadm_cmd {
2012-01-10 04:34:15 +04:00
const char * name ;
int ( * cmd ) ( struct udev * udev , int argc , char * argv [ ] ) ;
const char * help ;
int debug ;
2011-12-25 21:59:42 +04:00
} ;
extern const struct udevadm_cmd udevadm_info ;
extern const struct udevadm_cmd udevadm_trigger ;
extern const struct udevadm_cmd udevadm_settle ;
extern const struct udevadm_cmd udevadm_control ;
extern const struct udevadm_cmd udevadm_monitor ;
2012-10-22 20:23:08 +04:00
extern const struct udevadm_cmd udevadm_hwdb ;
2011-12-25 21:59:42 +04:00
extern const struct udevadm_cmd udevadm_test ;
extern const struct udevadm_cmd udevadm_test_builtin ;