rfcomm exit code patch
Hi,
rfcomm does not always indicate failure in it's exit codes, which is a problem when automating things.
Please consider this patch.
Thanks,
Jesse
rfcomm/main.c +44 -34
@@ -226,10 +226,12 @@ req.dev_id = dev; err =ioctl (ctl,RFCOMMRELEASEDEV , &req); -if (err <0 ) +if (err <0 ){perror ("Can't release device" ); +return 1 ; + } -return err; +return 0 ; }static int release_all (int ctl)
@@ -241,7 +243,7 @@ dl =malloc (sizeof (*dl) +RFCOMM_MAX_DEV *sizeof (*di));if (!dl) {perror ("Can't allocate memory" ); -exit (1 ); +return 1 ; } dl->dev_num =RFCOMM_MAX_DEV ;
@@ -249,7 +251,7 @@if (ioctl (ctl,RFCOMMGETDEVLIST , (void *) dl) <0 ) {perror ("Can't get device list" ); -exit (1 ); +return 1 ; }for (i =0 ; i < dl->dev_num; i++)
@@ -310,7 +312,7 @@free (cmdargv); } -static void cmd_connect (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_connect (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {struct sockaddr_rc laddr, raddr;struct rfcomm_dev_req req;
@@ -329,7 +331,7 @@if (argc <2 ) {if (rfcomm_read_config (rfcomm_config_file) <0 ) {perror ("Can't open RFCOMM config file" ); -return ; +return 1 ; } raddr.rc_family =AF_BLUETOOTH ;
@@ -338,7 +340,7 @@if (bacmp (&raddr.rc_bdaddr,BDADDR_ANY ) ==0 ) {fprintf (stderr,"Can't find a config entry for rfcomm%d\n" , dev); -return ; +return 1 ; } }else { raddr.rc_family =AF_BLUETOOTH ;
@@ -353,7 +355,7 @@ sk =socket (AF_BLUETOOTH ,SOCK_STREAM ,BTPROTO_RFCOMM );if (sk <0 ) {perror ("Can't create RFCOMM socket" ); -return ; +return 1 ; }if (linger) {
@@ -361,27 +363,28 @@if (setsockopt (sk,SOL_SOCKET ,SO_LINGER , &l,sizeof (l)) <0 ) {perror ("Can't set linger option" ); -return ; +close (sk); +return 1 ; } }if (bind (sk, (struct sockaddr *) &laddr,sizeof (laddr)) <0 ) {perror ("Can't bind RFCOMM socket" );close (sk); -return ; +return 1 ; }if (connect (sk, (struct sockaddr *) &raddr,sizeof (raddr)) <0 ) {perror ("Can't connect RFCOMM socket" );close (sk); -return ; +return 1 ; } alen =sizeof (laddr);if (getsockname (sk, (struct sockaddr *)&laddr, &alen) <0 ) {perror ("Can't get RFCOMM socket name" );close (sk); -return ; +return 1 ; }memset (&req,0 ,sizeof (req));
@@ -396,7 +399,7 @@if (dev <0 ) {perror ("Can't create RFCOMM TTY" );close (sk); -return ; +return 1 ; }snprintf (devname,MAXPATHLEN -1 ,"/dev/rfcomm%d" , dev);
@@ -463,7 +466,7 @@printf ("Disconnected\n" );close (fd); -return ; +return 0 ; release:memset (&req,0 ,sizeof (req));
@@ -472,9 +475,10 @@ioctl (ctl,RFCOMMRELEASEDEV , &req);close (sk); +return 1 ; } -static void cmd_listen (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_listen (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {struct sockaddr_rc laddr, raddr;struct rfcomm_dev_req req;
@@ -493,7 +497,7 @@ sk =socket (AF_BLUETOOTH ,SOCK_STREAM ,BTPROTO_RFCOMM );if (sk <0 ) {perror ("Can't create RFCOMM socket" ); -return ; +return 1 ; } lm =0 ;
@@ -509,13 +513,13 @@if (lm &&setsockopt (sk,SOL_RFCOMM ,RFCOMM_LM , &lm,sizeof (lm)) <0 ) {perror ("Can't set RFCOMM link mode" );close (sk); -return ; +return 1 ; }if (bind (sk, (struct sockaddr *)&laddr,sizeof (laddr)) <0 ) {perror ("Can't bind RFCOMM socket" );close (sk); -return ; +return 1 ; }printf ("Waiting for connection on channel %d\n" , laddr.rc_channel);
@@ -529,7 +533,7 @@if (getsockname (nsk, (struct sockaddr *)&laddr, &alen) <0 ) {perror ("Can't get RFCOMM socket name" );close (nsk); -return ; +return 1 ; }if (linger) {
@@ -538,7 +542,7 @@if (setsockopt (nsk,SOL_SOCKET ,SO_LINGER , &l,sizeof (l)) <0 ) {perror ("Can't set linger option" );close (nsk); -return ; +return 1 ; } }
@@ -554,7 +558,7 @@if (dev <0 ) {perror ("Can't create RFCOMM TTY" );close (sk); -return ; +return 1 ; }snprintf (devname,MAXPATHLEN -1 ,"/dev/rfcomm%d" , dev);
@@ -629,7 +633,7 @@printf ("Disconnected\n" );close (fd); -return ; +return 0 ; release:memset (&req,0 ,sizeof (req));
@@ -638,33 +642,37 @@ioctl (ctl,RFCOMMRELEASEDEV , &req);close (sk); +return 1 ; } -static void cmd_watch (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_watch (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) { +int retv =0 ; +while (!__io_canceled) { -cmd_listen (ctl, dev, bdaddr, argc, argv); + retv =cmd_listen (ctl, dev, bdaddr, argc, argv);usleep (10000 ); } +return retv; } -static void cmd_create (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_create (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {if (strcmp (argv[0 ],"all" ) ==0 ) -create_all (ctl); +return create_all (ctl);else -create_dev (ctl, dev,0 , bdaddr, argc, argv); +return create_dev (ctl, dev,0 , bdaddr, argc, argv); } -static void cmd_release (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_release (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {if (strcmp (argv[0 ],"all" ) ==0 ) -release_all (ctl); +return release_all (ctl);else -release_dev (ctl, dev,0 ); +return release_dev (ctl, dev,0 ); } -static void cmd_show (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_show (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {if (strcmp (argv[0 ],"all" ) ==0 )print_dev_list (ctl,0 );
@@ -677,12 +685,13 @@print_dev_info (&di); } +return 0 ; }struct {char *cmd;char *alt; -void (*func)(int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv); +int (*func)(int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv);char *opt;char *doc; } command[] = {
@@ -828,13 +837,14 @@ dev_id =atoi (argv[1 ]);for (i =0 ; command[i].cmd; i++) { +int retv;if (strncmp (command[i].cmd, argv[0 ],4 ) &&strncmp (command[i].alt, argv[0 ],4 ))continue ; argc--; argv++; - command[i].func (ctl, dev_id, &bdaddr, argc, argv); + retv = command[i].func (ctl, dev_id, &bdaddr, argc, argv);close (ctl); -exit (0 ); +exit (retv ?1 :0 ); }usage ();
Marcel Holtmann
maintainerHi Jesse,
Quoted 4 lines
rfcomm does not always indicate failure in it's exit codes, which is a problem when automating things.
Please consider this patch.
your patch is full of whitespaces/tabs coding style violations. Please fix them first.
Also error return values should be negative.
Regards
Marcel
Quoted 8 lines · Marcel Holtmann
Hi Jesse,
Quoted 4 lines
rfcomm does not always indicate failure in it's exit codes, which is a problem when automating things.
Please consider this patch.
Quoted 9 lines
your patch is full of whitespaces/tabs coding style violations. Please fix them first.
Also error return values should be negative.
Regards
Marcel
Hi Marcel,
Thanks for the reply. Apologies. Here is a new patch.
Regards,
Jesse
rfcomm/main.c +44 -34
@@ -226,10 +226,12 @@ req.dev_id = dev; err =ioctl (ctl,RFCOMMRELEASEDEV , &req); -if (err <0 ) +if (err <0 ){perror ("Can't release device" ); +return -1 ; + } -return err; +return 0 ; }static int release_all (int ctl)
@@ -241,7 +243,7 @@ dl =malloc (sizeof (*dl) +RFCOMM_MAX_DEV *sizeof (*di));if (!dl) {perror ("Can't allocate memory" ); -exit (1 ); +return -1 ; } dl->dev_num =RFCOMM_MAX_DEV ;
@@ -249,7 +251,7 @@if (ioctl (ctl,RFCOMMGETDEVLIST , (void *) dl) <0 ) {perror ("Can't get device list" ); -exit (1 ); +return -1 ; }for (i =0 ; i < dl->dev_num; i++)
@@ -310,7 +312,7 @@free (cmdargv); } -static void cmd_connect (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_connect (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {struct sockaddr_rc laddr, raddr;struct rfcomm_dev_req req;
@@ -329,7 +331,7 @@if (argc <2 ) {if (rfcomm_read_config (rfcomm_config_file) <0 ) {perror ("Can't open RFCOMM config file" ); -return ; +return -1 ; } raddr.rc_family =AF_BLUETOOTH ;
@@ -338,7 +340,7 @@if (bacmp (&raddr.rc_bdaddr,BDADDR_ANY ) ==0 ) {fprintf (stderr,"Can't find a config entry for rfcomm%d\n" , dev); -return ; +return -1 ; } }else { raddr.rc_family =AF_BLUETOOTH ;
@@ -353,7 +355,7 @@ sk =socket (AF_BLUETOOTH ,SOCK_STREAM ,BTPROTO_RFCOMM );if (sk <0 ) {perror ("Can't create RFCOMM socket" ); -return ; +return -1 ; }if (linger) {
@@ -361,27 +363,28 @@if (setsockopt (sk,SOL_SOCKET ,SO_LINGER , &l,sizeof (l)) <0 ) {perror ("Can't set linger option" ); -return ; +close (sk); +return -1 ; } }if (bind (sk, (struct sockaddr *) &laddr,sizeof (laddr)) <0 ) {perror ("Can't bind RFCOMM socket" );close (sk); -return ; +return -1 ; }if (connect (sk, (struct sockaddr *) &raddr,sizeof (raddr)) <0 ) {perror ("Can't connect RFCOMM socket" );close (sk); -return ; +return -1 ; } alen =sizeof (laddr);if (getsockname (sk, (struct sockaddr *)&laddr, &alen) <0 ) {perror ("Can't get RFCOMM socket name" );close (sk); -return ; +return -1 ; }memset (&req,0 ,sizeof (req));
@@ -396,7 +399,7 @@if (dev <0 ) {perror ("Can't create RFCOMM TTY" );close (sk); -return ; +return -1 ; }snprintf (devname,MAXPATHLEN -1 ,"/dev/rfcomm%d" , dev);
@@ -463,7 +466,7 @@printf ("Disconnected\n" );close (fd); -return ; +return 0 ; release:memset (&req,0 ,sizeof (req));
@@ -472,9 +475,10 @@ioctl (ctl,RFCOMMRELEASEDEV , &req);close (sk); +return -1 ; } -static void cmd_listen (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_listen (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {struct sockaddr_rc laddr, raddr;struct rfcomm_dev_req req;
@@ -493,7 +497,7 @@ sk =socket (AF_BLUETOOTH ,SOCK_STREAM ,BTPROTO_RFCOMM );if (sk <0 ) {perror ("Can't create RFCOMM socket" ); -return ; +return -1 ; } lm =0 ;
@@ -509,13 +513,13 @@if (lm &&setsockopt (sk,SOL_RFCOMM ,RFCOMM_LM , &lm,sizeof (lm)) <0 ) {perror ("Can't set RFCOMM link mode" );close (sk); -return ; +return -1 ; }if (bind (sk, (struct sockaddr *)&laddr,sizeof (laddr)) <0 ) {perror ("Can't bind RFCOMM socket" );close (sk); -return ; +return -1 ; }printf ("Waiting for connection on channel %d\n" , laddr.rc_channel);
@@ -529,7 +533,7 @@if (getsockname (nsk, (struct sockaddr *)&laddr, &alen) <0 ) {perror ("Can't get RFCOMM socket name" );close (nsk); -return ; +return -1 ; }if (linger) {
@@ -538,7 +542,7 @@if (setsockopt (nsk,SOL_SOCKET ,SO_LINGER , &l,sizeof (l)) <0 ) {perror ("Can't set linger option" );close (nsk); -return ; +return -1 ; } }
@@ -554,7 +558,7 @@if (dev <0 ) {perror ("Can't create RFCOMM TTY" );close (sk); -return ; +return -1 ; }snprintf (devname,MAXPATHLEN -1 ,"/dev/rfcomm%d" , dev);
@@ -629,7 +633,7 @@printf ("Disconnected\n" );close (fd); -return ; +return 0 ; release:memset (&req,0 ,sizeof (req));
@@ -638,33 +642,37 @@ioctl (ctl,RFCOMMRELEASEDEV , &req);close (sk); +return -1 ; } -static void cmd_watch (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_watch (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) { +int retv =0 ; +while (!__io_canceled) { -cmd_listen (ctl, dev, bdaddr, argc, argv); + retv =cmd_listen (ctl, dev, bdaddr, argc, argv);usleep (10000 ); } +return retv; } -static void cmd_create (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_create (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {if (strcmp (argv[0 ],"all" ) ==0 ) -create_all (ctl); +return create_all (ctl);else -create_dev (ctl, dev,0 , bdaddr, argc, argv); +return create_dev (ctl, dev,0 , bdaddr, argc, argv); } -static void cmd_release (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_release (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {if (strcmp (argv[0 ],"all" ) ==0 ) -release_all (ctl); +return release_all (ctl);else -release_dev (ctl, dev,0 ); +return release_dev (ctl, dev,0 ); } -static void cmd_show (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) +static int cmd_show (int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv) {if (strcmp (argv[0 ],"all" ) ==0 )print_dev_list (ctl,0 );
@@ -677,12 +685,13 @@print_dev_info (&di); } +return 0 ; }struct {char *cmd;char *alt; -void (*func)(int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv); +int (*func)(int ctl,int dev,bdaddr_t *bdaddr,int argc,char **argv);char *opt;char *doc; } command[] = {
@@ -828,13 +837,14 @@ dev_id =atoi (argv[1 ]);for (i =0 ; command[i].cmd; i++) { +int retv;if (strncmp (command[i].cmd, argv[0 ],4 ) &&strncmp (command[i].alt, argv[0 ],4 ))continue ; argc--; argv++; - command[i].func (ctl, dev_id, &bdaddr, argc, argv); + retv = command[i].func (ctl, dev_id, &bdaddr, argc, argv);close (ctl); -exit (0 ); +exit (retv ?1 :0 ); }usage ();