# HG changeset patch # User kono # Date 1225010377 -32400 # Node ID 2d27043cb96bc91c35322cb577c69c8013a8d12d # Parent e7d30a296a9bb59d19865827ec7e963ea5f7c886 First connection to REP session manager. diff -r e7d30a296a9b -r 2d27043cb96b src/reditor.c --- a/src/reditor.c Wed Sep 24 21:22:42 2008 +0900 +++ b/src/reditor.c Sun Oct 26 17:39:37 2008 +0900 @@ -34,7 +34,6 @@ static int rep_connect(char *host); -static void* rep_alloc(int size); static void rep_free(void *obj); static BUFTYPE* get_buf_by_name(char *name); @@ -68,14 +67,14 @@ static unsigned int get_header(char *buf,int offset); static int set_header(unsigned int num, char *pkt, int offset); -static int rep_exe_cmd(unsigned int cmd, +static int rep_exe_cmd(rep_cmd *command, unsigned int cmd, unsigned int sid, unsigned int eid, unsigned int seq, unsigned int lnum, unsigned int textsize, char *text); -static int rep_exe_pkt(char *pkt); +static int rep_exe_pkt(rep_cmd *command, char *pkt); static int rep_exe_pktlist(rep_cmdlist *cmdlist); static int rep_recv_cmds(int fd, rep_cmdlist *smcmdlist,rep_cmdlist *txtcmdlist); @@ -339,12 +338,17 @@ g_rep.seqno = 0; g_rep.permit = FALSE; - + +#ifndef HOST_NAME_MAX +#define HOST_NAME_MAX 255 +#endif + g_rep.hostname = (char *)malloc(HOST_NAME_MAX); if (gethostname(g_rep.hostname, sizeof(g_rep.hostname)) < 0) { strncpy(g_rep.hostname, def_hostname, sizeof(def_hostname)+1); } + g_rep.nop = make_cmd(REPCMD_NOP, 0, 0, 0, 0, ""); - return(TRUE); + return TRUE; } @@ -447,12 +451,12 @@ char *sname; int namelen = strlen(name)+1; - s = (Session*)rep_alloc(sizeof(Session)); + s = (Session*)malloc(sizeof(Session)); if (s == NULL) { return(NULL); } - if ((sname = (char*)rep_alloc(namelen)) == NULL) { + if ((sname = (char*)malloc(namelen)) == NULL) { return NULL; } strncpy(sname,name,namelen); @@ -594,7 +598,7 @@ rep->smfd = sock; rep->permit = TRUE; - add_cmd_to_list(&cmdlist, make_cmd(REP_JOIN_CMD, 0, rep->eid, rep->seqno++, 0, "bufname")); + add_cmd_to_list(&cmdlist, make_cmd(SMCMD_JOIN, 0, rep->eid, rep->seqno++, 0, "")); rep_send_cmds(sock, &cmdlist); free_cmdlist(&cmdlist); @@ -631,10 +635,10 @@ rep_free(rep->waiting_session_name); } len = strlen(sname) +1; - rep->waiting_session_name = (char *)rep_alloc(len); + rep->waiting_session_name = (char *)malloc(len); memcpy(rep->waiting_session_name, sname, len); - add_cmd_to_list(&cmdlist, make_cmd(REP_PUT_CMD, 0, rep->eid, rep->seqno++, 0, sname)); + add_cmd_to_list(&cmdlist, make_cmd(SMCMD_PUT, 0, rep->eid, rep->seqno++, 0, sname)); rep_send_cmds(rep->smfd, &cmdlist); @@ -657,7 +661,7 @@ return FALSE; } - cmd = make_cmd(REP_DEREGISTER_CMD, sn->sid, rep->eid, rep->seqno, 0, NULL); + cmd = make_cmd(REPCMD_CLOSE, sn->sid, rep->eid, rep->seqno, 0, NULL); add_cmd_to_list(&cmdlist, cmd); rep_send_cmds(rep->smfd, &cmdlist); free_cmdlist(&cmdlist); @@ -669,18 +673,6 @@ /* Session End */ -static void * -rep_alloc(size) - int size; /* byte */ -{ - void *allocated; - if ((allocated = malloc(size)) == NULL) { - e_msg_wrp("no memory!"); - } - - return allocated; -} - static void rep_free(obj) void *obj; @@ -745,7 +737,7 @@ if (text) len = strlen(text);// + 1; /* for include '\0' */ - if ((packet = (char *)rep_alloc(REP_HEADER_SIZE+len)) == NULL) { + if ((packet = (char *)malloc(REP_HEADER_SIZE+len)) == NULL) { return(NULL); } @@ -783,7 +775,7 @@ return(NULL); } - cmd_p = (rep_cmd*)rep_alloc(sizeof(rep_cmd)); + cmd_p = (rep_cmd*)malloc(sizeof(rep_cmd)); if (cmd_p == NULL) { e_msg_wrp("make_cmd: no memory: ERROR"); return(NULL); @@ -802,7 +794,6 @@ cmd_p->len = length; cmd_p->lnum = lnum; - cmd_p->stat = REP_AVAIL; cmd_p->pkt = pkt; return(cmd_p); @@ -900,14 +891,14 @@ cursn->prevline=lnum; if (xtr<0) { // ml_delete case - cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum)); + cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum)); rep_send_cmd(rep->smfd,cmd); rep_free(cmd); } else if (xtr==0) { // ml_replace case if (cursn->del_cmd) return; // already line saved do nothing - cursn->del_cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum)); + cursn->del_cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum)); } else { // ml_append case @@ -945,7 +936,7 @@ for(i=lnum;isid, rep->eid, rep->seqno++, i+1, get_memline_wrp(cursn->buf, i+1)); + cmd = make_cmd(REPCMD_INSERT, cursn->sid, rep->eid, rep->seqno++, i+1, get_memline_wrp(cursn->buf, i+1)); add_cmd_to_list(&(cursn->new_cmdlist), cmd); } cursn->prevline=-1; @@ -965,12 +956,12 @@ cursn->prevline = lnum; // send saved new line as INSERT command - cmd = make_cmd(REP_INSERT_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum)); + cmd = make_cmd(REPCMD_INSERT, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum)); rep_send_cmd(rep->smfd,cmd); rep_free(cmd); // save current line for next replace - cursn->del_cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum)); + cursn->del_cmd = make_cmd(REPCMD_DELETE, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, get_memline_wrp(cursn->buf, lnum)); } } @@ -1007,9 +998,57 @@ return(header); } +/* + REP command packet flow + + Own change + + CMD ------> session manager + session manager <--- CMD command return + <------ MERGE_START (block user input) + <------ Merge fix from session manager + CMD ------> session manager return same command as ack + <------ MERGE_END command return + (enable user input) + + session manager <--- CMD incomming external command + NOP ------> session manager if we have sent any command + CMD ------> session manager return same command as ack + + */ + +static void +forwardCommand(rep_T *rep, rep_cmd *command) +{ + int fd = rep->smfd; + writen(fd,command->pkt,command->len+REP_HEADER_SIZE); +} + +static void +incrementSeq(rep_T *rep) +{ + rep->seqno++; +} + +static void +addNop(Session *session, rep_T *rep) +{ + int fd = rep->smfd; + char *packet = rep->nop->pkt; + + if (rep->prevSeq==rep->seqno) { + set_header(session->sid, packet, REP_SID_OFFSET); + set_header(rep->eid, packet, REP_EID_OFFSET); + set_header(rep->seqno, packet, REP_SEQNUM_OFFSET); + rep->prevSeq = rep->seqno; + incrementSeq(rep); + writen(fd,rep->nop->pkt,rep->nop->len+REP_HEADER_SIZE); + } +} static int -rep_exe_cmd(cmd, sid, eid, seq, lnum, textsize, text) +rep_exe_cmd(command, cmd, sid, eid, seq, lnum, textsize, text) + rep_cmd *command; unsigned int cmd; unsigned int sid; unsigned int eid; @@ -1018,14 +1057,13 @@ unsigned int textsize; char *text; { - rep_cmdlist tmplist = {NULL, 0}; rep_T *rep = get_rep(); Session *session; session = find_session_by_id(sid); switch (cmd) { - case REP_JOIN_ACK: + case SMCMD_JOIN_ACK: /* show session lineup */ if (rep->slineup) { free_session(rep->slineup); @@ -1038,11 +1076,9 @@ rep_start_create_cmds(); update_screen_now_wrp(); - if (rep->eid == 0) { - rep->eid = eid; - } + rep->eid = eid; break; - case REP_PUT_ACK: + case SMCMD_PUT_ACK: /* Enter Session */ if (text) { // text is error message. @@ -1063,26 +1099,37 @@ /* set session to cursession */ set_cursession(session); rep_start_create_cmds(); - break; - case REP_INSERT_CMD: + case REPCMD_INSERT: append_memline_wrp(lnum, text); + if (eid!=MERGE_EID) addNop(session, rep); + forwardCommand(rep,command); break; - case REP_DELETE_LINE_CMD: + case REPCMD_DELETE: delete_memline_wrp(lnum); + case REPCMD_NOP: + if (eid!=MERGE_EID) addNop(session, rep); + forwardCommand(rep,command); break; + case SMCMD_SYNC: + break; + case SMCMD_QUIT: + forwardCommand(rep,command); + break; + case SMCMD_START_MERGE: + break; + case SMCMD_END_MERGE: + rep->prevSeq = rep->seqno; default: break; } - free_cmdlist(&(tmplist)); - return(TRUE); } - static int -rep_exe_pkt(pkt) +rep_exe_pkt(command, pkt) + rep_cmd *command; char *pkt; { unsigned int cmd; @@ -1101,7 +1148,7 @@ len = get_header(pkt, REP_T_SIZE_OFFSET); text = pkt + REP_TEXT_OFFSET; - rep_exe_cmd(cmd, sid, eid, seq, lnum, len, text); + rep_exe_cmd(command, cmd, sid, eid, seq, lnum, len, text); return(TRUE); } @@ -1118,9 +1165,7 @@ } for (repcmd = cmdlist->head; repcmd; repcmd = repcmd->next) { - if (repcmd->stat == REP_AVAIL) { - rep_exe_pkt(repcmd->pkt); - } + rep_exe_pkt(repcmd, repcmd->pkt); } return(TRUE); @@ -1149,8 +1194,6 @@ return(FALSE); } - /* 一定時間読み取るようにしたい */ - /* read header part */ if (readn(fd, header, REP_HEADER_SIZE) < 0) { puts_sys_err(); @@ -1165,7 +1208,7 @@ textsize = get_header(header, REP_T_SIZE_OFFSET); if (textsize > 0) { - if ((text = (char*)rep_alloc(textsize)+1) == NULL) { + if ((text = (char*)malloc(textsize)+1) == NULL) { return(FALSE); } /* read text part */ @@ -1177,9 +1220,8 @@ text[textsize] = 0; } - if (cmd == REP_INSERT_CMD || - cmd == REP_DELETE_LINE_CMD || - cmd == REP_REPLACE_CMD) { + if (cmd == REPCMD_DELETE || + cmd == REPCMD_DELETE ) { add_cmd_to_list(txtcmdlist, make_cmd(cmd, sid, eid, seq, lnum, text)); } else { add_cmd_to_list(smcmdlist, make_cmd(cmd, sid, eid, seq, lnum, text)); @@ -1247,43 +1289,23 @@ rep_cmdlist smcmdlist = {NULL,0}; rep_cmdlist txtcmdlist = {NULL,0}; - Session *sn = NULL; - - /* input from keyboard is most important. - * reditor has nothing to do */ - if (FD_ISSET(fd, rfds_p) || FD_ISSET(fd, efds_p)) { - return(TRUE); - } - rep_p = get_rep(); - if ((rep_p->smfd > 0) && (FD_ISSET(rep_p->smfd, rfds_p))) { if (rep_recv_cmds(rep_p->smfd, &(smcmdlist), &(txtcmdlist)) == FALSE) { close(rep_p->smfd); rep_p->smfd = -1; - return FALSE; - } - /* Session ごとに行う↓*/ - rep_exe_pktlist(&txtcmdlist); - - if (rep_send_cmds(rep_p->smfd, &(txtcmdlist)) == FALSE) { - close(sn->smfd); - sn->smfd = -1; + } else { + rep_exe_pktlist(&txtcmdlist); free_cmdlist(&(txtcmdlist)); - return FALSE; + rep_exe_pktlist( &smcmdlist); + free_cmdlist(&(smcmdlist)); } - free_cmdlist(&(txtcmdlist)); - - rep_exe_pktlist( &smcmdlist); - free_cmdlist(&(smcmdlist)); + } - return TRUE; + if (FD_ISSET(fd, rfds_p) || FD_ISSET(fd, efds_p)) { + return(TRUE); } - rep_exe_pktlist( &smcmdlist); - free_cmdlist(&(smcmdlist)); - - return TRUE; - + return FALSE; } @@ -1366,8 +1388,7 @@ } - rep_fd_check(fd, &rfds_p, &efds_p); - return(TRUE); + if (rep_fd_check(fd, &rfds_p, &efds_p)) return(TRUE); } } diff -r e7d30a296a9b -r 2d27043cb96b src/reditor.h --- a/src/reditor.h Wed Sep 24 21:22:42 2008 +0900 +++ b/src/reditor.h Sun Oct 26 17:39:37 2008 +0900 @@ -3,38 +3,39 @@ #define SOCK_MAX 5 #define MAX_FDS 10 -#define REP_OPEN_CMD 1 -#define REP_OPEN_ACK 2 -#define REP_READ_CMD 3 -#define REP_READ_ACK 4 -#define REP_READ_FIN 5 -#define REP_INSERT_CMD 6 -#define REP_INSERT_STILL_ACK 7 -#define REP_INSERT_FINISH_ACK 8 -#define REP_DELETE_LINE_CMD 9 -#define REP_DELETE_LINE_ACK 10 -#define REP_CLOSE_CMD 11 -#define REP_CLOSE_ACK 12 -#define REP_REPLACE_CMD 13 -//#define REP_CHANGE_FD_CMD 14 -//#define REP_ENTER_RING_CMD 15 -//#define REP_ENTER_RING_ACK 16 +#define REPCMD_INSERT ( 6) +#define REPCMD_INSERT_ACK ( 7) +#define REPCMD_DELETE ( 9) +#define REPCMD_DELETE_ACK ( 10) +#define REPCMD_CLOSE ( 11) +#define REPCMD_CLOSE_2 ( 12) +#define REPCMD_NOP ( 15) +#define SMCMD_JOIN ( 41) +#define SMCMD_JOIN_ACK ( 42) +#define SMCMD_PUT ( 45) +#define SMCMD_PUT_ACK ( 46) +#define SMCMD_SELECT ( 47) +#define SMCMD_SELECT_ACK ( 48), +#define SMCMD_SELECT0 (49) +#define SMCMD_QUIT ( 53) +#define SMCMD_QUIT_ACK ( 54) +#define SMCMD_SM_JOIN ( 62) +#define SMCMD_SM_JOIN_ACK ( 63) +#define SMCMD_UPDATE ( 65) +#define SMCMD_UPDATE_ACK ( 66) +#define SMCMD_START_MERGE ( 75) +#define SMCMD_START_MERGE_ACK ( 76) +#define SMCMD_END_MERGE ( 77) +#define SMCMD_QUIT_2 ( 67) +#define SMCMD_QUIT_2_ACK ( 68) -#define REP_JOIN_CMD 41 -#define REP_JOIN_ACK 42 -#define REP_GET_CMD 43 -#define REP_GET_ACK 44 -#define REP_PUT_CMD 45 -#define REP_PUT_ACK 46 -#define REP_SELECT_CMD 47 -#define REP_SELECT_ACK 48 -#define REP_REGISTER_CMD 49 -#define REP_REGISTER_ACK 50 -#define REP_DEREGISTER_CMD 51 -#define REP_DEREGISTER_ACK 52 -#define REP_QUIT_CMD 53 -#define REP_QUIT_ACK 54 + +#define SM_EID ( -1) +#define MERGE_EID ( -2) + +#define SMCMD_SYNC ( 83) +#define SMCMD_SYNC_ACK ( 84) /* header and text @@ -126,16 +127,19 @@ BUFTYPE *scratch_buf; char *servername; - char hostname[HOSTNAME_LEN]; char *waiting_session_name; int eid; /* editor id */ int seqno; /* sequence number of REP command*/ + int prevSeq; /* sequence number of last merged command */ int smfd; /* socket connected to SessionManager */ int permit; + rep_cmd *nop; + + char *hostname; } rep_T;