The postal address is:
Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia.
*/
+//config:config DEVFSD
+//config: bool "devfsd (obsolete)"
+//config: default n
+//config: select PLATFORM_LINUX
+//config: select FEATURE_SYSLOG
+//config: help
+//config: This is deprecated and should NOT be used anymore.
+//config: Use linux >= 2.6 (optionally with hotplug) and mdev instead!
+//config: See docs/mdev.txt for detailed instructions on how to use mdev
+//config: instead.
+//config:
+//config: Provides compatibility with old device names on a devfs systems.
+//config: You should set it to true if you have devfs enabled.
+//config: The following keywords in devsfd.conf are supported:
+//config: "CLEAR_CONFIG", "INCLUDE", "OPTIONAL_INCLUDE", "RESTORE",
+//config: "PERMISSIONS", "EXECUTE", "COPY", "IGNORE",
+//config: "MKOLDCOMPAT", "MKNEWCOMPAT","RMOLDCOMPAT", "RMNEWCOMPAT".
+//config:
+//config: But only if they are written UPPERCASE!!!!!!!!
+//config:
+//config:config DEVFSD_MODLOAD
+//config: bool "Adds support for MODLOAD keyword in devsfd.conf"
+//config: default y
+//config: depends on DEVFSD
+//config: help
+//config: This actually doesn't work with busybox modutils but needs
+//config: the external modutils.
+//config:
+//config:config DEVFSD_FG_NP
+//config: bool "Enable the -fg and -np options"
+//config: default y
+//config: depends on DEVFSD
+//config: help
+//config: -fg Run the daemon in the foreground.
+//config: -np Exit after parsing config. Do not poll for events.
+//config:
+//config:config DEVFSD_VERBOSE
+//config: bool "Increases logging (and size)"
+//config: default y
+//config: depends on DEVFSD
+//config: help
+//config: Increases logging to stderr or syslog.
+//config:
+//config:config FEATURE_DEVFS
+//config: bool "Use devfs names for all devices (obsolete)"
+//config: default n
+//config: select PLATFORM_LINUX
+//config: help
+//config: This is obsolete and should NOT be used anymore.
+//config: Use linux >= 2.6 (optionally with hotplug) and mdev instead!
+//config:
+//config: For legacy systems -- if there is no way around devfsd -- this
+//config: tells busybox to look for names like /dev/loop/0 instead of
+//config: /dev/loop0. If your /dev directory has normal names instead of
+//config: devfs names, you don't want this.
+
+//applet:IF_DEVFSD(APPLET(devfsd, BB_DIR_SBIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_DEVFSD) += devfsd.o
+
+//usage:#define devfsd_trivial_usage
+//usage: "mntpnt [-v]" IF_DEVFSD_FG_NP("[-fg][-np]")
+//usage:#define devfsd_full_usage "\n\n"
+//usage: "Manage devfs permissions and old device name symlinks\n"
+//usage: "\n mntpnt The mount point where devfs is mounted"
+//usage: "\n -v Print the protocol version numbers for devfsd"
+//usage: "\n and the kernel-side protocol version and exit"
+//usage: IF_DEVFSD_FG_NP(
+//usage: "\n -fg Run in foreground"
+//usage: "\n -np Exit after parsing the configuration file"
+//usage: "\n and processing synthetic REGISTER events,"
+//usage: "\n don't poll for events"
+//usage: )
+
#include "libbb.h"
#include "xregex.h"
#include <syslog.h>
const regmatch_t *, unsigned);
static void action_modload(const struct devfsd_notify_struct *info, const struct config_entry_struct *entry);
static void action_copy(const struct devfsd_notify_struct *, const struct config_entry_struct *,
- const regmatch_t *, unsigned);
+ const regmatch_t *, unsigned);
static void action_compat(const struct devfsd_notify_struct *, unsigned);
static void free_config(void);
static void restore(char *spath, struct stat source_stat, int rootlen);
static const char *get_variable(const char *, void *);
static int make_dir_tree(const char *);
static int expand_expression(char *, unsigned, const char *, const char *(*)(const char *, void *), void *,
- const char *, const regmatch_t *, unsigned);
+ const char *, const regmatch_t *, unsigned);
static void expand_regexp(char *, size_t, const char *, const char *, const regmatch_t *, unsigned);
static const char *expand_variable( char *, unsigned, unsigned *, const char *,
const char *(*)(const char *, void *), void *);
static const char *get_variable_v2(const char *, const char *(*)(const char *, void *), void *);
-static char get_old_ide_name(unsigned , unsigned);
+static char get_old_ide_name(unsigned, unsigned);
static char *write_old_sd_name(char *, unsigned, unsigned, const char *);
/* busybox functions */
/* Busybox stuff */
#if ENABLE_DEVFSD_VERBOSE || ENABLE_DEBUG
#define info_logger(p, fmt, args...) bb_info_msg(fmt, ## args)
+#define simple_info_logger(p, msg) bb_simple_info_msg(msg)
#define msg_logger(p, fmt, args...) bb_error_msg(fmt, ## args)
+#define simple_msg_logger(p, msg) bb_simple_error_msg(msg)
#define msg_logger_and_die(p, fmt, args...) bb_error_msg_and_die(fmt, ## args)
+#define simple_msg_logger_and_die(p, msg) bb_simple_error_msg_and_die(msg)
#define error_logger(p, fmt, args...) bb_perror_msg(fmt, ## args)
#define error_logger_and_die(p, fmt, args...) bb_perror_msg_and_die(fmt, ## args)
#else
#define info_logger(p, fmt, args...)
#define msg_logger(p, fmt, args...)
+#define simple_msg_logger(p, msg)
#define msg_logger_and_die(p, fmt, args...) exit(EXIT_FAILURE)
+#define simple_msg_logger_and_die(p, msg) exit(EXIT_FAILURE)
#define error_logger(p, fmt, args...)
#define error_logger_and_die(p, fmt, args...) exit(EXIT_FAILURE)
#endif
/*This action will pass "/dev/$devname"(i.e. "/dev/" prefixed to
the device name) to the module loading facility. In addition,
the /etc/modules.devfs configuration file is used.*/
- if (ENABLE_DEVFSD_MODLOAD)
+ if (ENABLE_DEVFSD_MODLOAD)
new->action.what = AC_MODLOAD;
- break;
+ break;
case 6: /* EXECUTE */
new->action.what = AC_EXECUTE;
num_args -= 3;
return;
process_config_line_err:
- msg_logger_and_die(LOG_ERR, bb_msg_bad_config, msg , line);
+ msg_logger_and_die(LOG_ERR, bb_msg_bad_config, msg, line);
} /* End Function process_config_line */
static int do_servicing(int fd, unsigned long event_mask)
caught_sighup = FALSE;
return c_sighup;
}
- msg_logger_and_die(LOG_ERR, "read error on control file");
+ simple_msg_logger_and_die(LOG_ERR, "read error on control file");
} /* End Function do_servicing */
static void service_name(const struct devfsd_notify_struct *info)
action_compat(info, entry->action.what);
break;
default:
- msg_logger_and_die(LOG_ERR, "Unknown action");
+ simple_msg_logger_and_die(LOG_ERR, "Unknown action");
}
}
} /* End Function service_name */
} /* End Function action_permissions */
static void action_modload(const struct devfsd_notify_struct *info,
- const struct config_entry_struct *entry UNUSED_PARAM)
+ const struct config_entry_struct *entry UNUSED_PARAM)
/* [SUMMARY] Load a module.
<info> The devfs change.
<entry> The config file entry.
} /* End Function action_modload */
static void action_execute(const struct devfsd_notify_struct *info,
- const struct config_entry_struct *entry,
- const regmatch_t *regexpr, unsigned int numexpr)
+ const struct config_entry_struct *entry,
+ const regmatch_t *regexpr, unsigned int numexpr)
/* [SUMMARY] Execute a programme.
<info> The devfs change.
<entry> The config file entry.
static void action_copy(const struct devfsd_notify_struct *info,
- const struct config_entry_struct *entry,
- const regmatch_t *regexpr, unsigned int numexpr)
+ const struct config_entry_struct *entry,
+ const regmatch_t *regexpr, unsigned int numexpr)
/* [SUMMARY] Copy permissions.
<info> The devfs change.
<entry> The config file entry.
{
struct passwd *pw_ent;
struct group *grp_ent;
- static const char *msg;
-
- if (ENABLE_DEVFSD_VERBOSE)
- msg = "user";
+ const char *msg;
- if (isdigit(string[0]) ||((string[0] == '-') && isdigit(string[1])))
+ if (isdigit(string[0]) || ((string[0] == '-') && isdigit(string[1])))
return atoi(string);
if (flag == UID && (pw_ent = getpwnam(string)) != NULL)
return pw_ent->pw_uid;
- if (flag == GID && (grp_ent = getgrnam(string)) != NULL)
- return grp_ent->gr_gid;
- else if (ENABLE_DEVFSD_VERBOSE)
- msg = "group";
+ if (ENABLE_DEVFSD_VERBOSE)
+ msg = "user";
+
+ if (flag == GID) {
+ if ((grp_ent = getgrnam(string)) != NULL)
+ return grp_ent->gr_gid;
+ if (ENABLE_DEVFSD_VERBOSE)
+ msg = "group";
+ }
if (ENABLE_DEVFSD_VERBOSE)
msg_logger(LOG_ERR, "unknown %s: %s, defaulting to %cid=0", msg, string, msg[0]);
static const char *get_variable(const char *variable, void *info)
{
- static char sbuf[sizeof(int)*3 + 2]; /* sign and NUL */
static char *hostname;
struct get_variable_info *gv_info = info;
const char *field_names[] = {
- "hostname", "mntpt", "devpath", "devname",
- "uid", "gid", "mode", hostname, mount_point,
- gv_info->devpath, gv_info->devname, NULL
+ "hostname", "mntpt", "devpath", "devname", "uid", "gid", "mode",
+ NULL, mount_point, gv_info->devpath, gv_info->devname, NULL
};
int i;
if (!hostname)
hostname = safe_gethostname();
+ field_names[7] = hostname;
+
/* index_in_str_array returns i>=0 */
i = index_in_str_array(field_names, variable);
return field_names[i + 7];
if (i == 4)
- sprintf(sbuf, "%u", gv_info->info->uid);
- else if (i == 5)
- sprintf(sbuf, "%u", gv_info->info->gid);
- else if (i == 6)
- sprintf(sbuf, "%o", gv_info->info->mode);
- return sbuf;
+ return auto_string(xasprintf("%u", gv_info->info->uid));
+ if (i == 5)
+ return auto_string(xasprintf("%u", gv_info->info->gid));
+ /* i == 6 */
+ return auto_string(xasprintf("%o", gv_info->info->mode));
} /* End Function get_variable */
static void service(struct stat statbuf, char *path)
} /* End Function make_dir_tree */
static int expand_expression(char *output, unsigned int outsize,
- const char *input,
- const char *(*get_variable_func)(const char *variable, void *info),
- void *info,
- const char *devname,
- const regmatch_t *ex, unsigned int numexp)
+ const char *input,
+ const char *(*get_variable_func)(const char *variable, void *info),
+ void *info,
+ const char *devname,
+ const regmatch_t *ex, unsigned int numexp)
/* [SUMMARY] Expand environment variables and regular subexpressions in string.
<output> The output expanded expression is written here.
<length> The size of the output buffer.
} /* End Function expand_expression */
static void expand_regexp(char *output, size_t outsize, const char *input,
- const char *devname,
- const regmatch_t *ex, unsigned int numex)
+ const char *devname,
+ const regmatch_t *ex, unsigned int numex)
/* [SUMMARY] Expand all occurrences of the regular subexpressions \0 to \9.
<output> The output expanded expression is written here.
<outsize> The size of the output buffer.
};
const char *get_old_name(const char *devname, unsigned int namelen,
- char *buffer, unsigned int major, unsigned int minor)
+ char *buffer, unsigned int major, unsigned int minor)
/* [SUMMARY] Translate a kernel-supplied name into an old name.
<devname> The device name provided by the kernel.
<namelen> The length of the name.
int indexx;
const char *pty1;
const char *pty2;
- size_t len;
/* 1 to 5 "scsi/" , 6 to 9 "ide/host", 10 sbp/, 11 vcc/, 12 pty/ */
static const char *const fmt[] = {
NULL ,
};
for (trans = translate_table; trans->match != NULL; ++trans) {
- len = strlen(trans->match);
-
- if (strncmp(devname, trans->match, len) == 0) {
+ char *after_match = is_prefixed_with(devname, trans->match);
+ if (after_match) {
if (trans->format == NULL)
- return devname + len;
- sprintf(buffer, trans->format, devname + len);
+ return after_match;
+ sprintf(buffer, trans->format, after_match);
return buffer;
}
}
/*EXPERIMENTAL_FUNCTION*/
int st_expr_expand(char *output, unsigned int length, const char *input,
- const char *(*get_variable_func)(const char *variable,
- void *info),
- void *info)
+ const char *(*get_variable_func)(const char *variable,
+ void *info),
+ void *info)
/* [SUMMARY] Expand an expression using Borne Shell-like unquoted rules.
<output> The output expanded expression is written here.
<length> The size of the output buffer.
}
return FALSE;
st_expr_expand_out:
- info_logger(LOG_INFO, bb_msg_small_buffer);
+ simple_info_logger(LOG_INFO, bb_msg_small_buffer);
return FALSE;
} /* End Function st_expr_expand */
/* Private functions follow */
static const char *expand_variable(char *buffer, unsigned int length,
- unsigned int *out_pos, const char *input,
- const char *(*func)(const char *variable,
- void *info),
- void *info)
+ unsigned int *out_pos, const char *input,
+ const char *(*func)(const char *variable,
+ void *info),
+ void *info)
/* [SUMMARY] Expand a variable.
<buffer> The buffer to write to.
<length> The length of the output buffer.
return input + len;
}
if (ch != ':' || ptr[1] != '-') {
- info_logger(LOG_INFO, "illegal char in var name");
+ simple_info_logger(LOG_INFO, "illegal char in var name");
return NULL;
}
/* It's that handy "${var:-word}" expression. Check if var is defined */
*out_pos += len;
return input;
expand_variable_out:
- info_logger(LOG_INFO, bb_msg_small_buffer);
+ simple_info_logger(LOG_INFO, bb_msg_small_buffer);
return NULL;
} /* End Function expand_variable */
static const char *get_variable_v2(const char *variable,
- const char *(*func)(const char *variable, void *info),
- void *info)
+ const char *(*func)(const char *variable, void *info),
+ void *info)
/* [SUMMARY] Get a variable from the environment or .
<variable> The variable name.
<func> A function which will be used to get the variable. If this returns