30 #define TEST_HANG_TIMEOUT 60 * 1000 52 fprintf(stderr,
"Remove socket fd %d\n", (
int) fd);
54 for(i = 0; i < sockets->
count; ++
i) {
56 if(i < sockets->
count - 1)
73 fprintf(stderr,
"Add socket fd %d for %s\n", (
int) fd, what);
106 void *userp,
void *socketp)
114 addFd(&sockets->read, s,
"read");
135 if(timeout_ms != -1) {
137 timeout->
tv_usec += timeout_ms * 1000;
163 fprintf(stderr,
"Got an unexpected message from curl: %i\n",
192 for(i = 0; i < sockets->
count; ++
i) {
193 FD_SET(sockets->
sockets[i], fdset);
194 if(*maxFd < sockets->sockets[i] + 1) {
206 fprintf(stderr,
"Curl error on %s: %i (%s)\n",
215 int evBitmask,
const char *
name)
218 for(i = 0; i < sockets->
count; ++
i) {
219 if(FD_ISSET(sockets->
sockets[i], fdset)) {
234 struct timeval timeout = {-1, 0};
240 fprintf(stderr,
"Usage: lib582 [url] [filename] [username]\n");
246 fprintf(stderr,
"fopen() failed with error: %d (%s)\n",
247 errno, strerror(errno));
253 hd = fstat(
fileno(hd_src), &file_info);
256 fprintf(stderr,
"fstat() failed with error: %d (%s)\n",
257 errno, strerror(errno));
262 fprintf(stderr,
"Set to upload %d bytes\n", (
int)file_info.st_size);
285 easy_setopt(curl, CURLOPT_SSH_PUBLIC_KEYFILE,
"curl_client_key.pub");
286 easy_setopt(curl, CURLOPT_SSH_PRIVATE_KEYFILE,
"curl_client_key");
301 fd_set readSet, writeSet;
310 if(timeout.
tv_sec != -1) {
312 tv.
tv_sec = usTimeout / 1000000;
313 tv.
tv_usec = usTimeout % 1000000;
315 else if(maxFd <= 0) {
320 select_test((
int)maxFd, &readSet, &writeSet, NULL, &tv);
335 fprintf(stderr,
"Error uploading file.\n");
352 free(sockets.read.sockets);
#define select_test(A, B, C, D, E)
static int curlSocketCallback(CURL *easy, curl_socket_t s, int action, void *userp, void *socketp)
Callback invoked by curl to poll reading / writing of a socket.
#define res_global_init(A)
static void updateFdSet(struct Sockets *sockets, fd_set *fdset, curl_socket_t *maxFd)
Update a fd_set with all of the sockets in use.
static void addFd(struct Sockets *sockets, curl_socket_t fd, const char *what)
Add a file descriptor to a sockets array.
#define easy_setopt(A, B, C)
#define multi_add_handle(A, B)
struct Sockets read write
#define realloc(ptr, size)
CURL_EXTERN const char * curl_multi_strerror(CURLMcode)
UNITTEST_START int result
#define abort_on_test_timeout()
#define TEST_ERR_MAJOR_BAD
#define multi_setopt(A, B, C)
CURL_EXTERN void curl_easy_cleanup(CURL *curl)
CURL_TYPEOF_CURL_OFF_T curl_off_t
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *curl_handle)
static void removeFd(struct Sockets *sockets, curl_socket_t fd, int mention)
Remove a file descriptor from a sockets array.
static int curlTimerCallback(CURLM *multi, long timeout_ms, void *userp)
Callback invoked by curl to set a timeout.
#define CURL_SOCKET_TIMEOUT
int curlx_sztosi(ssize_t sznum)
CURL_EXTERN CURLMsg * curl_multi_info_read(CURLM *multi_handle, int *msgs_in_queue)
static int getMicroSecondTimeout(struct timeval *timeout)
static CURL * easy[MAX_EASY_HANDLES]
CURL_EXTERN void curl_global_cleanup(void)
curl_global_cleanup() globally cleanups curl, uses the value of "init_flags" to determine what needs ...
static void notifyCurl(CURLM *curl, curl_socket_t s, int evBitmask, const char *info)
static int checkForCompletion(CURLM *curl, int *success)
Check for curl completion.
#define start_test_timing()
static void checkFdSet(CURLM *curl, struct Sockets *sockets, fd_set *fdset, int evBitmask, const char *name)
Invoke curl when a file descriptor is set.
CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle, curl_socket_t s, int ev_bitmask, int *running_handles)
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle)
struct timeval tutil_tvnow(void)