SOURCES: busybox-mdev.patch (NEW) - patch from busybox cvs, now md...

tommat tommat at pld-linux.org
Tue Feb 7 17:29:52 CET 2006


Author: tommat                       Date: Tue Feb  7 16:29:51 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- patch from busybox cvs, now mdev works

---- Files affected:
SOURCES:
   busybox-mdev.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/busybox-mdev.patch
diff -u /dev/null SOURCES/busybox-mdev.patch:1.1
--- /dev/null	Tue Feb  7 17:29:51 2006
+++ SOURCES/busybox-mdev.patch	Tue Feb  7 17:29:46 2006
@@ -0,0 +1,322 @@
+--- busybox-1.1.0/util-linux/mdev.c.orig	2006-01-11 05:44:22.000000000 +0000
++++ busybox-1.1.0/util-linux/mdev.c	2006-02-06 17:06:24.107287250 +0000
+@@ -1,7 +1,7 @@
+ /* vi:set ts=4:
+- * 
++ *
+  * mdev - Mini udev for busybox
+- * 
++ *
+  * Copyright 2005 Rob Landley <rob at landley.net>
+  * Copyright 2005 Frank Sorenson <frank at tuxrocks.com>
+  *
+@@ -18,94 +18,90 @@
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <unistd.h>
++#include <stdlib.h>
+ #include "busybox.h"
+ #include "xregex.h"
+ 
+ #define DEV_PATH	"/dev"
++#define MDEV_CONF	"/etc/mdev.conf"
+ 
+ #include <busybox.h>
+ 
+ /* mknod in /dev based on a path like "/sys/block/hda/hda1" */
+ static void make_device(char *path)
+ {
+-	char *device_name,*s;
+-	int major,minor,type,len,fd;
+-	int mode=0660;
+-	uid_t uid=0;
+-	gid_t gid=0;
++	char *device_name, *s;
++	int major, minor, type, len, fd;
++	int mode = 0660;
++	uid_t uid = 0;
++	gid_t gid = 0;
+ 
+-	RESERVE_CONFIG_BUFFER(temp,PATH_MAX);
++	RESERVE_CONFIG_BUFFER(temp, PATH_MAX);
+ 
+ 	/* Try to read major/minor string */
+-	
++
+ 	snprintf(temp, PATH_MAX, "%s/dev", path);
+ 	fd = open(temp, O_RDONLY);
+ 	len = read(fd, temp, PATH_MAX-1);
+-	if (len<1) goto end;
+-	temp[len] = 0;
+ 	close(fd);
+-	
++	if (len < 1) goto end;
++
+ 	/* Determine device name, type, major and minor */
+-	
++
+ 	device_name = strrchr(path, '/') + 1;
+-	type = strncmp(path+5, "block/" ,6) ? S_IFCHR : S_IFBLK;
+-	major = minor = 0;
+-	for (s = temp; *s; s++) {
+-		if (*s == ':') {
+-			major = minor;
+-			minor = 0;
+-		} else {
+-			minor *= 10;
+-			minor += (*s) - '0';
+-		}
+-	}
++	type = strncmp(path+5, "block/", 6) ? S_IFCHR : S_IFBLK;
++	if (sscanf(temp, "%d:%d", &major, &minor) != 2)
++		goto end;
+ 
+ 	/* If we have a config file, look up permissions for this device */
+-	
++
+ 	if (ENABLE_FEATURE_MDEV_CONF) {
+-		char *conf,*pos,*end;
++		char *conf, *pos, *end;
+ 
+ 		/* mmap the config file */
+-		if (-1!=(fd=open("/etc/mdev.conf",O_RDONLY))) {
+-			len=lseek(fd,0,SEEK_END);
+-			conf=mmap(NULL,len,PROT_READ,MAP_PRIVATE,fd,0);
++		if (-1 != (fd=open(MDEV_CONF,O_RDONLY))) {
++			len = lseek(fd, 0, SEEK_END);
++			conf = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
+ 			if (conf) {
+-				int line=0;
++				int line = 0;
+ 
+ 				/* Loop through lines in mmaped file*/
+-				for (pos=conf;pos-conf<len;) {
++				for (pos=conf; pos-conf<len;) {
+ 					int field;
+ 					char *end2;
+-					
++
+ 					line++;
+ 					/* find end of this line */
+-					for(end=pos;end-conf<len && *end!='\n';end++);
++					for(end=pos; end-conf<len && *end!='\n'; end++)
++						;
+ 
+ 					/* Three fields: regex, uid:gid, mode */
+-					for (field=3;field;field--) {
++					for (field=3; field; field--) {
+ 						/* Skip whitespace */
+-						while (pos<end && isspace(*pos)) pos++;
+-						if (pos==end || *pos=='#') break;
+-						for (end2=pos;
+-							end2<end && !isspace(*end2) && *end2!='#'; end2++);
+-						switch(field) {
++						while (pos<end && isspace(*pos))
++							pos++;
++						if (pos==end || *pos=='#')
++							break;
++						for (end2=pos; end2<end && !isspace(*end2) && *end2!='#'; end2++)
++							;
++
++						switch (field) {
+ 							/* Regex to match this device */
+ 							case 3:
+ 							{
+-								char *regex=strndupa(pos,end2-pos);
++								char *regex = strndupa(pos,end2-pos);
+ 								regex_t match;
+ 								regmatch_t off;
+ 								int result;
+ 
+-								/* Is this it? */	
++								/* Is this it? */
+ 								xregcomp(&match,regex,REG_EXTENDED);
+-								result=regexec(&match,device_name,1,&off,0);
++								result = regexec(&match,device_name,1,&off,0);
+ 								regfree(&match);
+-								
++
+ 								/* If not this device, skip rest of line */
+-								if(result || off.rm_so
+-									|| off.rm_eo!=strlen(device_name))
+-										goto end_line;
++								if (result || off.rm_so || off.rm_eo!=strlen(device_name))
++									goto end_line;
+ 
+ 								break;
+ 							}
+@@ -115,48 +111,54 @@
+ 								char *s2;
+ 
+ 								/* Find : */
+-								for(s=pos;s<end2 && *s!=':';s++);
+-								if(s==end2) goto end_line;
++								for(s=pos; s<end2 && *s!=':'; s++)
++									;
++								if (s == end2)
++									goto end_line;
+ 
+ 								/* Parse UID */
+-								uid=strtoul(pos,&s2,10);
+-								if(s!=s2) {
++								uid = strtoul(pos,&s2,10);
++								if (s != s2) {
+ 									struct passwd *pass;
+-									pass=getpwnam(strndupa(pos,s-pos));
+-									if(!pass) goto end_line;
+-									uid=pass->pw_uid;
++									pass = getpwnam(strndupa(pos,s-pos));
++									if (!pass)
++										goto end_line;
++									uid = pass->pw_uid;
+ 								}
+ 								s++;
+ 								/* parse GID */
+-								gid=strtoul(s,&s2,10);
+-								if(end2!=s2) {
++								gid = strtoul(s,&s2,10);
++								if (end2 != s2) {
+ 									struct group *grp;
+-									grp=getgrnam(strndupa(s,end2-s));
+-									if(!grp) goto end_line;
+-									gid=grp->gr_gid;
++									grp = getgrnam(strndupa(s,end2-s));
++									if (!grp)
++										goto end_line;
++									gid = grp->gr_gid;
+ 								}
+ 								break;
+ 							}
+ 							/* mode */
+ 							case 1:
+ 							{
+-								mode=strtoul(pos,&pos,8);
+-								if(pos!=end2) goto end_line;
+-								goto found_device;
++								mode = strtoul(pos,&pos,8);
++								if (pos != end2)
++									goto end_line;
++								else
++									goto found_device;
+ 							}
+ 						}
+-						pos=end2;
++						pos = end2;
+ 					}
+ end_line:
+ 					/* Did everything parse happily? */
+ 					if (field && field!=3)
+-							bb_error_msg_and_die("Bad line %d",line);
++						bb_error_msg_and_die("Bad line %d",line);
+ 
+ 					/* Next line */
+-					pos=++end;
++					pos = ++end;
+ 				}
+ found_device:
+-				munmap(conf,len);
++				munmap(conf, len);
+ 			}
+ 			close(fd);
+ 		}
+@@ -168,7 +170,7 @@
+ 		bb_perror_msg_and_die("mknod %s failed", temp);
+ 
+ 	if (ENABLE_FEATURE_MDEV_CONF) chown(temp,uid,gid);
+-	
++
+ end:
+ 	RELEASE_CONFIG_BUFFER(temp);
+ }
+@@ -179,50 +181,64 @@
+ static void find_dev(char *path)
+ {
+ 	DIR *dir;
+-	int len=strlen(path);
++	size_t len = strlen(path);
++	struct dirent *entry;
+ 
+-	if (!(dir = opendir(path)))
+-		bb_perror_msg_and_die("No %s",path);
++	if ((dir = opendir(path)) == NULL)
++		return;
+ 
+-	for (;;) {
+-		struct dirent *entry = readdir(dir);
+-		
+-		if (!entry) break;
++	while ((entry = readdir(dir)) != NULL) {
+ 
+ 		/* Skip "." and ".." (also skips hidden files, which is ok) */
+ 
+-		if (entry->d_name[0]=='.') continue;
++		if (entry->d_name[0] == '.')
++			continue;
+ 
+ 		if (entry->d_type == DT_DIR) {
+ 			snprintf(path+len, PATH_MAX-len, "/%s", entry->d_name);
+ 			find_dev(path);
+ 			path[len] = 0;
+ 		}
+-		
++
+ 		/* If there's a dev entry, mknod it */
+-		
+-		if (strcmp(entry->d_name, "dev")) make_device(path);
++
++		if (!strcmp(entry->d_name, "dev")) make_device(path);
+ 	}
+-	
++
+ 	closedir(dir);
+ }
+ 
+ int mdev_main(int argc, char *argv[])
+ {
+-	if (argc > 1) {
+-		if (argc == 2 && !strcmp(argv[1],"-s")) {
+-			RESERVE_CONFIG_BUFFER(temp,PATH_MAX);
+-			strcpy(temp,"/sys/block");
+-			find_dev(temp);
+-			strcpy(temp,"/sys/class");
+-			find_dev(temp);
+-			if(ENABLE_FEATURE_CLEAN_UP)
+-				RELEASE_CONFIG_BUFFER(temp);
+-			return 0;
+-		} else bb_show_usage();
+-	} 
+-	
+-/* hotplug support goes here */
+-	
++	char *action;
++	char *env_path;
++	RESERVE_CONFIG_BUFFER(temp,PATH_MAX);
++
++	/* Scan */
++
++	if (argc == 2 && !strcmp(argv[1],"-s")) {
++		strcpy(temp,"/sys/block");
++		find_dev(temp);
++		strcpy(temp,"/sys/class");
++		find_dev(temp);
++
++	/* Hotplug */
++
++	} else {
++		action = getenv("ACTION");
++		env_path = getenv("DEVPATH");
++	    if (!action || !env_path)
++			bb_show_usage();
++
++		if (!strcmp(action, "add")) {
++			sprintf(temp, "/sys%s", env_path);
++			make_device(temp);
++		} else if (!strcmp(action, "remove")) {
++			sprintf(temp, "%s/%s", DEV_PATH, strrchr(env_path, '/') + 1);
++			unlink(temp);
++		}
++	}
++
++	if (ENABLE_FEATURE_CLEAN_UP) RELEASE_CONFIG_BUFFER(temp);
+ 	return 0;
+ }
================================================================


More information about the pld-cvs-commit mailing list