static int lua_apr_ldap_modify(lua_State *L) { lua_apr_ldap_object *object; ldap_pchar_t dn; attrs_data attrs; ldap_int_t rc, msgid; int param = 3; object = check_ldap_connection(L, 1); dn = (ldap_pchar_t) luaL_checkstring(L, 2); A_init (&attrs); while (lua_istable(L, param)) { int op; /* get operation ('+','-','=' operations allowed) */ lua_rawgeti(L, param, 1); op = op2code(lua_tostring(L, -1)); if (op == LUA_APR_LDAP_NOOP) return luaL_error(L, "Forgotten operation on argument #%d!", param); /* get array of attributes and values */ A_tab2mod(L, &attrs, param, op); param++; } A_lastattr(L, &attrs); rc = ldap_modify_ext(object->ldap, dn, attrs.attrs, NULL, NULL, &msgid); return create_future(L, rc, 1, msgid, LDAP_RES_MODIFY); }
/** * \brief Initialize all coroutines. */ static void coro_init( void ) { CORO_CONTEXT_INIT( A ); A_alive = A_init(); CORO_CONTEXT_INIT( B ); B_alive = B_init(); CORO_CONTEXT_INIT( C ); C_alive = C_init(); }
/* ** Add a new entry to the directory. ** @param #1 LDAP connection. ** @param #2 String with new entry's DN. ** @param #3 Table with new entry's attributes and values. ** @return Function to process the LDAP result. */ static int lualdap_add (lua_State *L) { conn_data *conn = getconnection (L); ldap_pchar_t dn = (ldap_pchar_t) luaL_checkstring (L, 2); attrs_data attrs; ldap_int_t rc, msgid; A_init (&attrs); if (lua_istable (L, 3)) A_tab2mod (L, &attrs, 3, LUALDAP_MOD_ADD); A_lastattr (L, &attrs); rc = ldap_add_ext (conn->ld, dn, attrs.attrs, NULL, NULL, &msgid); return create_future (L, rc, 1, msgid, LDAP_RES_ADD); }
static int lua_apr_ldap_add(lua_State *L) { lua_apr_ldap_object *object; ldap_pchar_t dn; attrs_data attrs; ldap_int_t rc, msgid; object = check_ldap_connection(L, 1); dn = (ldap_pchar_t) luaL_checkstring(L, 2); A_init(&attrs); if (lua_istable(L, 3)) A_tab2mod(L, &attrs, 3, LUA_APR_LDAP_MOD_ADD); A_lastattr(L, &attrs); rc = ldap_add_ext(object->ldap, dn, attrs.attrs, NULL, NULL, &msgid); return create_future(L, rc, 1, msgid, LDAP_RES_ADD); }
/* ** Modify an entry. ** @param #1 LDAP connection. ** @param #2 String with entry's DN. ** @param #3, #4... Tables with modifications to apply. ** @return True on success or nil, error message otherwise. */ static int lualdap_modify (lua_State *L) { conn_data *conn = getconnection (L); ldap_pchar_t dn = (ldap_pchar_t) luaL_checkstring (L, 2); attrs_data attrs; ldap_int_t rc, msgid; int param = 3; A_init (&attrs); while (lua_istable (L, param)) { int op; /* get operation ('+','-','=' operations allowed) */ lua_rawgeti (L, param, 1); op = op2code (lua_tostring (L, -1)); if (op == LUALDAP_NO_OP) return luaL_error (L, LUALDAP_PREFIX"forgotten operation on argument #%d", param); /* get array of attributes and values */ A_tab2mod (L, &attrs, param, op); param++; } A_lastattr (L, &attrs); rc = ldap_modify_ext (conn->ld, dn, attrs.attrs, NULL, NULL, &msgid); return create_future (L, rc, 1, msgid, LDAP_RES_MODIFY); }
int main() { struct event *eventptr; struct msg msg2give; struct pkt pkt2give; int i,j; init(); A_init(); B_init(); while (1) { eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL) goto terminate; evlist = evlist->next; /* remove this event from event list */ if (evlist!=NULL) evlist->prev=NULL; if (TRACE>=2) { printf("\nEVENT time: %f,",eventptr->evtime); printf(" type: %d",eventptr->evtype); if (eventptr->evtype==0) printf(", timerinterrupt "); else if (eventptr->evtype==1) printf(", fromlayer5 "); else printf(", fromlayer3 "); printf(" entity: %d\n",eventptr->eventity); } time = eventptr->evtime; /* update time to next event time */ //if (nsim==nsimmax) //break; /* all done with simulation */ if (eventptr->evtype == FROM_LAYER5 ) { if(nsim < nsimmax -1) generate_next_arrival(); /* set up future arrival */ /* fill in msg to give with string of same letter */ j = nsim % 26; for (i=0; i<20; i++) msg2give.data[i] = 97 + j; if (TRACE>2) { printf(" MAINLOOP: data given to student: "); for (i=0; i<20; i++) printf("%c", msg2give.data[i]); printf("\n"); } nsim++; if (eventptr->eventity == A) A_rdtsend(msg2give); else B_rdtsend(msg2give); } else if (eventptr->evtype == FROM_LAYER3) { pkt2give.seqnum = eventptr->pktptr->seqnum; pkt2give.acknum = eventptr->pktptr->acknum; pkt2give.checksum = eventptr->pktptr->checksum; for (i=0; i<20; i++) pkt2give.payload[i] = eventptr->pktptr->payload[i]; if (eventptr->eventity ==A) /* deliver packet by calling */ A_rdtrcv(pkt2give); /* appropriate entity */ else B_rdtrcv(pkt2give); free(eventptr->pktptr); /* free the memory for packet */ } else if (eventptr->evtype == TIMER_INTERRUPT) { if (eventptr->eventity == A) A_timerinterrupt(); else B_timerinterrupt(); } else { printf("INTERNAL PANIC: unknown event type \n"); } free(eventptr); } terminate: printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time,nsim); return 0; }
int main( int argc, char *argv[] ) { struct event *eventptr; struct msg msg2give; struct pkt pkt2give; int currentEntity; int i,j; // Do our initialization and any requested by student's Transport Layer CallingArgc = argc; CallingArgv = argv; init( ); A_init(); B_init(); /* *********************************************************************** We loop here forever. During these actions we get an event off the event header. We analyze the action to be performed and go do it. *************************************************************************/ while (TRUE) { eventptr = evlist; // get next event to simulate from Q head if (eventptr==NULL) // IF nothing to simulate, we're done break; evlist = evlist->next; // remove this event from event list if (evlist != NULL) // and sort out forward and back ptrs evlist->prev=NULL; // Update simulation time to event time - by definition, the // simulation time is the time of the last event. CurrentSimTime = eventptr->evtime; currentEntity = eventptr->eventity; // If we've delivered the required number of messages, then we've // fullfilled our task and are done. if ( NumMsgs4To5 >= MaxMsgsToSimulate ) break; // all done with simulation /* ******************************************************************* Here we've gotten a request to hand data from layer 5 to layer 4. Generate the date we want to give to the student. *********************************************************************/ if ( eventptr->evtype == FROM_LAYER5 ) { // Use the sequence number as starter for the message string j = GeneratingSeqNum[currentEntity]++; // printf( "%X %d %d\n", &eventptr, currentEntity, j ); GetMessageString( currentEntity, j, &(msg2give.data[0]) ); /* Always print trace so we know it matches the receive */ if ( TraceLevel >= 0 ) { //printf("%c: ", &(EntityLetter[currentEntity]) ); if ( currentEntity == AEntity ) printf("A: " ); else printf("B: " ); printf(" %11.4f,", eventptr->evtime); printf(" Layer 5 to 4 Message = "); for (i=0; i<MESSAGE_LENGTH; i++) printf("%c", msg2give.data[i]); printf("\n"); } // The simulation will actually end when the requested number of // messages has been received back at layer 5. But there could be // many packets in the system, and that total arrival could take // a long time. We want to make sure we down't overwhelm the // student code with messages that won't ever be delivered anyway. // if ( NumMsgs5To4 <= MaxMsgsToSimulate + 3 ) { GenerateNextArrival(); // set up future arrival NumMsgs5To4++; // # msgs from layer 5 to 4 } if ( currentEntity == AEntity ) // Pass the data to layer 4 here A_output(msg2give); else B_output(msg2give); } /* END of event is from layer 5 */ /* ******************************************************************* This is a request to hand data from layer 3 up to student layer 4 *********************************************************************/ else if (eventptr->evtype == FROM_LAYER3 ) { pkt2give.seqnum = eventptr->pktptr->seqnum; pkt2give.acknum = eventptr->pktptr->acknum; pkt2give.checksum = eventptr->pktptr->checksum; for ( i = 0; i < MESSAGE_LENGTH; i++) pkt2give.payload[i] = eventptr->pktptr->payload[i]; if ( TraceLevel >= 2 ) { /* Print out trace info if requested */ if ( eventptr->eventity == AEntity ) printf("A: " ); else printf("B: " ); printf(" %11.4f,", eventptr->evtime); printf(" Layer 3 to 4 "); printf( "Seq/Ack/Check = %d/%d/%d: ", eventptr->pktptr->seqnum, eventptr->pktptr->acknum, eventptr->pktptr->checksum ); for (i=0; i<MESSAGE_LENGTH; i++) printf("%c", eventptr->pktptr->payload[i] ); printf("\n"); } if (eventptr->eventity == AEntity) /* deliver packet by calling */ A_input(pkt2give); /* appropriate entity */ else B_input(pkt2give); free(eventptr->pktptr); /* free the memory for packet */ } /* END of event is from layer 3 */ /* ******************************************************************* This is a request for a timer interrupt *********************************************************************/ else if (eventptr->evtype == TIMER_INTERRUPT) { if ( TraceLevel >= 2 ) { /* Print out trace info if requested */ if ( eventptr->eventity == AEntity ) printf("A: " ); else printf("B: " ); printf(" %f,", eventptr->evtime); printf(" Timer Interrupt\n"); } if (eventptr->eventity == AEntity) A_timerinterrupt(); else B_timerinterrupt(); } /* END of event is interrupt request */ else { printf("INTERNAL PANIC: unknown event type \n"); } free(eventptr); } // End of while terminate: printf("\n\nSimulator terminated at time %f\n after receiving %d msgs at layer5\n", CurrentSimTime, NumMsgs4To5 ); printf( "Simulator Analysis:\n"); printf( " Number of messages sent from 5 to 4: %d\n", NumMsgs5To4 ); printf( " Number of messages received at Layer 5, side A: %d\n", ExpectedSeqNum[0] ); printf( " Number of messages received at Layer 5, side B: %d\n", ExpectedSeqNum[1] ); printf( " Number of messages incorrectly received at layer 5: %d\n", NumMsgs5To4WithErr ); printf( " Number of packets entering the network: %d\n", NumMsgs4To3 ); printf( " Average number of packets already in network: %6.3f\n", (double)NumSimutaneousMsgs / (double)NumMsgs4To3 ); printf( " Number of packets that the network lost: %d\n", NumMsgsLost ); printf( " Number of packets that the network corrupted: %d\n", NumMsgsCorrupt ); printf( " Number of packets that the network put out of order: %d\n", NumMsgsOutOfOrder ); return 0; }
int main(int argc, char **argv) { struct event *eventptr; struct msg msg2give; struct pkt pkt2give; int i,j; char c; int opt; int seed; //Check for number of arguments if(argc != 5){ fprintf(stderr, "Missing arguments\n"); printf("Usage: %s -s SEED -w WINDOWSIZE\n", argv[0]); return -1; } /* * Parse the arguments * http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html */ while((opt = getopt(argc, argv,"s:w:")) != -1){ switch (opt){ case 's': if(!isNumber(optarg)){ fprintf(stderr, "Invalid value for -s\n"); return -1; } seed = atoi(optarg); break; case 'w': if(!isNumber(optarg)){ fprintf(stderr, "Invalid value for -w\n"); return -1; } WINSIZE = atoi(optarg); break; case '?': break; default: printf("Usage: %s -s SEED -w WINDOWSIZE\n", argv[0]); return -1; } } init(seed); A_init(); B_init(); while (1) { eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL) goto terminate; evlist = evlist->next; /* remove this event from event list */ if (evlist!=NULL) evlist->prev=NULL; if (TRACE>=2) { printf("\nEVENT time: %f,",eventptr->evtime); printf(" type: %d",eventptr->evtype); if (eventptr->evtype==0) printf(", timerinterrupt "); else if (eventptr->evtype==1) printf(", fromlayer5 "); else printf(", fromlayer3 "); printf(" entity: %d\n",eventptr->eventity); } time_local = eventptr->evtime; /* update time to next event time */ if (nsim==nsimmax) break; /* all done with simulation */ if (eventptr->evtype == FROM_LAYER5 ) { generate_next_arrival(); /* set up future arrival */ /* fill in msg to give with string of same letter */ j = nsim % 26; for (i=0; i<20; i++) msg2give.data[i] = 97 + j; if (TRACE>2) { printf(" MAINLOOP: data given to student: "); for (i=0; i<20; i++) printf("%c", msg2give.data[i]); printf("\n"); } nsim++; if (eventptr->eventity == A) A_output(msg2give); else B_output(msg2give); } else if (eventptr->evtype == FROM_LAYER3) { pkt2give.seqnum = eventptr->pktptr->seqnum; pkt2give.acknum = eventptr->pktptr->acknum; pkt2give.checksum = eventptr->pktptr->checksum; for (i=0; i<20; i++) pkt2give.payload[i] = eventptr->pktptr->payload[i]; if (eventptr->eventity ==A) /* deliver packet by calling */ A_input(pkt2give); /* appropriate entity */ else B_input(pkt2give); free(eventptr->pktptr); /* free the memory for packet */ } else if (eventptr->evtype == TIMER_INTERRUPT) { if (eventptr->eventity == A) A_timerinterrupt(); else B_timerinterrupt(); } else { printf("INTERNAL PANIC: unknown event type \n"); } free(eventptr); } terminate: //Do NOT change any of the following printfs printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time_local, nsim); printf("\n"); printf("Protocol: GBN\n"); printf("[PA2]%d packets sent from the Application Layer of Sender A[/PA2]\n", A_application); printf("[PA2]%d packets sent from the Transport Layer of Sender A[/PA2]\n", A_transport); printf("[PA2]%d packets received at the Transport layer of Receiver B[/PA2]\n", B_transport); printf("[PA2]%d packets received at the Application layer of Receiver B[/PA2]\n", B_application); printf("[PA2]Total time: %f time units[/PA2]\n", time_local); printf("[PA2]Throughput: %f packets/time units[/PA2]\n", B_application/time_local); return 0; }
/** constructor(). */ void A_B1_init(struct A_B1 *A_B1) { memset(A_B1, sizeof(*A_B1), 0); A_init(&A_B1->A); CLASS_OPS_INIT_SUPER(A_B1->A.ops, A_ops); }