void XMLHttpRequest::send(ArrayBuffer* ab)
{
	if(curl && ab)
	{
		if(ab->byteLength>0)
		{
			requestDataBuffer.clear();
			requestDataBuffer.resize(ab->byteLength+1);
			memcpy(requestDataBuffer.data(), ab->data, ab->byteLength);
			*(requestDataBuffer.data()+ab->byteLength) = 0;
		}
		curl_send();
		readyState=LOADING;
		tick();
	}
}
Beispiel #2
0
void XMLHttpRequest::send(String data)
{
	if(curl)
	{
		UINT cb = data.size();
		if(cb>0)
		{
			// TODO: convert string to UTF8
			requestDataBuffer.clear();
			requestDataBuffer.resize(cb + 1);
			memcpy(requestDataBuffer.data(), data.c_str(), cb);
			*(requestDataBuffer.data() + cb) = 0;
		}

		curl_send();
		readyState=LOADING;
		tick();
	}
}
void XMLHttpRequest::send(String data)
{
	if(curl)
	{
		/*
		UINT cb = data.size();
		if(cb>0)
		{
			BSTR s = STR_to_BSTR(data);
			cb = SysStringByteLen(s);
			requestDataBuffer.clear();
			requestDataBuffer.resize(cb+1);
			memcpy(requestDataBuffer.data(), s, cb);
			*(requestDataBuffer.data()+cb) = 0;
			SysFreeString(s);
		}
		*/
		curl_send();
		readyState=LOADING;
		tick();
	}
}
int main(int argc, char** argv) {
  if (argc != 2) {
    strncpy(uploads_url, DEFAULT_UPLOADS_URL, MAX_URL_LENGTH);
  } else {
    strncpy(uploads_url, argv[1], MAX_URL_LENGTH);
  }

  openlog("bismark-data-transmit", LOG_PERROR, LOG_USER);

  if (read_bismark_id()) {
    return 1;
  }

  if (initialize_upload_subdirectories() || initialize_upload_directories()) {
    return 1;
  }

  failure_counters = calloc(num_upload_subdirectories,
                            sizeof(failure_counters[0]));
  if (failure_counters == NULL) {
    syslog(LOG_ERR, "main:calloc: %s", strerror(errno));
    return 1;
  }
  if (write_upload_failures_log()) {
    return 1;
  }

  if (initialize_curl()) {
    return 1;
  }

  /* Initialize inotify */
  int inotify_handle = inotify_init();
  if (inotify_handle < 0) {
    syslog(LOG_ERR, "main:inotify_init: %s", strerror(errno));
    return 1;
  }
  int idx;
  watch_descriptors = calloc(num_upload_subdirectories,
                             sizeof(watch_descriptors[0]));
  if (watch_descriptors == NULL) {
    syslog(LOG_ERR, "main:calloc: %s", strerror(errno));
    return 1;
  }
  for (idx = 0; idx < num_upload_subdirectories; ++idx) {
    watch_descriptors[idx] = inotify_add_watch(inotify_handle,
                                               upload_directories[idx],
                                               IN_MOVED_TO);
    if (watch_descriptors[idx] < 0) {
      syslog(LOG_ERR,
             "main:inotify_add_watch(\"%s\"): %s",
             upload_directories[idx],
             strerror(errno));
      return 1;
    }
    syslog(LOG_INFO, "Watching %s", upload_directories[idx]);
  }

  time_t current_time = time(NULL);
  if (current_time < 0) {
    syslog(LOG_ERR, "main:time: %s", strerror(errno));
    return 1;
  }
  time_t last_retry_time = current_time - RETRY_INTERVAL_SECONDS;

  while (1) {
    current_time = time(NULL);
    if (current_time < 0) {
      syslog(LOG_ERR, "main:time: %s", strerror(errno));
      return 1;
    }

    fd_set select_set;
    FD_ZERO(&select_set);
    FD_SET(inotify_handle, &select_set);
    struct timeval select_timeout;
    select_timeout.tv_sec =
        RETRY_INTERVAL_SECONDS - (current_time - last_retry_time);
    if (select_timeout.tv_sec < 0) {
      select_timeout.tv_sec = 0;
    }
    select_timeout.tv_usec = 0;
    int select_result = select(
        inotify_handle + 1, &select_set, NULL, NULL, &select_timeout);
    if (select_result < 0) {
      syslog(LOG_ERR, "main:select: %s", strerror(errno));
      curl_easy_cleanup(curl_handle);
      return 1;
    } else if (select_result > 0) {
      if (FD_ISSET(inotify_handle, &select_set)) {
        char events_buffer[BUF_LEN];
        int length = read(inotify_handle, events_buffer, BUF_LEN);
        if (length < 0) {
          syslog(LOG_ERR, "main:read: %s", strerror(errno));
          curl_easy_cleanup(curl_handle);
          return 1;
        }
        int offset = 0;
        while (offset < length) {
          struct inotify_event* event \
            = (struct inotify_event*)(events_buffer + offset);
          if (event->len && (event->mask & IN_MOVED_TO)) {
            int idx;
            for (idx = 0; idx < num_upload_subdirectories; ++idx) {
              if (event->wd == watch_descriptors[idx]) {
                char absolute_path[PATH_MAX + 1];
                if (join_paths(
                      upload_directories[idx], event->name, absolute_path)) {
                  break;
                }
                syslog(LOG_INFO, "File move detected: %s", absolute_path);
                if (!curl_send(absolute_path, upload_subdirectories[idx])) {
                  if (unlink(absolute_path)) {
                    syslog(LOG_ERR,
                           "main:unlink(\"%s\"): %s",
                           absolute_path,
                           strerror(errno));
                  }
                }
                break;
              }
            }
          }
          offset += sizeof(*event) + event->len;
        }
      }
    } else if (select_result == 0) {
      current_time = time(NULL);
      if (current_time < 0) {
        syslog(LOG_ERR, "main:time: %s", strerror(errno));
        return 1;
      }
      retry_uploads(current_time);
      last_retry_time = time(NULL);
      if (last_retry_time < 0) {
        syslog(LOG_ERR, "main:time: %s", strerror(errno));
        return 1;
      }
    }
  }
  return 0;
}
static void retry_uploads(time_t current_time) {
  upload_list_t files_to_sort;
  upload_list_init(&files_to_sort);
  int new_upload_failure = 0;

  syslog(LOG_INFO, "Checking for uploads to retry");

  int idx;
  for (idx = 0; idx < num_upload_subdirectories; ++idx) {
    DIR* handle = opendir(upload_directories[idx]);
    if (handle == NULL) {
      syslog(LOG_ERR,
          "retry_uploads:opendir(\"%s\"): %s",
          upload_directories[idx],
          strerror(errno));
      continue;
    }
    struct dirent* entry;
    while ((entry = readdir(handle))) {
      char absolute_path[PATH_MAX + 1];
      if (join_paths(upload_directories[idx], entry->d_name, absolute_path)) {
        continue;
      }
      struct stat file_info;
      if (stat(absolute_path, &file_info)) {
        syslog(LOG_ERR,
            "retry_uploads:stat(\"%s\"): %s",
            absolute_path,
            strerror(errno));
        continue;
      }
      if (S_ISREG(file_info.st_mode) || S_ISLNK(file_info.st_mode)) {
        if (current_time - file_info.st_ctime > RETRY_INTERVAL_SECONDS) {
          syslog(LOG_INFO, "Retrying file: %s", absolute_path);
          if (curl_send(absolute_path, upload_subdirectories[idx]) == 0) {
            if (unlink(absolute_path)) {
              syslog(LOG_ERR,
                  "retry_uploads:unlink(\"%s\"): %s",
                  absolute_path,
                  strerror(errno));
            } else {
              continue;
            }
          }
        }

        upload_list_append(&files_to_sort,
            absolute_path,
            file_info.st_ctime,
            file_info.st_blocks,
            idx);
      }
    }
    if (closedir(handle)) {
      syslog(LOG_ERR, "retry_uploads:closedir: %s", strerror(errno));
    }
  }

  if (files_to_sort.entries != NULL) {
    upload_list_sort(&files_to_sort);
    int total_blocks = 0;
    for (idx = 0; idx < files_to_sort.length; ++idx) {
      upload_entry_t* entry = &files_to_sort.entries[idx];
      if (total_blocks + entry->size > MAX_UPLOADS_BLOCKS) {
        syslog(LOG_INFO,
               "Removing old upload: %s",
               files_to_sort.entries[idx].filename);
        if (unlink(files_to_sort.entries[idx].filename)) {
          syslog(LOG_ERR,
                 "retry_uploads:unlink(\"%s\"): %s",
                 files_to_sort.entries[idx].filename,
                 strerror(errno));
        } else {
          log_upload_failure(files_to_sort.entries[idx].index);
          new_upload_failure = 1;
        }
      } else {
        total_blocks += entry->size;
      }
    }
  }
  upload_list_destroy(&files_to_sort);

  if (new_upload_failure) {
    (void)write_upload_failures_log();
  }
}