/* We've reached a /bus.n entry */ static enum parse_enum Parse_Bus( INDEX_OR_ERROR bus_number, struct parsedname *pn) { static regex_t rx_p_bus ; struct ow_regmatch orm ; ow_regcomp( &rx_p_bus, "^/bus\\.[[:digit:]]+/?", REG_ICASE ) ; orm.number = 0 ; /* Processing for bus.X directories -- eventually will make this more generic */ if ( INDEX_NOT_VALID(bus_number) ) { return parse_error; } /* Should make a presence check on remote buses here, but * it's not a major problem if people use bad paths since * they will just end up with empty directory listings. */ if (SpecifiedLocalBus(pn)) { /* already specified a "bus." */ /* too many levels of bus for a non-remote adapter */ return parse_error; } else if (SpecifiedRemoteBus(pn)) { /* already specified a "bus." */ /* Let the remote bus do the heavy lifting */ pn->state |= ePS_busveryremote; return parse_first; } /* Since we are going to use a specific in-device now, set * pn->selected_connection to point at that device at once. */ if ( SetKnownBus(bus_number, pn) ) { return parse_error ; // bus doesn't exist } pn->state |= BusIsServer((pn)->selected_connection) ? ePS_busremote : ePS_buslocal ; if (SpecifiedLocalBus(pn)) { /* don't return bus-list for local paths. */ pn->control_flags &= (~SHOULD_RETURN_BUS_LIST); } /* Create the path without the "bus.x" part in pn->path_to_server */ if ( ow_regexec( &rx_p_bus, pn->path, &orm ) == 0 ) { strcpy( pn->path_to_server, orm.pre[0] ) ; strcat( pn->path_to_server, "/" ) ; strcat( pn->path_to_server, orm.post[0] ) ; ow_regexec_free( &orm ) ; } return parse_first; }
/* Used for virtual directories like settings and statistics * If local, applies to all local (this program) and not a * specific local bus. * If remote, pass it on for the remote to handle * */ static enum parse_enum set_type( enum ePN_type epntype, struct parsedname * pn ) { if (SpecifiedLocalBus(pn)) { return parse_error; } else if ( ! SpecifiedRemoteBus(pn) ) { pn->type |= ePS_busanylocal; } pn->type = epntype; return parse_nonreal; }
/* Write to interface dir */ static ZERO_OR_ERROR FS_w_interface(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); if ( pn->selected_connection == NO_CONNECTION ) { LEVEL_DEBUG("Attempt to write to no bus for /settings"); return -ENODEV ; } else if ( SpecifiedLocalBus(pn) ) { return FS_w_local(owq); } else { return ServerWrite(owq); } }