From 9cf2936d6f106822fd92938e42598b3f51c68f1e Mon Sep 17 00:00:00 2001 From: dcp1990 Date: Thu, 23 Jun 2005 22:06:57 +0000 Subject: [PATCH] Adding bugs --- TODO | 7 ++++++- include/phoned.h | 6 +++--- phonectl/phonectl.c | 12 ++++++------ phoned/modem.c | 25 +++++++++++++++++++++++++ phoned/remote.c | 39 +++++++++++++++++++++++++-------------- 5 files changed, 65 insertions(+), 24 deletions(-) diff --git a/TODO b/TODO index 096ab3e..752e264 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ -$Amigan: phoned/TODO,v 1.2 2005/06/20 03:05:01 dcp1990 Exp $ +$Amigan: phoned/TODO,v 1.3 2005/06/23 22:06:57 dcp1990 Exp $ TODO For phoned: *Handle conditions (write the glue) - Halfway done. @@ -18,3 +18,8 @@ For scripts: For everything: *Write documentation + +OUTSTANDING BUGS: +*Certain race conditions (i.e. closing a socket during a blocking I/O call inside sendwr()) will leave mutexes open and the user logged in (or the servicing thread running entirely). + This needs to be fixed, either by detecting the system call interrupt or other means. Hopefully the IO call will exit in time, but we cannot hope for all things. + Fix this for good. diff --git a/include/phoned.h b/include/phoned.h index 88a962d..28e8711 100644 --- a/include/phoned.h +++ b/include/phoned.h @@ -3,7 +3,7 @@ * (C)2005, Dan Ponte * BSDL w/ advert. */ -/* $Amigan: phoned/include/phoned.h,v 1.26 2005/06/23 16:46:06 dcp1990 Exp $ */ +/* $Amigan: phoned/include/phoned.h,v 1.27 2005/06/23 22:06:58 dcp1990 Exp $ */ #include /* fugly, I know... */ #define VERSION "0.1" #define LOGFILE "-" @@ -139,8 +139,7 @@ typedef struct mod_t { } modem_t; typedef enum stat { init = 0, - loginstage, - pass + loggedin } states_t; typedef struct si_t { states_t st; @@ -194,6 +193,7 @@ void cid_handle(cid_t *c); void awaken_sel(void); void modem_wake(void); void fillset(void); +char *sendwr(const char *str, char *bufferback, size_t howmuch); login_t *check_logged_in(char *loginna, login_t *top); short log_in_user(char *loginna, char *pass, login_t **lnt); login_t *add_to_login_list(char *loginna, login_t **toppt); diff --git a/phonectl/phonectl.c b/phonectl/phonectl.c index 8501f41..a474b02 100644 --- a/phonectl/phonectl.c +++ b/phonectl/phonectl.c @@ -27,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -/* $Amigan: phoned/phonectl/phonectl.c,v 1.4 2005/06/23 21:38:58 dcp1990 Exp $ */ +/* $Amigan: phoned/phonectl/phonectl.c,v 1.5 2005/06/23 22:07:01 dcp1990 Exp $ */ /* system includes */ #include #include @@ -59,9 +59,9 @@ int main(argc, argv) perror("conn"); exit(-1); } - if(argc < 1) { - for(;;) { - puts("phonectl> "); + if(argc == 1) { + while(!feof(stdin)) { + fputs("phonectl> ", stdout); fgets(buff, 1024, stdin); nl = strchr(buff, '\n'); if(nl != NULL) *nl = '\0'; @@ -71,12 +71,12 @@ int main(argc, argv) } write(s, buff, strlen(buff) + 1); read(s, buff, sizeof(buff)); - puts(buff); + fputs(buff, stdout); } } write(s, argv[1], strlen(argv[1]) + 1); read(s, buff, sizeof buff); - puts(buff); + fputs(buff, stdout); close(s); return 0; } diff --git a/phoned/modem.c b/phoned/modem.c index 180c4c4..6de0c14 100644 --- a/phoned/modem.c +++ b/phoned/modem.c @@ -83,6 +83,31 @@ void stmod(str) pthread_mutex_unlock(&modemmx); } } +char *sendwr(str, bufferback, howmuch) + const char *str; + char *bufferback; + size_t howmuch; +{ + if(pthread_mutex_trylock(&modemmx) != 0 && pthread_mutex_trylock(&miomx) != 0) { + pthread_mutex_lock(&mpipemx); + write(modempipes[1], "G", 1); + pthread_mutex_unlock(&mpipemx); + pthread_mutex_lock(&modemmx); + write(modemfd, str, strlen(str) + 1); + write(modemfd, "\r\n", 3); + read(modemfd, bufferback, howmuch); + fgets(bufferback, howmuch, modem); + pthread_cond_signal(&mpcond); + pthread_mutex_unlock(&modemmx); + } else { + pthread_mutex_lock(&modemmx); + write(modemfd, str, strlen(str) + 1); + write(modemfd, "\r\n", 3); + fgets(bufferback, howmuch, modem); + pthread_mutex_unlock(&modemmx); + } + return bufferback; +} void modem_wake(void) { if(pthread_mutex_trylock(&miomx) != 0) { diff --git a/phoned/remote.c b/phoned/remote.c index 785fb19..a1d7428 100644 --- a/phoned/remote.c +++ b/phoned/remote.c @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ -/* $Amigan: phoned/phoned/remote.c,v 1.11 2005/06/22 04:01:03 dcp1990 Exp $ */ +/* $Amigan: phoned/phoned/remote.c,v 1.12 2005/06/23 22:07:02 dcp1990 Exp $ */ /* system includes */ #include #include @@ -228,8 +228,10 @@ char *parse_command(cmd, cont, s) rc = log_in_user(argvect[cpos], argvect[cpos + 1], &s->l); cpos++; if(rc == -1) { + s->st = loggedin; RNF("501 LOGGEDIN: Already logged in.\n"); } else if(rc) { + s->st = loggedin; RNF("501 LOGGEDIN: Logged in! Welcome!\n"); } else if(!rc) { RNF("514 LOGINFAIL: Login failed.\n"); @@ -237,16 +239,29 @@ char *parse_command(cmd, cont, s) } else { RNF("513 ERROR: Syntax error: Needs username and pass as arguments.\n"); } - } else if(CHK("logout")) { - if(s->l != NULL) { - pthread_mutex_lock(&usermx); - log_out_user(NULL, &s->l); - if(s->l == 0x0) usertop = 0; - pthread_mutex_unlock(&usermx); - s->l = NULL; - RNF("502 LOGGEDOUT: User logged out.\n"); + } else { + RNF("513 ERROR: No such command (perhaps not logged in?)\n"); + } + break; + case loggedin: + if(CHK("logout")) { + pthread_mutex_lock(&usermx); + log_out_user(NULL, &s->l); + if(s->l == 0x0) usertop = 0; + pthread_mutex_unlock(&usermx); + s->l = NULL; + s->st = init; + RNF("502 LOGGEDOUT: User logged out.\n"); + } else if(CHK("stmodem")) { + if(argvect[++cpos] != NULL) { + char *tempbuf; + tempbuf = malloc(512 * sizeof(char)); + memset(tempbuf, 0, 512 * sizeof(char)); + sendwr(argvect[cpos], tempbuf, 512); + s->freeit = 1; + return tempbuf; } else { - RNF("513 ERROR: Not logged in!\n"); + RNF("513 ERROR: Wrong number of arguments.\n"); } } else if(CHK("thandler")) { cid_t c; @@ -294,10 +309,6 @@ char *parse_command(cmd, cont, s) RNF("513 ERROR: Unrecognised Command\n"); } break; - case loginstage: - break; - case pass: - break; } return NULL; }