@@ -9,7 +9,7 @@ use std::fs::{find, load};
99use std:: vars:: { get_boot_item, get_boot_order, set_boot_item, set_boot_order} ;
1010use uefi:: status:: { Error , Result } ;
1111
12- use super :: { FIRMWAREDIR , FIRMWARENSH , FIRMWAREROM , UEFIFLASH , shell, Component } ;
12+ use super :: { AMIDE , FIRMWAREDIR , FIRMWARENSH , FIRMWAREROM , SERIAL , UEFIFLASH , shell, Component } ;
1313
1414pub struct BiosComponent {
1515 bios_vendor : String ,
@@ -107,6 +107,23 @@ impl BiosComponent {
107107 println ! ( "Failed to locate EC" ) ;
108108 }
109109 }
110+
111+ fn set_serial ( & self , serial : & str ) -> Result < ( ) > {
112+ if find ( AMIDE ) . is_ok ( ) {
113+ let cmd = format ! ( "{} /SS {}" , AMIDE , serial) ;
114+ let status = shell ( & cmd) ?;
115+
116+ if status == 0 {
117+ Ok ( ( ) )
118+ } else {
119+ println ! ( "{} Set Serial Error: {}" , self . name( ) , status) ;
120+ Err ( Error :: DeviceError )
121+ }
122+ } else {
123+ //TODO
124+ Err ( Error :: NotFound )
125+ }
126+ }
110127}
111128
112129impl Component for BiosComponent {
@@ -427,6 +444,25 @@ impl Component for BiosComponent {
427444 }
428445 }
429446
447+ if let Ok ( serial_vec) = load ( SERIAL ) {
448+ match String :: from_utf8 ( serial_vec) {
449+ Ok ( serial_str) => {
450+ let serial = serial_str. trim ( ) ;
451+ match self . set_serial ( & serial) {
452+ Ok ( ( ) ) => {
453+ println ! ( "Set serial to '{}'" , serial) ;
454+ } ,
455+ Err ( err) => {
456+ println ! ( "Failed to set serial to '{}': {:?}" , serial, err) ;
457+ }
458+ }
459+ } ,
460+ Err ( err) => {
461+ println ! ( "Failed to parse serial: {:?}" , err) ;
462+ }
463+ }
464+ }
465+
430466 Ok ( ( ) )
431467 }
432468}
0 commit comments