- if (-1!=(fd=open("/etc/mdev.conf",O_RDONLY))) {
- len=lseek(fd,0,SEEK_END);
- conf=mmap(NULL,len,PROT_READ,MAP_SHARED,fd,0);
- if (conf) {
- int line=0;
-
- /* Loop through lines in mmaped file*/
- 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++);
-
- /* Three fields: regex, uid:gid, mode */
- 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) {
- /* Regex to match this device */
- case 3:
- {
- char *regex=strndupa(pos,end2-pos);
- regex_t match;
- regmatch_t off;
- int result;
-
- /* Is this it? */
- xregcomp(&match,regex,REG_EXTENDED);
- 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;
-
- break;
- }
- /* uid:gid */
- case 2:
- {
- char *s2;
-
- /* Find : */
- for(s=pos;s<end2 && *s!=':';s++);
- if(s==end2) goto end_line;
-
- /* Parse UID */
- 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;
- }
- s++;
- /* parse GID */
- 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;
- }
- break;
- }
- /* mode */
- case 1:
- {
- mode=strtoul(pos,&pos,8);
- if(pos!=end2) goto end_line;
- goto found_device;
- }
- }
- pos=end2;
+ fd = open("/etc/mdev.conf", O_RDONLY);
+ if (fd < 0)
+ goto end_parse;
+ len = xlseek(fd, 0, SEEK_END);
+ conf = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
+ close(fd);
+ if (!conf)
+ goto end_parse;
+
+ line = 0;
+ /* Loop through lines in mmaped file*/
+ 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++)
+ ;
+
+ /* Three fields: regex, uid:gid, mode */
+ for (field=0; field < (3 + ENABLE_FEATURE_MDEV_EXEC);
+ field++)
+ {
+ /* Skip whitespace */
+ while (pos<end && isspace(*pos)) pos++;
+ if (pos==end || *pos=='#') break;
+ for (end2=pos;
+ end2<end && !isspace(*end2) && *end2!='#'; end2++)
+ ;
+
+ if (field == 0) {
+ /* Regex to match this device */
+
+ char *regex = strndupa(pos, end2-pos);
+ regex_t match;
+ regmatch_t off;
+ int result;
+
+ /* Is this it? */
+ xregcomp(&match,regex, REG_EXTENDED);
+ 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))
+ break;
+ }
+ if (field == 1) {
+ /* uid:gid */
+
+ char *s, *s2;
+
+ /* Find : */
+ for (s=pos; s<end2 && *s!=':'; s++)
+ ;
+ if (s == end2) break;
+
+ /* Parse UID */
+ uid = strtoul(pos, &s2, 10);
+ if (s != s2) {
+ struct passwd *pass;
+ pass = getpwnam(strndupa(pos, s-pos));
+ if (!pass) break;
+ uid = pass->pw_uid;