@@ -56,6 +56,7 @@ struct state {
5656 struct client clients [CLIENTS_MAX ];
5757};
5858
59+ static void usage (char * cmd );
5960static bool serve (int listen_sock , struct chan * chan , struct dev * dev );
6061
6162static bool handle_connect (int sock , struct client * * client , struct state * state );
@@ -69,7 +70,7 @@ static struct dev *find_dev(struct state *state, int num);
6970static struct client * find_client (struct state * state , int sock );
7071static bool close_client (struct client * client , struct state * state );
7172
72- static void usage (char * cmd );
73+ static bool parse_dev_num (char * str , uint16_t * num );
7374static bool parse_dev_config (char * config , uint16_t * num , uint8_t * addr );
7475
7576int main (int argc , char * * argv )
@@ -112,7 +113,7 @@ int main(int argc, char **argv)
112113 uint8_t dev_addr ;
113114
114115 if (!parse_dev_config (dev_config , & dev_num , & dev_addr )) {
115- printf ("Device config invalid : %s\n" , argv [optind ]);
116+ printf ("Invalid device config : %s\n" , argv [optind ]);
116117 return EXIT_FAILURE ;
117118 }
118119
@@ -160,13 +161,13 @@ int main(int argc, char **argv)
160161
161162 struct chan chan ;
162163
163- int result = chan_out_open (& chan .out , mem_fd , "udmabuf0" , frontend_enable );
164+ int result = chan_out_open (& chan .out , mem_fd , "udmabuf0" , false );
164165
165166 if (result == -1 ) {
166167 perror ("chan_open" );
167168 return EXIT_FAILURE ;
168169 } else if (result < -1 ) {
169- printf ("chan_open error: %d\n" , result );
170+ printf ("chan_out_open error: %d\n" , result );
170171 return EXIT_FAILURE ;
171172 }
172173
@@ -184,7 +185,7 @@ int main(int argc, char **argv)
184185
185186 printf ("Device number %.4X configured for address %.2X\n" , dev .num , dev .addr );
186187
187- chan_out_enable (& chan .out );
188+ chan_out_config (& chan .out , true, frontend_enable );
188189
189190 struct mock_cu mock_cu ;
190191
@@ -208,7 +209,7 @@ int main(int argc, char **argv)
208209 mock_cu_close (& mock_cu );
209210 }
210211
211- chan_out_close (& chan .out );
212+ chan_out_close (& chan .out , true );
212213
213214 free (chan .recv_buf );
214215
@@ -218,6 +219,11 @@ int main(int argc, char **argv)
218219 return (success ? EXIT_SUCCESS : EXIT_FAILURE );
219220}
220221
222+ void usage (char * cmd )
223+ {
224+ printf ("Usage: %s [-lm] nnnn[:aa]\n" , cmd );
225+ }
226+
221227volatile bool stop = false;
222228
223229static void signal_handler (int signum )
@@ -481,7 +487,7 @@ bool handle_msg(struct client *client, uint8_t *msg, size_t msg_len, struct stat
481487 return cxip_send_error (client -> sock , 0 , "Device already open" );
482488 }
483489
484- chan_out_config (& dev -> chan -> out , dev -> addr , true);
490+ chan_out_dev_config (& dev -> chan -> out , dev -> addr , true);
485491
486492 printf ("%.4X | %.2X | Open |\n" , dev -> num , dev -> addr );
487493
@@ -501,7 +507,7 @@ bool handle_msg(struct client *client, uint8_t *msg, size_t msg_len, struct stat
501507 return cxip_send_error (client -> sock , 0 , "Device not open" );
502508 }
503509
504- chan_out_config (& dev -> chan -> out , dev -> addr , false);
510+ chan_out_dev_config (& dev -> chan -> out , dev -> addr , false);
505511
506512 printf ("%.4X | %.2X | Close |\n" , dev -> num , dev -> addr );
507513
@@ -654,7 +660,7 @@ bool close_client(struct client *client, struct state *state)
654660 if (state -> dev != NULL && state -> dev -> client == client ) {
655661 struct dev * dev = state -> dev ;
656662
657- chan_out_config (& dev -> chan -> out , dev -> addr , false);
663+ chan_out_dev_config (& dev -> chan -> out , dev -> addr , false);
658664
659665 dev -> client = NULL ;
660666 }
@@ -674,9 +680,41 @@ bool close_client(struct client *client, struct state *state)
674680 return true;
675681}
676682
677- void usage (char * cmd )
683+ bool parse_dev_num (char * str , uint16_t * num )
678684{
679- printf ("Usage: %s [-lm] nnnn[:aa]\n" , cmd );
685+ if (str == NULL ) {
686+ return false;
687+ }
688+
689+ size_t digits = 0 ;
690+
691+ for (size_t index = 0 ; index < strlen (str ); index ++ ) {
692+ if (isblank (str [index ])) {
693+ continue ;
694+ }
695+
696+ if (!isxdigit (str [index ])) {
697+ return false;
698+ }
699+
700+ if (++ digits > 4 ) {
701+ return false;
702+ }
703+ }
704+
705+ char * end ;
706+
707+ errno = 0 ;
708+
709+ unsigned long value = strtol (str , & end , 16 );
710+
711+ if (errno != 0 || * end != '\0' ) {
712+ return false;
713+ }
714+
715+ * num = (uint16_t ) value ;
716+
717+ return true;
680718}
681719
682720bool parse_dev_config (char * config , uint16_t * num , uint8_t * addr )
@@ -692,38 +730,16 @@ bool parse_dev_config(char *config, uint16_t *num, uint8_t *addr)
692730 return false;
693731 }
694732
695- for (int element = 0 ; element < 2 ; element ++ ) {
696- for (size_t index = 0 ; index < strlen (token ); index ++ ) {
697- if (!(isxdigit (token [index ]) || isblank (token [index ]))) {
698- return false;
699- }
700- }
701-
702- char * end ;
703-
704- errno = 0 ;
705-
706- unsigned long value = strtol (token , & end , 16 );
707-
708- if (errno != 0 || * end != '\0' ) {
709- return false;
710- }
711-
712- if (element == 0 && value <= 0xffff ) {
713- * num = (uint16_t ) value ;
714- * addr = (uint8_t ) (value & 0xff );
715- } else if (element == 1 && value <= 0xff ) {
716- * addr = (uint8_t ) (value & 0xff );
717- } else {
718- return false;
719- }
720-
721- if (strlen (rest ) == 0 ) {
722- break ;
723- }
733+ if (!parse_dev_num (token , num )) {
734+ return false;
735+ }
724736
725- token = rest ;
737+ if (strlen (rest ) == 0 ) {
738+ * addr = (uint8_t ) (* num & 0xff );
739+ return true;
726740 }
727741
728- return true;
742+ token = rest ;
743+
744+ return chan_parse_dev_addr (token , addr );
729745}
0 commit comments