예제 #1
0
int
main(const int argc, const char *argv[])
{
    PERSON *ajout = NULL;
    int choice = 0;
    char temp[3] = "";

    clear_screen();

    create_users_file(USERSFILE);

    set_index_birthdays();

    check_argument(argc, argv);

    do
    {
        printf("\t\n1. Encoder un nouvel anniversaire");
        printf("\t\n2. Afficher les anniversaires");
        printf("\t\n3. Charger un fichier d'anniversaires");
        printf("\t\n4. Sauvegarder les anniversaires sur fich ier");
        printf("\t\n5. Afficher le prochain anniversaire");
        printf("\t\n6. Supprimer les anniversaires en cours");
        printf("\t\n7. Supprimer un anniversaire");
        printf("\t\n8. Quitter");
        printf("\t\n\nVotre choix: ");

        fgets(temp, sizeof(temp), stdin);
        choice = atoi(temp);

        clean_string(temp);

        switch(choice)
        {
            case 1: set_birthday(&ajout);
                    add_birthday(ajout);
                    free(ajout);
                    ajout = NULL;
                break;

            case 2: print_birthdays();
                break;

            case 3: load_birthdays();
                break;

            case 4: save_birthdays();
                break;

            case 5: print_next_birthday();
                break;

            case 6: clean_birthdays();
                break;

            case 7: delete_birthday();
                break;

            default:
                break;
        }

        if( choice != 8 )
        {
            press_enter_to_continue();
            clear_screen();
        }

    }while( choice != 8 );

    clean_birthdays();

    clean_errno();

    return EXIT_SUCCESS;
}
예제 #2
0
파일: gcode.c 프로젝트: sshirokov/cgc
char *gparser_next_line(gparser_t *parser) {
	char read_buffer[512] = {0};
	char *line = NULL;
	char *rc = NULL;

	// Sanity check the stream before we go on,
	check_debug(feof(parser->stream) == 0, "parser(%p)[%s]:%zd is at EOF", parser, parser->path, parser->line);
	check(ferror(parser->stream) == 0, "Error in parser(%p)[%s]:%zd stream.", parser, parser->path, parser->line);

	// Advance the line first
	parser->line++;

	// Try reading, with the hope that we get the entire line at once
	rc = fgets(read_buffer, sizeof(read_buffer), parser->stream);
	check(rc != NULL, "Failed to read line from '%s':%zd", parser->path, parser->line);
	check_mem(line = calloc(strlen(read_buffer) + 1, sizeof(char)));
	strncpy(line, read_buffer, strlen(read_buffer));

	// See if we need to finish reading the line
	while(line[strlen(line) - 1] != '\n') {
		rc = fgets(read_buffer, sizeof(read_buffer), parser->stream);
		if((rc == NULL) && feof(parser->stream)) {
			// We got everything that we can get, so we'll
			// call it a "line"
			break;
		}
		else {
			// Append the new data to the end of the line
			char *new_line = NULL;
			check(rc != NULL, "Error finishing line %s:%zd", parser->path, parser->line);
			check_mem(new_line = calloc(strlen(line) + strlen(read_buffer) + 1, sizeof(char)));

			strncpy(new_line, line, strlen(line));
			strncpy(new_line + strlen(new_line), read_buffer, strlen(read_buffer));

			free(line);
			line = new_line;
		}
	}

	return line;
error:
	if(line != NULL) free(line);
	if(feof(parser->stream)) debug("parser(%p)[%s]:%zd: EOF", parser, parser->path, parser->line);
	if(ferror(parser->stream)) debug("parser(%p)[%s]:%zd: ERROR. %s", parser, parser->path, parser->line, clean_errno());
	return NULL;
}
예제 #3
0
size_t fcgi_env_write(uint8_t *ptr,
		const size_t len,
		struct client_session *cs,
		struct session_request *sr)
{
	mk_pointer key, value;
	char buffer[128];
	char *tmpuri = NULL;
	size_t pos = 0;
	struct sockaddr_in addr;
	socklen_t addr_len;
	unsigned int i, j;
	char *hinit, *hend;
	size_t hlen;

	mk_api->pointer_set(&key,   "PATH_INFO");
	mk_api->pointer_set(&value, "");
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "GATEWAY_INTERFACE");
	mk_api->pointer_set(&value, "CGI/1.1");
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "REDIRECT_STATUS");
	mk_api->pointer_set(&value, "200");
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "SERVER_SOFTWARE");
	mk_api->pointer_set(&value, sr->host_conf->host_signature);
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "DOCUMENT_ROOT");
	value = sr->host_conf->documentroot;
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "SERVER_PROTOCOL");
	value = sr->protocol_p;
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "SERVER_NAME");
	value.data = sr->host_alias->name;
	value.len  = sr->host_alias->len;
	__write_param(ptr, len, pos, key, value);

	addr_len = sizeof(addr);
	if (!getsockname(cs->socket, (struct sockaddr *)&addr, &addr_len)) {
		if (!inet_ntop(AF_INET, &addr.sin_addr, buffer, 128)) {
			log_warn("Failed to get bound address.");
			buffer[0] = '\0';
		}
		mk_api->pointer_set(&key,   "SERVER_ADDR");
		mk_api->pointer_set(&value, buffer);
		__write_param(ptr, len, pos, key, value);

		snprintf(buffer, 128, "%d", ntohs(addr.sin_port));
		mk_api->pointer_set(&key,   "SERVER_PORT");
		mk_api->pointer_set(&value, buffer);
		__write_param(ptr, len, pos, key, value);
	} else {
		log_warn("%s", clean_errno());
		errno = 0;
	}

	mk_api->pointer_set(&key,   "SCRIPT_FILENAME");
	value = sr->real_path;
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "SCRIPT_NAME");
	value = sr->uri_processed;
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "REQUEST_METHOD");
	value = sr->method_p;
	__write_param(ptr, len, pos, key, value);

	addr_len = sizeof(addr);
	if (!getpeername(cs->socket, (struct sockaddr *)&addr, &addr_len)) {
		inet_ntop(AF_INET, &addr.sin_addr, buffer, 128);
		mk_api->pointer_set(&key,   "REMOTE_ADDR");
		mk_api->pointer_set(&value, buffer);
		__write_param(ptr, len, pos, key, value);

		snprintf(buffer, 128, "%d", ntohs(addr.sin_port));
		mk_api->pointer_set(&key,   "REMOTE_PORT");
		mk_api->pointer_set(&value, buffer);
		__write_param(ptr, len, pos, key, value);
	} else {
		log_warn("%s", clean_errno());
		errno = 0;
	}

	mk_api->pointer_set(&key,   "REQUEST_URI");
	if (sr->query_string.len > 0) {
		value.len = sr->uri.len + sr->query_string.len + 2;
		tmpuri = mk_api->mem_alloc(value.len);
		check_mem(tmpuri);
		value.data = tmpuri;
		snprintf(value.data, value.len, "%.*s?%.*s",
			(int)sr->uri.len, sr->uri.data,
			(int)sr->query_string.len, sr->query_string.data);
	} else {
		value = sr->uri;
	}
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "QUERY_STRING");
	value = sr->query_string;
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "CONTENT_TYPE");
	value = sr->content_type;
	__write_param(ptr, len, pos, key, value);

	mk_api->pointer_set(&key,   "CONTENT_LENGTH");
	snprintf(buffer, 128, "%d", sr->content_length);
	mk_api->pointer_set(&value, buffer);
	__write_param(ptr, len, pos, key, value);

	strcpy(buffer, "HTTP_");

	for (i = 0; i < (unsigned int)sr->headers_toc.length; i++) {
		hinit = sr->headers_toc.rows[i].init;
		hend = sr->headers_toc.rows[i].end;
		hlen = hend - hinit;

		for (j = 0; j < hlen; j++) {
			if (hinit[j] == ':') {
				break;
			}
			else if (hinit[j] != '-') {
				buffer[5 + j] = toupper(hinit[j]);
			}
			else {
				buffer[5 + j] = '_';
			}
		}

		key = (mk_pointer){.len = 5 + j, .data = buffer};
		value = (mk_pointer){.len = hlen - j - 2, .data = hinit + j + 2};

		__write_param(ptr, len, pos, key, value);
	}

	if (tmpuri) mk_api->mem_free(tmpuri);
	return pos;
error:
	if (tmpuri) mk_api->mem_free(tmpuri);
	return pos;
}
예제 #4
0
static VALUE method_zkrb_iterate_event_loop(VALUE self) {
  FETCH_DATA_PTR(self, zk);

  fd_set rfds, wfds, efds;
  FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&efds);

  int fd=0, interest=0, events=0, rc=0, maxfd=0;
  struct timeval tv;

  zookeeper_interest(zk->zh, &fd, &interest, &tv);

  if (fd != -1) {
    if (interest & ZOOKEEPER_READ) {
      FD_SET(fd, &rfds);
    } else {
      FD_CLR(fd, &rfds);
    }
    if (interest & ZOOKEEPER_WRITE) {
      FD_SET(fd, &wfds);
    } else {
      FD_CLR(fd, &wfds);
    }
  } else {
    fd = 0;
  }

  // add our self-pipe to the read set, allow us to wake up in case our attention is needed
  int pipe_r_fd = get_self_pipe_read_fd(self);

  FD_SET(pipe_r_fd, &rfds);

  maxfd = (pipe_r_fd > fd) ? pipe_r_fd : fd;

  rc = rb_thread_select(maxfd+1, &rfds, &wfds, &efds, &tv);

  if (rc > 0) {
    if (FD_ISSET(fd, &rfds)) {
      events |= ZOOKEEPER_READ;
    }
    if (FD_ISSET(fd, &wfds)) {
      events |= ZOOKEEPER_WRITE;
    }

    // we got woken up by the self-pipe
    if (FD_ISSET(pipe_r_fd, &rfds)) {
      // one event has awoken us, so we clear one event from the pipe
      char b[1];

      if (read(pipe_r_fd, b, 1) < 0) {
        rb_raise(rb_eRuntimeError, "read from pipe failed: %s", clean_errno());
      }
    }

    rc = zookeeper_process(zk->zh, events);
  }
  else if (rc == 0) {
    zkrb_debug("timed out waiting for descriptor to be ready");
  }
  else {
    log_err("select returned: %d", rc);
  }

  return INT2FIX(rc);
}