Ejemplo n.º 1
0
void
eos_shard_writer_v1_write_to_fd (EosShardWriterV1 *self, int fd)
{
  GVariant *variant;

  /* Sort our records to allow for binary searches on retrieval. */
  g_array_sort (self->entries, &compare_records);

  variant = header_entry_variant (self->entries);
  uint64_t header_size = g_variant_get_size (variant);
  header_size = GUINT64_TO_LE (header_size);
  g_variant_unref (variant);

  lseek (fd, ALIGN (sizeof (header_size) + header_size), SEEK_SET);

  int i;
  for (i = 0; i < self->entries->len; i++) {
    struct eos_shard_writer_v1_record_entry *e = &g_array_index (self->entries, struct eos_shard_writer_v1_record_entry, i);

    write_blob (fd, &e->metadata);
    write_blob (fd, &e->data);
  }

  lseek (fd, 0, SEEK_SET);
  g_assert (write (fd, &header_size, sizeof (header_size)) >= 0);
  variant = header_entry_variant (self->entries);
  write_variant (fd, variant);
  g_variant_unref (variant);
}
Ejemplo n.º 2
0
/* This function gets the entry ID corresponding to the message having the
 * specified hash and KSN. If the message is not found, 0 is assigned.
 * This function sets the KMO error string. It returns -1 on failure.
 */
static int get_entry_id_from_hash(sqlite3 *db, kstr *hash, kstr *ksn, int64_t *entry_id) {
    int error = 0;
    sqlite3_stmt *stmt = NULL;
    
    assert(hash->slen == 0 || hash->slen == 20); //FIXME: SHA1 is obsolete, use SHA256.
    assert(ksn->slen == 0 || ksn->slen == 24);
    assert(hash->slen || ksn->slen);
    
    if (sqlite3_prepare(db, "SELECT entry_id FROM mail_eval_res3 WHERE hash = ? AND ksn = ?;", -1, &stmt, NULL)) 
    	goto ERR;

    if (write_blob(stmt, 1, hash)) goto ERR;   
    if (write_blob(stmt, 2, ksn)) goto ERR;
    
    error = sqlite3_step(stmt);
    
    /* No such entry. */
    if (error == SQLITE_DONE) {
    	finalize_stmt(db, &stmt);
	*entry_id = 0;
	return 0;
    }

    if (error != SQLITE_ROW) goto ERR;
    
    *entry_id = sqlite3_column_int64(stmt, 0);
    assert(*entry_id != 0);
    if (sqlite3_step(stmt) != SQLITE_DONE) goto ERR;

    finalize_stmt(db, &stmt);
    return 0;
    
ERR:
    kmo_seterror(sqlite3_errmsg(db));
    finalize_stmt(db, &stmt);
    return -1;
}
Ejemplo n.º 3
0
int main(void)
{
	int err;
	struct isci_orom *isci_orom;

	isci_orom = malloc(sizeof(struct isci_orom));
	memset(isci_orom, 0, sizeof(struct isci_orom));

	set_binary_values(isci_orom);

	err = write_blob(isci_orom);
	if (err < 0) {
		free(isci_orom);
		return err;
	}

	free(isci_orom);
	return 0;
}
Ejemplo n.º 4
0
static void
write_core(pic_state *pic, pic_value obj, pic_value port, struct writer_control *p)
{
  pic_value labels = p->labels;
  int i;

  /* shared objects */
  if (is_shared_object(pic, obj, p)) {
    if (pic_weak_has(pic, labels, obj)) {
      pic_fprintf(pic, port, "#%d#", pic_int(pic, pic_weak_ref(pic, labels, obj)));
      return;
    }
    i = p->cnt++;
    pic_fprintf(pic, port, "#%d=", i);
    pic_weak_set(pic, labels, obj, pic_int_value(pic, i));
  }

  switch (pic_type(pic, obj)) {
  case PIC_TYPE_UNDEF:
    pic_fprintf(pic, port, "#undefined");
    break;
  case PIC_TYPE_NIL:
    pic_fprintf(pic, port, "()");
    break;
  case PIC_TYPE_TRUE:
    pic_fprintf(pic, port, "#t");
    break;
  case PIC_TYPE_FALSE:
    pic_fprintf(pic, port, "#f");
    break;
  case PIC_TYPE_ID:
    pic_fprintf(pic, port, "#<identifier %s>", pic_str(pic, pic_id_name(pic, obj)));
    break;
  case PIC_TYPE_EOF:
    pic_fprintf(pic, port, "#.(eof-object)");
    break;
  case PIC_TYPE_INT:
    pic_fprintf(pic, port, "%d", pic_int(pic, obj));
    break;
  case PIC_TYPE_SYMBOL:
    pic_fprintf(pic, port, "%s", pic_sym(pic, obj));
    break;
  case PIC_TYPE_FLOAT:
    write_float(pic, obj, port);
    break;
  case PIC_TYPE_BLOB:
    write_blob(pic, obj, port);
    break;
  case PIC_TYPE_CHAR:
    write_char(pic, obj, port, p);
    break;
  case PIC_TYPE_STRING:
    write_str(pic, obj, port, p);
    break;
  case PIC_TYPE_PAIR:
    write_pair(pic, obj, port, p);
    break;
  case PIC_TYPE_VECTOR:
    write_vec(pic, obj, port, p);
    break;
  case PIC_TYPE_DICT:
    write_dict(pic, obj, port, p);
    break;
  default:
    pic_fprintf(pic, port, "#<%s %p>", pic_typename(pic, pic_type(pic, obj)), pic_obj_ptr(obj));
    break;
  }

  if (p->op == OP_WRITE) {
    if (is_shared_object(pic, obj, p)) {
      pic_weak_del(pic, labels, obj);
    }
  }
}
Ejemplo n.º 5
0
int main(void)
{
    char const *verbose_var = getenv("D3D4LINUX_VERBOSE");
    if (!verbose_var || *verbose_var != '1')
        dup2(open("/dev/null", O_WRONLY), STDERR_FILENO);

    HMODULE lib = LoadLibrary("d3dcompiler_43.dll");

    /* Ensure stdout is in binary mode */
    setmode(fileno(stdout), O_BINARY);
    setmode(fileno(stdin), O_BINARY);

    int syscall = read_integer();
    int marker = 0;

    if (syscall == D3D4LINUX_COMPILE)
    {
        HRESULT (*compile)(void const *pSrcData, size_t SrcDataSize,
                           char const *pFileName,
                           D3D_SHADER_MACRO const *pDefines,
                           ID3DInclude *pInclude,
                           char const *pEntrypoint, char const *pTarget,
                           uint32_t Flags1, uint32_t Flags2,
                           ID3DBlob **ppCode, ID3DBlob **ppErrorMsgs);
        compile = (decltype(compile))GetProcAddress(lib, "D3DCompile");

        /* This is a D3DCompile() call */
        std::string shader_source = read_string();

        int has_filename = (int)read_integer();
        std::string shader_file;
        if (has_filename)
            shader_file = read_string();

        std::string shader_main = read_string();
        std::string shader_type = read_string();
        uint32_t flags1 = (uint32_t)read_integer();
        uint32_t flags2 = (uint32_t)read_integer();
        marker = (int)read_integer();
        if (marker != D3D4LINUX_FINISHED)
            goto error;

        ID3DBlob *shader_blob = nullptr, *error_blob = nullptr;
        HRESULT ret = compile(shader_source.c_str(), shader_source.size(),
                              shader_file.c_str(),
                              nullptr, /* unimplemented */
                              nullptr, /* unimplemented */
                              shader_main.c_str(),
                              shader_type.c_str(),
                              flags1, flags2, &shader_blob, &error_blob);
        fprintf(stderr, "[D3D4LINUX] D3DCompile([%d bytes], \"%s\", ?, ?, \"%s\", \"%s\", %04x, %04x ) = 0x%08x\n",
                (int)shader_source.size(), has_filename ? shader_file.c_str() : "(nullptr)", shader_main.c_str(), shader_type.c_str(),
                flags1, flags2, (int)ret);

        write_integer(ret);
        write_blob(shader_blob);
        write_blob(error_blob);
        write_integer(D3D4LINUX_FINISHED);

        if (shader_blob)
            shader_blob->Release();
        if (error_blob)
            error_blob->Release();
    }
    else if (syscall == D3D4LINUX_REFLECT)
    {
        HRESULT (*reflect)(void const *pSrcData,
                           size_t SrcDataSize,
                           REFIID pInterface,
                           void **ppReflector);
        reflect = (decltype(reflect))GetProcAddress(lib, "D3DReflect");

        std::vector<uint8_t> *data = read_data();
        int iid_code = read_integer();
        marker = (int)read_integer();
        if (marker != D3D4LINUX_FINISHED)
            goto error;

        char const *iid_name = "";
        IID iid;
        switch (iid_code)
        {
        case D3D4LINUX_IID_SHADER_REFLECTION:
            iid = IID_ID3D11ShaderReflection;
            iid_name = "IID_ID3D11ShaderReflection";
            break;
        default:
            goto error;
        }

        void *object;
        HRESULT ret = reflect(data ? data->data() : nullptr,
                              data ? data->size() : 0,
                              iid, &object);
        fprintf(stderr, "[D3D4LINUX] D3DReflect([%d bytes], %s) = 0x%08x\n",
                data ? (int)data->size() : 0, iid_name, (int)ret);

        write_integer(ret);

        if (iid_code == D3D4LINUX_IID_SHADER_REFLECTION)
        {
            D3D11_SIGNATURE_PARAMETER_DESC param_desc;
            D3D11_SHADER_INPUT_BIND_DESC bind_desc;
            D3D11_SHADER_VARIABLE_DESC variable_desc;
            D3D11_SHADER_BUFFER_DESC buffer_desc;
            D3D11_SHADER_DESC shader_desc;

            ID3D11ShaderReflection *reflector = (ID3D11ShaderReflection *)object;

            /* Serialise D3D11_SHADER_DESC */
            reflector->GetDesc(&shader_desc);
            write_raw(&shader_desc, sizeof(shader_desc));
            write_string(shader_desc.Creator);

            /* Serialize all InputParameterDesc */
            for (uint32_t i = 0; i < shader_desc.InputParameters; ++i)
            {
                reflector->GetInputParameterDesc(i, &param_desc);
                write_raw(&param_desc, sizeof(param_desc));
                write_string(param_desc.SemanticName);
            }

            /* Serialize all OutParameterDesc */
            for (uint32_t i = 0; i < shader_desc.OutputParameters; ++i)
            {
                reflector->GetOutputParameterDesc(i, &param_desc);
                write_raw(&param_desc, sizeof(param_desc));
                write_string(param_desc.SemanticName);
            }

            /* Serialize all ResourceBindingDesc */
            for (uint32_t i = 0; i < shader_desc.BoundResources; ++i)
            {
                reflector->GetResourceBindingDesc(i, &bind_desc);
                write_raw(&bind_desc, sizeof(bind_desc));
                write_string(bind_desc.Name);
            }

            /* Serialize all ConstantBuffer */
            for (uint32_t i = 0; i < shader_desc.ConstantBuffers; ++i)
            {
                ID3D11ShaderReflectionConstantBuffer *cbuffer
                        = reflector->GetConstantBufferByIndex(i);

                /* Serialize D3D11_SHADER_BUFFER_DESC */
                cbuffer->GetDesc(&buffer_desc);
                write_raw(&buffer_desc, sizeof(buffer_desc));
                write_string(buffer_desc.Name);

                /* Serialize all Variable */
                for (uint32_t j = 0; j < buffer_desc.Variables; ++j)
                {
                    ID3D11ShaderReflectionVariable *var
                            = cbuffer->GetVariableByIndex(j);

                    /* Serialize D3D11_SHADER_VARIABLE_DESC */
                    var->GetDesc(&variable_desc);
                    write_raw(&variable_desc, sizeof(variable_desc));
                    write_string(variable_desc.Name);
                    write_integer(variable_desc.DefaultValue ? 1 : 0);
                    if (variable_desc.DefaultValue)
                        write_raw(variable_desc.DefaultValue, variable_desc.Size);
                }
            }
        }

        write_integer(D3D4LINUX_FINISHED);

        delete data;
    }
    else if (syscall == D3D4LINUX_STRIP)
    {
        HRESULT (*strip)(void const *pShaderBytecode,
                         size_t BytecodeLength,
                         uint32_t uStripFlags,
                         ID3DBlob **ppStrippedBlob);
        strip = (decltype(strip))GetProcAddress(lib, "D3DStripShader");

        std::vector<uint8_t> *data = read_data();
        uint32_t flags = (uint32_t)read_integer();
        marker = (int)read_integer();
        if (marker != D3D4LINUX_FINISHED)
            goto error;

        ID3DBlob *strip_blob = nullptr;
        HRESULT ret = strip(data ? data->data() : nullptr,
                            data ? data->size() : 0,
                            flags, &strip_blob);
        fprintf(stderr, "[D3D4LINUX] D3DStripShader([%d bytes], %04x) = 0x%08x\n",
                data ? (int)data->size() : 0, flags, (int)ret);

        write_integer(ret);
        write_blob(strip_blob);
        write_integer(D3D4LINUX_FINISHED);

        if (strip_blob)
            strip_blob->Release();
    }
    else if (syscall == D3D4LINUX_DISASSEMBLE)
    {
        HRESULT (*disas)(void const *pSrcData,
                         size_t SrcDataSize,
                         uint32_t Flags,
                         char const *szComments,
                         ID3DBlob **ppDisassembly);
        disas = (decltype(disas))GetProcAddress(lib, "D3DDisassemble");

        std::vector<uint8_t> *data = read_data();
        uint32_t flags = (uint32_t)read_integer();
        int has_comments = (int)read_integer();
        std::string comments;
        if (has_comments)
            comments = read_string();
        marker = (int)read_integer();
        if (marker != D3D4LINUX_FINISHED)
            goto error;

        ID3DBlob *disas_blob = nullptr;
        HRESULT ret = disas(data ? data->data() : nullptr,
                            data ? data->size() : 0,
                            flags,
                            has_comments ? comments.c_str() : nullptr,
                            &disas_blob);
        fprintf(stderr, "[D3D4LINUX] D3DDisassemble([%d bytes], %04x, %s) = 0x%08x\n",
                data ? (int)data->size() : 0, flags, has_comments ? "[comments]" : "(nullptr)", (int)ret);

        write_integer(ret);
        write_blob(disas_blob);
        write_integer(D3D4LINUX_FINISHED);

        if (disas_blob)
            disas_blob->Release();
    }

    return EXIT_SUCCESS;

error:
    fprintf(stderr, "[D3D4LINUX] Bad message received: %08x %08x\n", syscall, marker);
}
Ejemplo n.º 6
0
/* This function converts the database format from version 3 to version 4.
 * This function sets the KMO error string. It returns -1 on failure.
 */
static int maildb_convert_to_version_4(sqlite3 *db) {
    sqlite3_stmt *stmt1 = NULL;
    sqlite3_stmt *stmt2 = NULL;
    kstr kstr_array[10];
    int k;
    
    for (k = 0; k < 10; k++) kstr_init(kstr_array + k);
    
    begin_transaction(db);
    
    /* Create the new table and update the maildb version. */
    if (sqlite3_exec(db, "CREATE TABLE 'mail_eval_res3' "
                           "("
                           " 'entry_id' INTEGER PRIMARY KEY,"
			   " 'hash' BLOB (20),"
			   " 'ksn' BLOB (24),"
			   " 'status' INTEGER,"

			   " 'display_pref' TINYINT(1),"
			   " 'sig_msg' VARCHAR,"
                           " 'mid' INTEGER(20),"
                           " 'original_packaging' TINYINT(1),"
                           " 'mua' SMALLINT(3),"

                           " 'field_status' INTEGER(2),"
			   " 'att_plugin_nbr' TINYINT(1),"
                           " 'attachment_nbr' TINYINT(1),"
                           " 'attachment_status' BLOB,"

                           " 'sym_key' BLOB,"

                           " 'encryption_status' TINYINT(1),"
                           " 'decryption_error_msg' VARCHAR,"
                           " 'pod_status' TINYINT(1),"
                           " 'pod_msg' VARCHAR,"

                           " 'otut_status' TINYINT(1),"
			   " 'otut_string' BLOB,"
			   " 'otut_msg' VARCHAR,"
			   " 'kpg_addr' VARCHAR,"
			   " 'kpg_port' INTEGER(5)"
                           ");"
                         "UPDATE maildb_version SET version = 4;", NULL, NULL, NULL)) goto ERR;

    /* Transfer the data from mail_eval_res to mail_eval_res2. */
    if (sqlite3_prepare(db, "SELECT entry_id, hash, ksn, status, display_pref, "
			    "sig_msg, mid, original_packaging, mua, field_status, "
	    	    	    "att_plugin_nbr, attachment_nbr, attachment_status, sym_key, encryption_status, "
			    "decryption_error_msg, pod_status, pod_msg, otut_status, otut_string, "
			    "otut_msg FROM mail_eval_res2;", -1, &stmt1, NULL)) goto ERR;
    	    
    while (1) {
    	int i = 0;
	int j = 1;
    	k = 0;
	
    	int res = sqlite3_step(stmt1);
	if (res == SQLITE_DONE) break;
	if (res != SQLITE_ROW) goto ERR;

	if (sqlite3_prepare(db, "INSERT INTO mail_eval_res3 ("
				"entry_id, hash, ksn, status, display_pref, sig_msg, mid, original_packaging, mua, "
				"field_status, att_plugin_nbr, attachment_nbr, attachment_status, sym_key, "
				"encryption_status, decryption_error_msg, pod_status, pod_msg, otut_status, "
				"otut_string, otut_msg, kpg_addr, kpg_port) "
				"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);",
				-1, &stmt2, NULL)) goto ERR;

	if (sqlite3_bind_int64(stmt2, j++, sqlite3_column_int64(stmt1, i++))) goto ERR;

	read_blob(stmt1, &kstr_array[k], i++); if (write_blob(stmt2, j++, &kstr_array[k])) goto ERR; k++;
	read_blob(stmt1, &kstr_array[k], i++); if (write_blob(stmt2, j++, &kstr_array[k])) goto ERR; k++;
	if (sqlite3_bind_int(stmt2, j++, sqlite3_column_int(stmt1, i++))) goto ERR;

	if (sqlite3_bind_int(stmt2, j++, sqlite3_column_int(stmt1, i++))) goto ERR;
	read_string(stmt1, &kstr_array[k], i++); if (write_string(stmt2, j++, &kstr_array[k])) goto ERR;  k++;
    	if (sqlite3_bind_int64(stmt2, j++, sqlite3_column_int64(stmt1, i++))) goto ERR;
	if (sqlite3_bind_int(stmt2, j++, sqlite3_column_int(stmt1, i++))) goto ERR;
	if (sqlite3_bind_int(stmt2, j++, sqlite3_column_int(stmt1, i++))) goto ERR;

	if (sqlite3_bind_int64(stmt2, j++, sqlite3_column_int64(stmt1, i++))) goto ERR;
	if (sqlite3_bind_int64(stmt2, j++, sqlite3_column_int64(stmt1, i++))) goto ERR;
	if (sqlite3_bind_int64(stmt2, j++, sqlite3_column_int64(stmt1, i++))) goto ERR;
    	read_blob(stmt1, &kstr_array[k], i++); if (write_blob(stmt2, j++, &kstr_array[k])) goto ERR;  k++;

	read_blob(stmt1, &kstr_array[k], i++); if (write_blob(stmt2, j++, &kstr_array[k])) goto ERR;  k++;

	if (sqlite3_bind_int(stmt2, j++, sqlite3_column_int(stmt1, i++))) goto ERR;
	read_string(stmt1, &kstr_array[k], i++); if (write_string(stmt2, j++, &kstr_array[k])) goto ERR;  k++;
	if (sqlite3_bind_int(stmt2, j++, sqlite3_column_int(stmt1, i++))) goto ERR;
	read_string(stmt1, &kstr_array[k], i++); if (write_string(stmt2, j++, &kstr_array[k])) goto ERR;  k++;

	if (sqlite3_bind_int(stmt2, j++, sqlite3_column_int(stmt1, i++))) goto ERR;
    	read_blob(stmt1, &kstr_array[k], i++); if (write_blob(stmt2, j++, &kstr_array[k])) goto ERR;  k++;
	read_string(stmt1, &kstr_array[k], i++); if (write_string(stmt2, j++, &kstr_array[k])) goto ERR;  k++;
	
	/* Add KPG address and port. */
	kstr_assign_cstr(&kstr_array[k], ""); if (write_string(stmt2, j++, &kstr_array[k])) goto ERR;  k++;
	if (sqlite3_bind_int(stmt2, j++, 0)) goto ERR;
    	
    	if (sqlite3_step(stmt2) != SQLITE_DONE) goto ERR;
	finalize_stmt(db, &stmt2);
    }

    finalize_stmt(db, &stmt1);

    /* Delete the mail_eval_res table and commit. */
    if (sqlite3_exec(db, "DROP TABLE mail_eval_res2; COMMIT;", NULL, NULL, NULL)) goto ERR;

    /* Success. */
    for (k = 0; k < 10; k++) kstr_free(kstr_array + k);
    finalize_stmt(db, &stmt1);
    finalize_stmt(db, &stmt2);
    return 0;

ERR:
    kmo_seterror(sqlite3_errmsg(db));
    for (k = 0; k < 10; k++) kstr_free(kstr_array + k);
    finalize_stmt(db, &stmt1);
    finalize_stmt(db, &stmt2);
    rollback_transaction(db);
    return -1;
}
Ejemplo n.º 7
0
/* This function creates a mail_eval_res entry.
 * This function sets the KMO error string. It returns -1 on failure.
 */
static int create_mail_eval_res(sqlite3 *db, maildb_mail_info *mail_info, int64_t *entry_id) {
    sqlite3_stmt *stmt = NULL;
    kstr insert_str;
    int i;

    assert(*entry_id >= 0);
    
    /* Create the mail_eval_res entry. */
    kstr_init_cstr(&insert_str, "INSERT INTO mail_eval_res3 (");

    /* If entry_id is not 0, then we must specify the entry_id in the INSERT. */
    if (*entry_id != 0) {
    	kstr_append_cstr(&insert_str, "entry_id, ");
    }

    kstr_append_cstr(&insert_str,
		     "hash, ksn, status, display_pref, sig_msg, mid, original_packaging, mua, field_status, "
		     "att_plugin_nbr, attachment_nbr, attachment_status, sym_key, encryption_status, "
		     "decryption_error_msg, pod_status, pod_msg, otut_status, otut_string, "
		     "otut_msg, kpg_addr, kpg_port) "
		     "VALUES (");

    if (*entry_id != 0) {
    	kstr_append_cstr(&insert_str, "?, ");
    }

    kstr_append_cstr(&insert_str, "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
    if (sqlite3_prepare(db, insert_str.data, -1, &stmt, NULL)) goto ERR;
    
    i = 1;
    
    if (*entry_id != 0) {
    	if (sqlite3_bind_int64(stmt, i++, *entry_id)) goto ERR;
    }
    
    if (write_blob(stmt, i++, &mail_info->hash)) goto ERR;
    if (write_blob(stmt, i++, &mail_info->ksn)) goto ERR;
    if (sqlite3_bind_int(stmt, i++, mail_info->status)) goto ERR;
    
    if (sqlite3_bind_int(stmt, i++, mail_info->display_pref)) goto ERR;
    if (write_string(stmt, i++, &mail_info->sig_msg)) goto ERR;
    if (sqlite3_bind_int64(stmt, i++, mail_info->mid)) goto ERR;
    if (sqlite3_bind_int(stmt, i++, mail_info->original_packaging)) goto ERR;
    if (sqlite3_bind_int(stmt, i++, mail_info->mua)) goto ERR;

    if (sqlite3_bind_int(stmt, i++, mail_info->field_status)) goto ERR;
    if (sqlite3_bind_int(stmt, i++, mail_info->att_plugin_nbr)) goto ERR;
    if (sqlite3_bind_int(stmt, i++, mail_info->attachment_nbr)) goto ERR;
    if (write_blob(stmt, i++, &mail_info->attachment_status)) goto ERR;

    if (write_blob(stmt, i++, &mail_info->sym_key)) goto ERR;

    if (sqlite3_bind_int(stmt, i++, mail_info->encryption_status)) goto ERR;
    if (write_string(stmt, i++, &mail_info->decryption_error_msg)) goto ERR;
    if (sqlite3_bind_int(stmt, i++, mail_info->pod_status)) goto ERR;
    if (write_string(stmt, i++, &mail_info->pod_msg)) goto ERR;

    if (sqlite3_bind_int(stmt, i++, mail_info->otut_status)) goto ERR;
    if (write_blob(stmt, i++, &mail_info->otut_string)) goto ERR;
    if (write_string(stmt, i++, &mail_info->otut_msg)) goto ERR;
    if (write_string(stmt, i++, &mail_info->kpg_addr)) goto ERR;
    if (sqlite3_bind_int(stmt, i++, mail_info->kpg_port)) goto ERR;
    
    if (sqlite3_step(stmt) != SQLITE_DONE) goto ERR;
    finalize_stmt(db, &stmt);
    
    /* Obtain/validate the entry ID. */
    if (*entry_id == 0) {
    	*entry_id = sqlite3_last_insert_rowid(db);
    }
    
    else {
    	assert(*entry_id == sqlite3_last_insert_rowid(db));
    }
    
    kstr_free(&insert_str);
    return 0;
    
ERR:
    kmo_seterror(sqlite3_errmsg(db));
    finalize_stmt(db, &stmt);
    kstr_free(&insert_str);
    return -1;
}
Ejemplo n.º 8
0
void transform(int deviceNumber, int levels, unsigned w, unsigned h, unsigned bits)
{
    uint64_t cbinput=uint64_t(w)*bits/8;
    
    
    std::vector<uint64_t> input(2*(cbinput/8));
    std::vector<uint64_t> output(2*(cbinput/8));
    
    std::vector<uint32_t> unpackedInput(2*(cbinput/4));
    std::vector<uint32_t> unpackedOutput(2*(cbinput/4));
    
    uint64_t* inputWriteptr = &input[0];
    uint64_t* inputReadptr = &input[cbinput/8];
    
    uint32_t* unpackedInputReadptr = &unpackedInput[cbinput/4];
    uint32_t* unpackedInputWriteptr = &unpackedInput[0];

    uint32_t* unpackedOutputReadptr = &unpackedOutput[cbinput/4];
    uint32_t* unpackedOutputWriteptr = &unpackedOutput[0];
    
    uint64_t* outputWriteptr = &output[0];
    uint64_t* outputReadptr = &output[cbinput/8];
    
    std::vector<uint32_t> gpuReadOffsets(2*levels+1,0);
    std::vector<uint32_t> gpuWriteOffsets(2*levels+1,0);
    
    std::vector<uint32_t> aboveOverrides(2*levels,0);
    std::vector<uint32_t> belowOverrides(2*levels,0);
    
    int j=0;
    
    for (int i=0; i<2*levels+1; i++)
    {
        gpuWriteOffsets[i] = j;
        
        j+= 2;
        j = j - (4 & -(j >= 4));
        j = j + (4 & -(j < 0));
        
        gpuReadOffsets[i] = j;
    }
    
    auto cl_instance = init_cl(levels,w,h,bits,"pipeline_kernels.cl",deviceNumber);
    
    tbb::task_group group;
    
    bool finished = false;
    
    int fullness = 0;
    
    bool full = false;
    
    int tailEnd = 4*levels+5;
    
    int image_line = 0;
    
    while(1){
        
        for (int i=0; i<levels; i++) {
            if (image_line == 4 + 2*i) aboveOverrides[i] = 0x0 ^ -(levels < 0);
            else aboveOverrides[i] = 0xFFFFFFFF ^ -(levels < 0);
            
            if (image_line == 3 + 2*i) belowOverrides[i] = 0x0 ^ -(levels < 0);
            else belowOverrides[i] = 0xFFFFFFFF ^ -(levels < 0);
        }
        for (int i=levels; i<2*levels; i++) {
            if (image_line == 4 + 2*i) aboveOverrides[i] = 0xFFFFFFFF ^ -(levels < 0);
            else aboveOverrides[i] = 0x0 ^ -(levels < 0);
            
            if (image_line == 3 + 2*i) belowOverrides[i] = 0xFFFFFFFF ^ -(levels < 0);
            else belowOverrides[i] = 0x0 ^ -(levels < 0);
        }
        
        group.run([&](){
            if(!finished && !read_blob(STDIN_FILENO, cbinput, inputWriteptr)) finished = true;
            
            unpack_blob_32(cbinput, inputReadptr, unpackedInputWriteptr);
            
            pack_blob_32(cbinput, unpackedOutputReadptr, outputWriteptr);
            
            if (fullness >= 4*levels+6 || full)
            {
                full = true;
                write_blob(STDOUT_FILENO, cbinput, outputReadptr);
            }
            else
            {
                fullness++;
            }
        });
        
        group.run([&](){
            process_opencl_packed_line(levels, w, bits, gpuReadOffsets, gpuWriteOffsets, unpackedInputReadptr, unpackedOutputWriteptr, aboveOverrides, belowOverrides, cl_instance);
            
            for (int i=0; i<2*levels+1; i++)
            {
                int j = gpuWriteOffsets[i];
                
                j++;
                j = j - (4 & -(j >= 4));
                
                gpuWriteOffsets[i] = j;
                
                j = gpuReadOffsets[i];
                
                j++;
                j = j - (4 & -(j >= 4));
                
                gpuReadOffsets[i] = j;
            }
        });
        
        group.wait();
        
        if (tailEnd == 0) {
            break;
        }
        if (finished) tailEnd--;
        
        std::swap(inputReadptr, inputWriteptr);
        std::swap(unpackedInputReadptr, unpackedInputWriteptr);
        std::swap(unpackedOutputReadptr, unpackedOutputWriteptr);
        std::swap(outputReadptr, outputWriteptr);
        
        image_line++;
        if (image_line == h) image_line = 0;
    }
}
Ejemplo n.º 9
0
static int
write_exif( Write *write )
{
#ifdef HAVE_EXIF
	unsigned char *data;
	size_t data_length;
	unsigned int idl;
	ExifData *ed;

	/* Either parse from the embedded EXIF, or if there's none, make
	 * some fresh EXIF we can write the resolution to.
	 */
	if( vips_image_get_typeof( write->in, VIPS_META_EXIF_NAME ) ) {
		if( vips_image_get_blob( write->in, VIPS_META_EXIF_NAME, 
			(void *) &data, &data_length ) )
			return( -1 );

		if( !(ed = exif_data_new_from_data( data, data_length )) )
			return( -1 );
	}
	else  {
		ed = exif_data_new();

		exif_data_set_option( ed, 
			EXIF_DATA_OPTION_FOLLOW_SPECIFICATION );
		exif_data_set_data_type( ed, EXIF_DATA_TYPE_COMPRESSED );
		exif_data_set_byte_order( ed, EXIF_BYTE_ORDER_INTEL );
	
		/* Create the mandatory EXIF fields with default data.
		 */
		exif_data_fix( ed );
	}

	/* Update EXIF tags from the image metadata.
	 */
	vips_exif_update( ed, write->in );

	/* Update EXIF resolution from the vips image header.
	 */
	if( vips__set_exif_resolution( ed, write->in ) ) {
		exif_data_free( ed );
		return( -1 );
	}

	/* Update EXIF image dimensions from the vips image header.
	 */
	if( set_exif_dimensions( ed, write->in ) ) {
		exif_data_free( ed );
		return( -1 );
	}

	/* Update EXIF orientation from the vips image header.
	 */
	if( set_exif_orientation( ed, write->in ) ) {
		exif_data_free( ed );
		return( -1 );
	}

	/* Reserialise and write. exif_data_save_data() returns an int for some
	 * reason.
	 */
	exif_data_save_data( ed, &data, &idl );
	if( !idl ) {
		vips_error( "VipsJpeg", "%s", _( "error saving EXIF" ) );
		exif_data_free( ed );
		return( -1 );
	}
	data_length = idl;

#ifdef DEBUG
	printf( "write_exif: attaching %zd bytes of EXIF\n", data_length  );
#endif /*DEBUG*/

	exif_data_free( ed );
	jpeg_write_marker( &write->cinfo, JPEG_APP0 + 1, data, data_length );
	free( data );
#else /*!HAVE_EXIF*/
	/* No libexif ... just copy the embedded EXIF over.
	 */
	if( write_blob( write, VIPS_META_EXIF_NAME, JPEG_APP0 + 1 ) )
		return( -1 );
#endif /*!HAVE_EXIF*/

	return( 0 );
}
Ejemplo n.º 10
0
/* Write a VIPS image to a JPEG compress struct.
 */
static int
write_vips( Write *write, int qfac, const char *profile, 
	gboolean optimize_coding, gboolean progressive, gboolean strip, 
	gboolean no_subsample, gboolean trellis_quant,
	gboolean overshoot_deringing, gboolean optimize_scans, int quant_table )
{
	VipsImage *in;
	J_COLOR_SPACE space;

	/* The image we'll be writing ... can change, see CMYK.
	 */
	in = write->in;

	/* Should have been converted for save.
	 */
        g_assert( in->BandFmt == VIPS_FORMAT_UCHAR );
	g_assert( in->Coding == VIPS_CODING_NONE );
        g_assert( in->Bands == 1 || 
		in->Bands == 3 || 
		in->Bands == 4 );

        /* Check input image.
         */
	if( vips_image_pio_input( in ) )
		return( -1 );

	/* Set compression parameters.
	 */
        write->cinfo.image_width = in->Xsize;
        write->cinfo.image_height = in->Ysize;
	write->cinfo.input_components = in->Bands;
	if( in->Bands == 4 && 
		in->Type == VIPS_INTERPRETATION_CMYK ) {
		space = JCS_CMYK;
		/* IJG always sets an Adobe marker, so we should invert CMYK.
		 */
		if( vips_invert( in, &write->inverted, NULL ) ) 
			return( -1 );
		in = write->inverted;
	}
	else if( in->Bands == 3 )
		space = JCS_RGB;
	else if( in->Bands == 1 )
		space = JCS_GRAYSCALE;
	else 
		/* Use luminance compression for all channels.
		 */
		space = JCS_UNKNOWN;
	write->cinfo.in_color_space = space; 

	/* Build VIPS output stuff now we know the image we'll be writing.
	 */
	if( !(write->row_pointer = VIPS_ARRAY( NULL, in->Ysize, JSAMPROW )) )
		return( -1 );

#ifdef HAVE_JPEG_EXT_PARAMS
	/* Reset compression profile to libjpeg defaults
	 */
	if( jpeg_c_int_param_supported( &write->cinfo, JINT_COMPRESS_PROFILE ) )
		jpeg_c_set_int_param( &write->cinfo, 
			JINT_COMPRESS_PROFILE, JCP_FASTEST );
#endif

	/* Reset to default.
	 */
        jpeg_set_defaults( &write->cinfo );

 	/* Compute optimal Huffman coding tables.
	 */
	write->cinfo.optimize_coding = optimize_coding;

#ifdef HAVE_JPEG_EXT_PARAMS
	/* Apply trellis quantisation to each 8x8 block. Implies 
	 * "optimize_coding".
	 */
	if( trellis_quant ) {
		if( jpeg_c_bool_param_supported( &write->cinfo, 
			JBOOLEAN_TRELLIS_QUANT ) ) {
			jpeg_c_set_bool_param( &write->cinfo,
				JBOOLEAN_TRELLIS_QUANT, TRUE );
			write->cinfo.optimize_coding = TRUE;
		}
		else 
			vips_warn( "vips2jpeg", 
				"%s", _( "trellis_quant unsupported" ) );
	}

	/* Apply overshooting to samples with extreme values e.g. 0 & 255 
	 * for 8-bit.
	 */
	if( overshoot_deringing ) {
		if( jpeg_c_bool_param_supported( &write->cinfo, 
			JBOOLEAN_OVERSHOOT_DERINGING ) ) 
			jpeg_c_set_bool_param( &write->cinfo,
				JBOOLEAN_OVERSHOOT_DERINGING, TRUE );
		else 
			vips_warn( "vips2jpeg", 
				"%s", _( "overshoot_deringing unsupported" ) );
	}
	/* Split the spectrum of DCT coefficients into separate scans.
	 * Requires progressive output. Must be set before 
	 * jpeg_simple_progression.
	 */
	if( optimize_scans ) {
		if( progressive ) {
			if( jpeg_c_bool_param_supported( &write->cinfo, 
				JBOOLEAN_OPTIMIZE_SCANS ) ) 
				jpeg_c_set_bool_param( &write->cinfo, 
					JBOOLEAN_OPTIMIZE_SCANS, TRUE );
			else 
				vips_warn( "vips2jpeg", 
					"%s", _( "Ignoring optimize_scans" ) );
		}
		else 
			vips_warn( "vips2jpeg", "%s",
				_( "Ignoring optimize_scans for baseline" ) );
	}

	/* Use predefined quantization table.
	 */
	if( quant_table > 0 ) {
		if( jpeg_c_int_param_supported( &write->cinfo,
			JINT_BASE_QUANT_TBL_IDX ) )
			jpeg_c_set_int_param( &write->cinfo,
				JINT_BASE_QUANT_TBL_IDX, quant_table );
		else
			vips_warn( "vips2jpeg",
				"%s", _( "Setting quant_table unsupported" ) );
	}
#else
	/* Using jpeglib.h without extension parameters, warn of ignored 
	 * options.
	 */
	if( trellis_quant ) 
		vips_warn( "vips2jpeg", "%s", _( "Ignoring trellis_quant" ) );
	if( overshoot_deringing ) 
		vips_warn( "vips2jpeg", 
			"%s", _( "Ignoring overshoot_deringing" ) );
	if( optimize_scans ) 
		vips_warn( "vips2jpeg", "%s", _( "Ignoring optimize_scans" ) );
	if( quant_table > 0 )
		vips_warn( "vips2jpeg", "%s", _( "Ignoring quant_table" ) );
#endif

	/* Set compression quality. Must be called after setting params above.
	 */
        jpeg_set_quality( &write->cinfo, qfac, TRUE );

	/* Enable progressive write.
	 */
	if( progressive ) 
		jpeg_simple_progression( &write->cinfo ); 

	/* Turn off chroma subsampling. Follow IM and do it automatically for
	 * high Q. 
	 */
	if( no_subsample ||
		qfac > 90 ) { 
		int i;

		for( i = 0; i < in->Bands; i++ ) { 
			write->cinfo.comp_info[i].h_samp_factor = 1;
			write->cinfo.comp_info[i].v_samp_factor = 1;
		}
	}

	/* Don't write the APP0 JFIF headers if we are stripping.
	 */
	if( strip ) 
		write->cinfo.write_JFIF_header = FALSE;

	/* Build compress tables.
	 */
	jpeg_start_compress( &write->cinfo, TRUE );

	/* Write any APP markers we need.
	 */
	if( !strip ) { 
		if( write_exif( write ) ||
			write_blob( write, 
				VIPS_META_XMP_NAME, JPEG_APP0 + 1 ) ||
			write_blob( write, 
				VIPS_META_IPCT_NAME, JPEG_APP0 + 13 ) )
			return( -1 );

		/* A profile supplied as an argument overrides an embedded 
		 * profile. "none" means don't attach a profile.
		 */
		if( profile && 
			strcmp( profile, "none" ) != 0 &&
			write_profile_file( write, profile ) )
			return( -1 );
		if( !profile && 
			vips_image_get_typeof( in, VIPS_META_ICC_NAME ) && 
			write_profile_meta( write ) )
			return( -1 );
	}

	/* Write data. Note that the write function grabs the longjmp()!
	 */
	if( vips_sink_disc( in, write_jpeg_block, write ) )
		return( -1 );

	/* We have to reinstate the setjmp() before we jpeg_finish_compress().
	 */
	if( setjmp( write->eman.jmp ) ) 
		return( -1 );

	jpeg_finish_compress( &write->cinfo );

	return( 0 );
}