static ZERO_OR_ERROR FS_r_name(struct one_wire_query *owq) { BYTE buf[256]; size_t len = OWQ_size(owq); RETURN_ERROR_IF_BAD( OW_r_std(buf,&len, M_CONFIG, CFG_NAME, PN(owq))); return OWQ_format_output_offset_and_size((const char *)buf, len, owq); }
static ZERO_OR_ERROR FS_r_param(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); size_t pagesize = 32; BYTE data[pagesize]; off_t param_offset = pn->selected_filetype->data.i ; RETURN_ERROR_IF_BAD( OW_r_page(data, pagesize-param_offset, param_offset, pn) ); return OWQ_format_output_offset_and_size((ASCII *) data, FileLength(pn), owq); }
static ZERO_OR_ERROR FS_r_ports_raw(struct one_wire_query *owq) { BYTE buf[10]; size_t len = OWQ_size(owq); if(len>sizeof(buf)) len=sizeof(buf); RETURN_ERROR_IF_BAD( OW_r_std(buf,&len, M_PORT, 0, PN(owq))); return OWQ_format_output_offset_and_size((const char *)buf, len, owq); }
static ZERO_OR_ERROR FS_r_info_raw(struct one_wire_query *owq) { BYTE buf[256]; size_t len = OWQ_size(owq); if(len>sizeof(buf)) len=sizeof(buf); RETURN_ERROR_IF_BAD( OW_r_std(buf,&len, M_CONFIG, OWQ_pn(owq).extension, PN(owq))); return OWQ_format_output_offset_and_size((const char *)buf, len, owq); }
static ZERO_OR_ERROR FS_aliaslist( struct one_wire_query * owq ) { struct memblob mb ; ZERO_OR_ERROR zoe ; MemblobInit( &mb, PATH_MAX ) ; Aliaslist( &mb ) ; if ( MemblobPure( &mb ) ) { zoe = OWQ_format_output_offset_and_size( (char *) MemblobData( &mb ), MemblobLength( &mb ), owq ) ; } else { zoe = -EINVAL ; } MemblobClear( &mb ) ; return zoe ; }
/* For PBM channel -- a single letter */ static ZERO_OR_ERROR FS_r_PBM_channel(struct one_wire_query *owq) { char port = PN(owq)->selected_connection->master.pbm.channel + '1'; return OWQ_format_output_offset_and_size(&port, 1, owq); }
/* For HA5 channel -- a single letter */ static ZERO_OR_ERROR FS_r_channel(struct one_wire_query *owq) { return OWQ_format_output_offset_and_size( (char *) &(PN(owq)->selected_connection->master.ha5.channel), 1, owq); }
/* Structure file */ static ZERO_OR_ERROR FS_structure(struct one_wire_query *owq) { char structure_text[PROPERTY_LENGTH_STRUCTURE+1] ; int output_length; struct parsedname * pn = PN(owq) ; struct filetype * ftype = pn->selected_filetype ; char format_char ; char change_char ; int index_num ; int elements_num ; // TEMPORARY change type from structure->real to get real length rhather than structure length pn->type = ePN_real; /* "real" type to get return length, rather than "structure" length */ // Set property type switch ( ftype->format ) { case ft_directory: case ft_subdir: format_char = 'D' ; break ; case ft_integer: format_char = 'i' ; break ; case ft_unsigned: format_char = 'u' ; break ; case ft_float: format_char = 'f' ; break ; case ft_alias: format_char = 'l' ; break ; case ft_ascii: case ft_vascii: format_char = 'a' ; break ; case ft_binary: format_char = 'b' ; break ; case ft_yesno: case ft_bitfield: format_char = 'y' ; break ; case ft_date: format_char = 'd' ; break ; case ft_temperature: format_char = 't' ; break ; case ft_tempgap: format_char = 'g' ; break ; case ft_pressure: format_char = 'p' ; break ; case ft_unknown: default: format_char = '?' ; break ; } // Set index index_num = (ftype->ag) ? pn->extension : 0 ; // Set elements if ( ftype-> ag ) { // array if ( ftype -> ag -> combined == ag_sparse) { if ( ftype -> ag -> letters == ag_letters) { elements_num = -1 ; } else { // numbered elements_num = 0 ; } } else { // non sparse elements_num = ftype->ag->elements ; } } else { // scallar elements_num = 1 ; } // Set changability switch ( ftype->change ) { case fc_static: case fc_subdir: case fc_directory: change_char = 'f' ; break ; case fc_stable: case fc_persistent: change_char = 's' ; break ; case fc_volatile: case fc_read_stable: case fc_simultaneous_temperature: case fc_simultaneous_voltage: case fc_uncached: case fc_statistic: case fc_presence: case fc_link: case fc_page: change_char = 'v' ; break ; case fc_second: default: change_char = 't' ; break ; } UCLIBCLOCK; output_length = snprintf(structure_text, PROPERTY_LENGTH_STRUCTURE+1, "%c,%.6d,%.6d,%.2s,%.6d,%c,", format_char, index_num , elements_num, (ftype->read == NO_READ_FUNCTION) ? ((ftype->write == NO_WRITE_FUNCTION) ? "oo" : "wo") : ((ftype->write == NO_WRITE_FUNCTION) ? "ro" : "rw"), (int) FullFileLength(PN(owq)), change_char ); UCLIBCUNLOCK; LEVEL_DEBUG("length=%d", output_length); // TEMPORARY restore type from real to structure pn->type = ePN_structure; if (output_length < 0) { LEVEL_DEBUG("Problem formatting structure string"); return -EFAULT; } if ( output_length > PROPERTY_LENGTH_STRUCTURE ) { LEVEL_DEBUG("Structure string too long"); return -EINVAL ; } return OWQ_format_output_offset_and_size(structure_text,output_length,owq); }
static ZERO_OR_ERROR FS_r_version(struct one_wire_query *owq) { BYTE v[_LCD_PAGE_SIZE]; RETURN_ERROR_IF_BAD( OW_r_version(v, PN(owq)) ) ; return OWQ_format_output_offset_and_size((ASCII *) v, _LCD_PAGE_SIZE, owq); }
static ZERO_OR_ERROR FS_read_tester_single(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); int tester_bus = (pn->sn[2] << 8) + pn->sn[1]; int device = (pn->sn[6] << 8) + pn->sn[5]; int family_code = pn->sn[0]; int calculated_value = family_code + tester_bus + device + pn->extension; switch (OWQ_pn(owq).selected_filetype->format) { case ft_integer: OWQ_I(owq) = calculated_value; break; case ft_yesno: OWQ_Y(owq) = calculated_value & 0x1; break; case ft_bitfield: if (OWQ_pn(owq).extension == EXTENSION_BYTE) { OWQ_U(owq) = calculated_value; } else { OWQ_Y(owq) = calculated_value & 0x1; } break; case ft_unsigned: OWQ_U(owq) = calculated_value; break; case ft_pressure: case ft_temperature: case ft_tempgap: case ft_float: OWQ_F(owq) = (_FLOAT) calculated_value *0.1;; break; case ft_date: OWQ_D(owq) = 1174622400; break; case ft_alias: case ft_vascii: case ft_ascii: { ASCII address[16]; size_t length_left = OWQ_size(owq); size_t buffer_index; size_t length = FileLength(PN(owq)); ASCII return_chars[length]; bytes2string(address, pn->sn, SERIAL_NUMBER_SIZE); OWQ_length(owq) = OWQ_size(owq); for (buffer_index = 0; buffer_index < length; buffer_index += sizeof(address)) { size_t copy_length = length_left; if (copy_length > sizeof(address)) { copy_length = sizeof(address); } memcpy(&return_chars[buffer_index], address, copy_length); length_left -= copy_length; } return OWQ_format_output_offset_and_size(return_chars, length, owq); } case ft_binary: { size_t length_left = OWQ_size(owq); size_t buffer_index; size_t length = FileLength(PN(owq)); ASCII return_chars[length]; OWQ_length(owq) = OWQ_size(owq); for (buffer_index = 0; buffer_index < length; buffer_index += SERIAL_NUMBER_SIZE) { size_t copy_length = length_left; if (copy_length > SERIAL_NUMBER_SIZE) { copy_length = SERIAL_NUMBER_SIZE; } memcpy(&return_chars[buffer_index], pn->sn, copy_length); length_left -= copy_length; } return OWQ_format_output_offset_and_size(return_chars, length, owq); } case ft_directory: case ft_subdir: case ft_unknown: return -ENOENT; } return 0; // put data as string into buffer and return length }