Пример #1
0
int main(int argc, char **argv)
{
	int fd;
	char ch;
	ssize_t ret_n;

	if (argc != 4) {
		while ((ch = getchar()) != EOF) 
			putchar(toupper(ch));
		return 0;
	}

	if ((fd = open(argv[2], atoi(argv[3]))) < 0) {
		perror("open file");
		exit(EXIT_FAILURE);
	}

	if ((ret_n = send_back(atoi(argv[1]), "", 1, fd)) < 0) {
		perror("send_back");
		exit(EXIT_FAILURE);
	}

	return 0;
}
Пример #2
0
/** SIGCHLD handler **/
void handler(int signum, siginfo_t *info, void *context) {
    int cpid, status;

    cpid = info->si_pid; // sending pid
    //printf("Got a SIGCHLD from %d!\n", cpid);

    // loop to catch simultaneous SIGCHLDs
    while( (cpid = waitpid(-1, &status, WNOHANG | WUNTRACED | WCONTINUED)) > 0 ) {

        //printf("HANDLER Got %d from waitpid\n", cpid);
        job *j = get_job(job_list, cpid);
        if(j == NULL) {
            printf("Error: get_job returned null\n");
            _exit(EXIT_FAILURE);
        }

        if(WIFEXITED(status)) { // completed
            if( set_complete(j, cpid) == -1 ) {
                printf("HANDLER set_complete went awry!\n");
                _exit(EXIT_FAILURE);
            }
        }
        else if(WIFSIGNALED(status)) { // terminated
            set_complete(j, cpid);
            printf("\n");
            //printf("TERMINATED: %d\n", WTERMSIG(status));
        }
        else if(WIFSTOPPED(status)) { // stopped
            j->running = 0;

            if(j->fg) {
                send_back(job_list, j->pgid);
                printf("\nStopped: %s\n", j->rawcmd);
            } else {

                // queue stopped message
                message *m = malloc(sizeof(message));
                copy_to_buf(j->rawcmd, m->msg);
                m->status = 0;
                push(msg_q, PROCESS, (void *)m);
            }
        }
        else if(WIFCONTINUED(status)) { // continued
            j->running = 1;
            //printf("CONTINUED\n");
        }

        if(j->complete) {
            j->running = 0;
            if(!j->fg) {
                // queue finished message
                message *m = malloc(sizeof(message));
                copy_to_buf(j->rawcmd, m->msg);
                m->status = 1;
                push(msg_q, PROCESS, (void *)m);

                free_job(del_job(job_list, j->pgid));
            }
        }
    }

    //printf("HANDLER Done with waitpid loop\n");
}
Пример #3
0
machine_t::machine_t(const Timed *daemon) : timed(daemon)
{
  log_debug() ;
  // T = transition state
  // IO = waiting for i/o state
  // G = gate state
  // C = concentrating gate state
  // F = filtering state
  // A = actions allowed
  // -->NEW loaded as new
  // -->DUE loaded as due
  abstract_state_t *S[] =
  {
    state_start = new state_start_t(this),                     // T
    state_epoch = new state_epoch_t(this),                     // T
    state_waiting = new state_waiting_t(this),                 // IO G
    state_new = new state_new_t(this),                         // T
    state_scheduler = new state_scheduler_t(this),             // T
    state_qentry = new state_qentry_t(this),                   // T
    state_flt_conn = new state_flt_conn_t(this),               // IO G F -->NEW
    state_flt_alrm = new state_flt_alrm_t(this),               // IO G F -->NEW
    state_flt_user = new state_flt_user_t(this),               // IO G F -->NEW
    state_queued = new state_queued_t(this),                   // IO A   -->NEW

    state_due = new state_due_t(this),                         // T

    state_missed = new state_missed_t(this),                   // T A
    state_skipped = new state_skipped_t(this),                 // T

    state_armed = new state_armed_t(this),                     // IO G
    state_triggered = new state_triggered_t(this),             // T A

    state_dlg_wait = new state_dlg_wait_t(this),               // IO G   -->DUE
    state_dlg_cntr = new state_dlg_cntr_t(this),               // IO C   -->DUE
    state_dlg_requ = new state_dlg_requ_t(this),               // IO G   -->DUE
    state_dlg_user = new state_dlg_user_t(this),               // IO G   -->DUE
    state_dlg_resp = new state_dlg_resp_t(this),               // T

   /* state_buttons: below */                                  // T A

    state_snoozed = new state_snoozed_t(this),                 // T
    state_recurred = new state_recurred_t(this),               // T
    state_served = new state_served_t(this),                   // T
    state_tranquil = new state_tranquil_t(this),               // IO A -->DUE

    state_removed = new state_removed_t(this),                 // T
    state_aborted = new state_aborted_t(this),                 // T
    state_finalized = new state_finalized_t(this),             // T A
    NULL
  } ;
  log_debug() ;
  for(int i=0; S[i]; ++i)
    states.insert(S[i]) ;

  log_debug() ;
  for(int i=0; i<=Maemo::Timed::Number_of_Sys_Buttons; ++i)
    states.insert(buttons[-i] = new state_button_t(this, -i)) ;

  log_debug() ;
  for(int i=1; i<=Maemo::Timed::Max_Number_of_App_Buttons; ++i)
    states.insert(buttons[i] = new state_button_t(this, i)) ;

  for (set<abstract_state_t*>::iterator it=states.begin(); it!=states.end(); ++it)
    (*it)->resolve_names() ;

  log_debug() ;
  state_triggered->set_action_mask(ActionFlags::State_Triggered) ;
  state_queued->set_action_mask(ActionFlags::State_Queued) ;
  state_missed->set_action_mask(ActionFlags::State_Missed) ;
  state_tranquil->set_action_mask(ActionFlags::State_Tranquil) ;
  state_finalized->set_action_mask(ActionFlags::State_Finalized) ;
  state_due->set_action_mask(ActionFlags::State_Due) ;
  state_snoozed->set_action_mask(ActionFlags::State_Snoozed) ;
  state_served->set_action_mask(ActionFlags::State_Served) ;
  state_aborted->set_action_mask(ActionFlags::State_Aborted) ;
  // states_failed->set_action_mask(ActionFlags::State_Failed) ;

#if 0
  log_debug() ;
  io_state *queued = dynamic_cast<io_state*> (states["QUEUED"]) ;
  log_assert(queued!=NULL) ;

  gate_state *armed = dynamic_cast<gate_state*> (states["ARMED"]) ;
  log_assert(armed!=NULL) ;
  armed->open() ; // will be closed in some very special situations

  log_debug() ;
  gate_state *dlg_wait = dynamic_cast<gate_state*> (states["DLG_WAIT"]) ;
  gate_state *dlg_requ = dynamic_cast<gate_state*> (states["DLG_REQU"]) ;
  gate_state *dlg_user = dynamic_cast<gate_state*> (states["DLG_USER"]) ;
  gate_state *dlg_cntr = dynamic_cast<gate_state*> (states["DLG_CNTR"]) ;
  log_assert(dlg_wait!=NULL) ;
  log_assert(dlg_requ!=NULL) ;
  log_assert(dlg_user!=NULL) ;
  log_assert(dlg_cntr!=NULL) ;
#endif

  state_armed->open() ;

  QObject::connect(state_dlg_wait, SIGNAL(voland_needed()), this, SIGNAL(voland_needed())) ;

  QObject::connect(state_dlg_wait, SIGNAL(closed()), state_dlg_requ, SLOT(open())) ;
  QObject::connect(state_dlg_wait, SIGNAL(closed()), state_dlg_user, SLOT(open())) ;
  QObject::connect(state_dlg_requ, SIGNAL(closed()), state_dlg_wait, SLOT(open())) ;

  QObject::connect(this, SIGNAL(voland_registered()), state_dlg_requ, SLOT(close())) ;
  QObject::connect(this, SIGNAL(voland_registered()), state_dlg_user, SLOT(close())) ;
  QObject::connect(this, SIGNAL(voland_unregistered()), state_dlg_wait, SLOT(close())) ;
  QObject::connect(this, SIGNAL(voland_unregistered()), state_dlg_cntr, SLOT(send_back())) ;

  QObject::connect(state_queued, SIGNAL(sleep()), state_dlg_cntr, SLOT(open()), Qt::QueuedConnection) ;
  QObject::connect(state_dlg_wait, SIGNAL(opened()), state_dlg_cntr, SLOT(open()), Qt::QueuedConnection) ;

#if 0
  log_debug() ;
  filter_state *flt_conn = dynamic_cast<filter_state*> (states["FLT_CONN"]) ;
  filter_state *flt_alrm = dynamic_cast<filter_state*> (states["FLT_ALRM"]) ;
  filter_state *flt_user = dynamic_cast<filter_state*> (states["FLT_USER"]) ;
  log_assert(flt_conn) ;
  log_assert(flt_alrm) ;
  log_assert(flt_user) ;
#endif

  QObject::connect(state_flt_conn, SIGNAL(closed(abstract_filter_state_t*)), state_queued, SLOT(filter_closed(abstract_filter_state_t*))) ;
  QObject::connect(state_flt_alrm, SIGNAL(closed(abstract_filter_state_t*)), state_queued, SLOT(filter_closed(abstract_filter_state_t*))) ;
  QObject::connect(state_flt_user, SIGNAL(closed(abstract_filter_state_t*)), state_queued, SLOT(filter_closed(abstract_filter_state_t*))) ;

  log_debug() ;
  QObject::connect(this, SIGNAL(engine_pause(int)), state_queued, SLOT(engine_pause(int))) ;
  log_debug() ;
  initial_pause = new pause_t(this) ;
  log_debug() ;

  cluster_queue = new cluster_queue_t(this) ;
  log_debug() ;
  clusters[cluster_queue->bit] = cluster_queue ;
  log_debug() ;

  cluster_dialog = new cluster_dialog_t(this) ;
  log_debug() ;
  clusters[cluster_dialog->bit] = cluster_dialog ;
  log_debug() ;
  signalled_bootup = -1 ; // no signal sent yet
  signalled_non_boot_event = -1;
  log_debug() ;

  log_debug("machine->settings->alarms_are_enabled=%d", timed->settings->alarms_are_enabled) ;
  log_debug() ;
  alarm_gate(timed->settings->alarms_are_enabled) ;
  log_debug() ;

  transition_start_time = ticker_t(0) ;
  transition_time_adjustment.set(0) ;
  log_debug() ;
  next_cookie = 1 ;
  log_debug() ;
  context_changed = false ;
  log_debug("last line") ;
}
Пример #4
0
int main()
{
	struct pollfd fds[3];
	fds[0].fd = -1;
	fds[1].fd = -1;
	fds[2].fd = -1;

	int srv_sock = Socket(AF_INET, SOCK_STREAM, 0);
	fds[0].fd = srv_sock;
	fds[0].events = POLLIN;

	struct sockaddr_in srv_addr;
	mkaddr(&srv_addr, "127.0.0.1", "2345");
	Bind(srv_sock, (struct sockaddr *)&srv_addr, sizeof(srv_addr));

	Listen(srv_sock, 5);

	int ret = 0;
	char buf[128];
	int i = 1;
	while (1) {
		printf("debug: going to poll().... "); 
		fflush(stdout);
		ret = Poll(fds, 3, -1);
		printf("%d\n", ret);

		int j = 0;
		for (j = 0; j < 3; j++)
		{
			if (fds[j].fd == -1)
				continue;

			if ((fds[j].fd == srv_sock) && ((fds[j].revents & POLLIN) == POLLIN)) {
				int cli_sock = Accept(srv_sock, NULL, NULL);
				fds[i].fd = cli_sock;
				fds[i].events = POLLIN;
				i++;

				printf("debug: create a new connection\n");
				if (--ret == 0)
					break;
			}

			if ((fds[j].revents & POLLIN) == POLLIN) {
				printf("debug: is on the cli_sock %d\n", fds[j].fd);
				int len = recv_all(fds[j].fd, buf);
				if (len == -1) {
					close(fds[j].fd);
					fds[j].fd == -1;
					bzero(&fds[j], sizeof(struct pollfd));
					printf("here\n");
					break;
				}

				send_back(fds[j].fd, buf, len);
				printf("debug: send back %s\n", buf);
			}

			if ((fds[j].revents & POLLHUP) == POLLHUP) {
				close(fds[j].fd);
				printf("debug POLLUP\n");
			}

		}
	}

	close(srv_sock);

	return 0;
}