Registering to an operator with R=xxxxx in libgsmd-tool -m shell results in
R=12345 # Unknown command `R=12345' . This has been broken since revision 3657, 2007-12-17. When fixing it I cleaned up the handling of all commands taking arguments, which also fixes the segfaults when too few arguments are given to most commands (try typing e.g. just "pr") and a problem when a command works even when there is trailing garbage in the command name (e.g. "prxxxxxxxxx=1"). Jörgen Index: target/gsm/src/util/shell.c =================================================================== --- target/gsm/src/util/shell.c (revision 4541) +++ target/gsm/src/util/shell.c (working copy) @@ -614,6 +614,7 @@ char buf[STDIN_BUF_SIZE+1]; fd_set readset; char *ptr, *fcomma, *lcomma; + int value; int gsm_fd = lgsm_fd(lgsmh); const struct msghandler_s *hndl; @@ -696,13 +697,14 @@ } else if (!strcmp(buf, "r")) { printf("Register\n"); lgsm_netreg_register(lgsmh, "\0 "); - } else if (!strcmp(buf,"R")) { + } else if (!strncmp(buf, "R=", 2) && + (ptr = strchr(buf, '=')) && + strlen(ptr+1) >= 5) { printf("Register to operator\n"); - ptr = strchr(buf, '='); - if (!ptr || strlen(ptr) < 6) - printf("No.\n"); - else - lgsm_netreg_register(lgsmh, ptr + 1); + lgsm_netreg_register(lgsmh, ptr + 1); + // Careful here; other commands also start with "R": + } else if (!strncmp(buf, "R=", 2)) { + printf("Register to operator\nNo.\n"); } else if (!strcmp(buf, "U")) { printf("Unregister\n"); lgsm_netreg_deregister(lgsmh); @@ -728,41 +730,45 @@ pending_responses ++; } else if (!strcmp(buf, "q")) { exit(0); - } else if (buf[0] == 'S' ) { - if(!strchr(buf,'=') || atoi((strchr(buf,'=')+1)) < 0) { - printf("Sleep 5 secs\n"); - sleep(5); - }else { - printf("Sleep %d secs\n",atoi(strchr(buf,'=')+1)); - sleep(atoi(strchr(buf,'=')+1)); - } + } else if (!strncmp(buf, "S=", 2) && + (ptr = strchr(buf,'=')) && + (value = atoi(ptr+1)) >= 0) { + printf("Sleep %d secs\n", value); + sleep(value); + } else if (!strncmp(buf, "S", 1)) { + printf("Sleep 5 secs\n"); + sleep(5); } else if (buf[0] == 'T') { if (strlen(buf) < 2) continue; printf("DTMF: %c\n", buf[1]); lgsm_voice_dtmf(lgsmh, buf[1]); - } else if ( !strncmp(buf, "pd", 2)) { + } else if (!strncmp(buf, "pd=", 3) && + (ptr = strchr(buf, '='))) { printf("Delete Phonebook Entry\n"); - ptr = strchr(buf, '='); lgsm_pb_del_entry(lgsmh, atoi(ptr+1)); - } else if ( !strncmp(buf, "prr", 3)) { + } else if (!strncmp(buf, "pd", 2)) { + printf("Delete Phonebook Entry\nNo.\n"); + } else if (!strncmp(buf, "prr=", 3) && + (ptr = strchr(buf, '=')) && + (fcomma = strchr(ptr+1, ','))) { printf("Read Phonebook Entries\n"); struct lgsm_phonebook_readrg pb_readrg; - - ptr = strchr(buf, '='); pb_readrg.index1 = atoi(ptr+1); - ptr = strchr(buf, ','); - pb_readrg.index2 = atoi(ptr+1); + pb_readrg.index2 = atoi(fcomma+1); lgsm_pb_read_entries(lgsmh, &pb_readrg); pending_responses ++; - } else if ( !strncmp(buf, "pr", 2)) { - ptr = strchr(buf, '='); + } else if (!strncmp(buf, "prr", 3)) { + printf("Read Phonebook Entries\nNo.\n"); + } else if (!strncmp(buf, "pr=", 3) && + (ptr = strchr(buf, '='))) { lgsm_pb_read_entry(lgsmh, atoi(ptr+1)); - } else if ( !strncmp(buf, "pf", 2)) { + } else if (!strncmp(buf, "pr", 2)) { + printf("No.\n"); + } else if (!strncmp(buf, "pf=", 3) && + (ptr = strchr(buf, '='))) { printf("Find Phonebook Entry\n"); struct lgsm_phonebook_find pb_find; - - ptr = strchr(buf, '='); strncpy(pb_find.findtext, ptr + 1, sizeof(pb_find.findtext) - 1); @@ -770,15 +776,16 @@ lgsm_pb_find_entry(lgsmh, &pb_find); pending_responses ++; - } else if ( !strncmp(buf, "pw", 2)) { + } else if (!strncmp(buf, "pf", 2)) { + printf("Find Phonebook Entry\nNo.\n"); + } else if (!strncmp(buf, "pw=", 3) && + (ptr = strchr(buf, '=')) && + (fcomma = strchr(buf+1, ',')) && + (lcomma = strchr(fcomma+1, ','))) { printf("Write Phonebook Entry\n"); struct lgsm_phonebook pb; - - ptr = strchr(buf, '='); + pb.index = atoi(ptr+1); - - fcomma = strchr(buf, ','); - lcomma = strchr(fcomma+1, ','); strncpy(pb.numb, fcomma + 1, (lcomma - fcomma - 1)); pb.numb[(lcomma - fcomma - 1)] = '\0'; if ('+' == pb.numb[0]) @@ -789,49 +796,53 @@ pb.text[strlen(lcomma + 1)] = '\0'; lgsm_pb_write_entry(lgsmh, &pb); + } else if (!strncmp(buf, "pw", 2)) { + printf("Write Phonebook Entry\nNo.\n"); } else if ( !strncmp(buf, "pm", 2)) { lgsm_pb_list_storage(lgsmh); - } else if ( !strncmp(buf, "pp", 2)) { + } else if (!strncmp(buf, "pp=", 3) && + (ptr = strchr(buf, '='))) { char storage[3]; - - ptr = strchr(buf, '='); strncpy(storage, (ptr+1), 2); - lgsm_pb_set_storage(lgsmh, storage); + } else if (!strncmp(buf, "pp", 2)) { + printf("No.\n"); } else if ( !strncmp(buf, "ps", 2)) { printf("Get Phonebook Support\n"); lgsm_pb_get_support(lgsmh); pending_responses ++; - } else if ( !strncmp(buf, "sd", 2)) { - printf("Delete SMS\n"); + } else if (!strncmp(buf, "sd=", 3) && + (ptr = strchr(buf, '=')) && + (lcomma = strchr(buf+1, ','))) { + printf("Delete SMS\n"); struct lgsm_sms_delete sms_del; - - ptr = strchr(buf, '='); sms_del.index = atoi(ptr+1); - ptr = strchr(buf, ','); - sms_del.delflg = atoi(ptr+1); - + sms_del.delflg = atoi(lcomma+1); lgsm_sms_delete(lgsmh, &sms_del); pending_responses ++; - } else if ( !strncmp(buf, "sl", 2)) { + } else if (!strncmp(buf, "sd", 2)) { + printf("Delete SMS\nNo.\n"); + } else if (!strncmp(buf, "sl=", 3) && + (ptr = strchr(buf, '='))) { printf("List SMS\n"); - ptr = strchr(buf, '='); - lgsm_sms_list(lgsmh, atoi(ptr+1)); pending_responses ++; - } else if ( !strncmp(buf, "sr", 2)) { + } else if (!strncmp(buf, "sl", 2)) { + printf("List SMS\nNo.\n"); + } else if (!strncmp(buf, "sr", 2) && + (ptr = strchr(buf, '='))) { printf("Read SMS\n"); - ptr = strchr(buf, '='); - lgsm_sms_read(lgsmh, atoi(ptr+1)); pending_responses ++; - } else if ( !strncmp(buf, "ss", 2)) { + } else if (!strncmp(buf, "sr", 2)) { + printf("Read SMS\nNo.\n"); + } else if (!strncmp(buf, "ss=", 3) && + (ptr = strchr(buf, '=')) && + (fcomma = strchr(ptr+1, ',')) && + (lcomma = strchr(fcomma+1, ','))) { struct lgsm_sms sms; - ptr = strchr(buf, '='); sms.ask_ds = atoi(ptr+1); - fcomma = strchr(buf, ','); - lcomma = strchr(fcomma+1, ','); strncpy(sms.addr, fcomma+1, lcomma-fcomma-1); sms.addr[lcomma-fcomma-1] = '\0'; /* todo define \" to allow " in text */ @@ -851,14 +862,16 @@ lgsm_sms_send(lgsmh, &sms); pending_responses ++; - } else if ( !strncmp(buf, "sw", 2)) { - printf("Write SMS\n"); + } else if (!strncmp(buf, "ss", 2)) { + printf("Send SMS\nNo.\n"); + } else if (!strncmp(buf, "sw=", 3) && + (ptr = strchr(buf, '=')) && + (fcomma = strchr(ptr+1, ',')) && + (lcomma = strchr(fcomma+1, ','))) { + printf("Write SMS\n"); struct lgsm_sms_write sms_write; - ptr = strchr(buf, '='); sms_write.stat = atoi(ptr+1); - fcomma = strchr(buf, ','); - lcomma = strchr(fcomma+1, ','); strncpy(sms_write.sms.addr, fcomma+1, lcomma-fcomma-1); sms_write.sms.addr[lcomma-fcomma-1] = '\0'; @@ -868,6 +881,8 @@ lgsm_sms_write(lgsmh, &sms_write); pending_responses ++; + } else if (!strncmp(buf, "sw", 2)) { + printf("Write SMS\nNo.\n"); } else if (!strncmp(buf, "sm", 2)) { printf("Get SMS storage preferences\n"); lgsm_sms_get_storage(lgsmh); @@ -886,13 +901,13 @@ printf("Get the default SMSC\n"); lgsm_sms_get_smsc(lgsmh); pending_responses ++; + } else if (!strncmp(buf, "sC=", 3) && + (ptr = strchr(buf, '=')) && + strlen(ptr+1) >= 5) { + printf("Set the default SMSC\n"); + lgsm_sms_set_smsc(lgsmh, ptr + 1); } else if (!strncmp(buf, "sC", 2)) { - printf("Set the default SMSC\n"); - ptr = strchr(buf, '='); - if (!ptr || strlen(ptr) < 6) - printf("No.\n"); - else - lgsm_sms_set_smsc(lgsmh, ptr + 1); + printf("Set the default SMSC\nNo.\n"); } else if (!strcmp(buf, "n")) { lgsm_get_subscriber_num(lgsmh); pending_responses ++; @@ -900,14 +915,14 @@ printf("Get Voicemail Number\n"); lgsm_voicemail_get(lgsmh); pending_responses ++; - } else if ( !strncmp(buf, "svm", 3)) { + } else if (!strncmp(buf, "svm=", 4) && + (ptr = strchr(buf, '=')) && + strlen(ptr+1) >= 2) { printf("Set Voicemail Number\n"); - ptr = strchr(buf, '='); - if (!ptr || strlen(ptr) < 3) - printf("No.\n"); - else - lgsm_voicemail_set(lgsmh, ptr + 1); + lgsm_voicemail_set(lgsmh, ptr + 1); pending_responses ++; + } else if (!strncmp(buf, "svm", 3)) { + printf("Set Voicemail Number\nNo.\n"); } else if (!strncmp(buf, "im", 2)) { printf("Get imsi\n"); lgsm_get_imsi(lgsmh); @@ -962,14 +977,16 @@ printf("Release all active calls\n"); lgsm_voice_ctrl(lgsmh, &ctrl); pending_responses ++; - } else if ( !strncmp(buf, "Rx", 2)) { + } else if (!strncmp(buf, "Rx=", 3) && + (ptr = strchr(buf, '='))) { struct lgsm_voicecall_ctrl ctrl; ctrl.proc = LGSM_VOICECALL_CTRL_R_ACT_X; printf("Release specific active call x\n"); - ptr = strchr(buf, '='); ctrl.idx = atoi(ptr+1); lgsm_voice_ctrl(lgsmh, &ctrl); pending_responses ++; + } else if (!strncmp(buf, "Rx", 2)) { + printf("Release specific active call x\nNo.\n"); } else if ( !strncmp(buf, "Ha", 2)) { struct lgsm_voicecall_ctrl ctrl; ctrl.proc = LGSM_VOICECALL_CTRL_H_ACTS_A_HLD_WAIT; @@ -977,49 +994,61 @@ " call\n"); lgsm_voice_ctrl(lgsmh, &ctrl); pending_responses ++; - } else if ( !strncmp(buf, "Hx", 2)) { + } else if (!strncmp(buf, "Hx=", 3) && + (ptr = strchr(buf, '='))) { struct lgsm_voicecall_ctrl ctrl; ctrl.proc = LGSM_VOICECALL_CTRL_H_ACTS_EXCEPT_X; printf("Hold all active calls except call x\n"); - ptr = strchr(buf, '='); ctrl.idx = atoi(ptr+1); lgsm_voice_ctrl(lgsmh, &ctrl); pending_responses ++; + } else if (!strncmp(buf, "Hx", 2)) { + printf("Hold all active calls except call x\nNo.\n"); } else if ( !strncmp(buf, "MP", 2)) { struct lgsm_voicecall_ctrl ctrl; ctrl.proc = LGSM_VOICECALL_CTRL_M_HELD; printf("Add a held call to the conversation\n"); lgsm_voice_ctrl(lgsmh, &ctrl); pending_responses ++; - } else if ( !strncmp(buf, "CFD", 3)) { + } else if (!strncmp(buf, "CFD=", 4) && + (ptr = strchr(buf, '='))) { printf("Disable call forwarding\n"); - ptr = strchr(buf, '='); lgsm_voice_fwd_disable(lgsmh, atoi(ptr+1)); pending_responses ++; - }else if ( !strncmp(buf, "CFE", 3)) { + } else if (!strncmp(buf, "CFD", 3)) { + printf("Disable call forwarding\nNo.\n"); + } else if (!strncmp(buf, "CFE=", 4) && + (ptr = strchr(buf, '='))) { printf("Enable call forwarding\n"); - ptr = strchr(buf, '='); lgsm_voice_fwd_enable(lgsmh, atoi(ptr+1)); pending_responses ++; - }else if ( !strncmp(buf, "CFQ", 3)) { + } else if (!strncmp(buf, "CFE", 3)) { + printf("Enable call forwarding\nNo.\n"); + }else if (!strncmp(buf, "CFQ=", 4) && + (ptr = strchr(buf, '='))) { printf("Query the status of call forwarding\n"); - ptr = strchr(buf, '='); lgsm_voice_fwd_stat(lgsmh, atoi(ptr+1)); pending_responses ++; - }else if ( !strncmp(buf, "CFR", 3)) { + } else if (!strncmp(buf, "CFQ", 3)) { + printf("Query the status of call forwarding\nNo.\n"); + } else if (!strncmp(buf, "CFR=", 4) && + (ptr = strchr(buf, '=')) && + (lcomma = strchr(ptr+1, ','))) { struct lgsm_voicecall_fwd_reg lvfr; printf("Register call forwarding\n"); - ptr = strchr(buf, '='); lvfr.reason = atoi(ptr+1); - ptr = strchr(buf, ','); strcpy(lvfr.number.addr, ptr+1); lgsm_voice_fwd_reg(lgsmh, &lvfr); pending_responses ++; - }else if ( !strncmp(buf, "CFe", 3)) { + } else if (!strncmp(buf, "CFR", 3)) { + printf("Register call forwarding\nNo.\n"); + } else if (!strncmp(buf, "CFe=", 4) && + (ptr = strchr(buf, '='))) { printf("Erase a record of call forwarding\n"); - ptr = strchr(buf, '='); lgsm_voice_fwd_erase(lgsmh, atoi(ptr+1)); pending_responses ++; + } else if (!strncmp(buf, "CFe", 3)) { + printf("Erase a record of call forwarding\nNo.\n"); }else if ( !strncmp(buf, "cbc", 3)) { printf("Battery Connection status and Battery Charge Level\n"); lgsm_get_battery(lgsmh); _______________________________________________ devel mailing list devel@lists.openmoko.org https://lists.openmoko.org/mailman/listinfo/devel