/* {{{ proto void Riak\Bucket->getKeyStream(Riak\Output\KeyStreamOutput streamer [, int $timeout = 0]) Streams all keys in the bucket */ PHP_METHOD(RiakBucket, getKeyStream) { struct riak_stream_key_cb_param cb_params; riack_string rsbucket, *rstype; riak_connection *connection, *stream_connection; zval* zstreamer; long timeout; int riackstatus; timeout = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|l", &zstreamer, riak_key_streamer_ce, &timeout) == FAILURE) { zend_throw_exception(riak_badarguments_exception_ce, "Bad or missing argument", 500 TSRMLS_CC); return; } // Create a new connection only for this stream // LibRiack can only handle one operation at the time pr connection connection = get_riak_connection(getThis() TSRMLS_CC); THROW_EXCEPTION_IF_CONNECTION_IS_NULL(connection); stream_connection = take_connection(connection->client->host, strlen(connection->client->host), connection->client->port TSRMLS_CC); if (!stream_connection) { CHECK_RIACK_STATUS_THROW_AND_RETURN_ON_ERROR(stream_connection, RIACK_ERROR_COMMUNICATION); } rsbucket = riack_name_from_bucket(getThis() TSRMLS_CC); #ifdef ZTS cb_params.tsrm_ls = TSRMLS_C; #endif cb_params.zstreamer = zstreamer; rstype = riack_get_bucket_type_from_bucket(connection->client, getThis() TSRMLS_CC); // Not gonna do a retry here on purpose... no reason to retry a mistake in the first place riackstatus = riack_stream_keys_ext(stream_connection->client, &rsbucket, rstype, riak_stream_key_cb, &cb_params, timeout); CHECK_RIACK_STATUS_THROW_ON_ERROR(stream_connection, riackstatus); RFREE(connection->client, rstype); release_connection(stream_connection TSRMLS_CC); }
int main(int argc, char **argv) { int listenfd, c; struct sockaddr_in servaddr; int connfd; struct sockaddr_in cliaddr; char *pidfile_path; int given_pid; pid_t childpid; socklen_t clilen; given_pid = 0; pidfile_path = (char)'\0'; while ((c = getopt( argc, argv, "p:")) != EOF) { switch( c ) { case 'p': pidfile_path = optarg; given_pid = 1; break; } } daemon_init(message(MSG_DAEMON_NAME), SYSLOG_FACILITY); listenfd = socket(AF_INET, SOCK_STREAM, 0); memset((void *) &servaddr, '\0', (size_t) sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(0x7F000001); /*servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");*/ servaddr.sin_port = htons(SERVER_LISTEN_PORT); if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) { say(message(MSG_ERROR_BIND), strerror(errno)); exit(errno); } if (listen(listenfd, MAX_LISTENQ) < 0) { say(message(MSG_ERROR_LISTEN), strerror(errno)); exit(errno); } say("%s", message(MSG_DAEMON_VER)); tv_rcv = (struct timeval *) calloc(1, sizeof(struct timeval)); tv_snd = (struct timeval *) calloc(1, sizeof(struct timeval)); memset(tv_rcv, '\0', sizeof(struct timeval)); memset(tv_snd, '\0', sizeof(struct timeval)); tv_rcv -> tv_sec = 30; tv_rcv -> tv_usec = 0; tv_snd -> tv_sec = 30; tv_snd -> tv_usec = 0; signal(SIGCHLD, sig_child); signal(SIGPIPE, sig_pipe); if(given_pid) { FILE *file = fopen(pidfile_path, "w"); fprintf(file, "%ld", (long)getpid()); fclose(file); } for (;;) { memset((void *) &cliaddr, '\0', sizeof(cliaddr)); clilen = (socklen_t) sizeof(cliaddr); if ((connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen)) < 0) { if (errno == EINTR) { say("%s", message(MSG_ERROR_EINTR)); continue; } else { say(message(MSG_ERROR_ACCEPT), strerror(errno)); exit(errno); } } setsockopt(connfd, SOL_SOCKET, SO_RCVTIMEO, tv_rcv, sizeof(struct timeval)); setsockopt(connfd, SOL_SOCKET, SO_SNDTIMEO, tv_snd, sizeof(struct timeval)); memset(client_ip, '\0', MAX_MSG_SIZE); inet_ntop(AF_INET, &cliaddr.sin_addr, client_ip, MAX_MSG_SIZE); if ( ( childpid = fork() ) == 0) { char *nmb = calloc(50, sizeof(char)); close(listenfd); childpid = getpid(); sprintf(nmb, "%d", childpid); say(message(MSG_START_CHILD), nmb); take_connection(connfd); free(nmb); exit(0); } close(connfd); } closelog(); return (NO_ERROR); }