int nf10_reg_wr(uint32_t addr, uint32_t val) { struct nl_msg *msg; int err; err = driver_connect(); if(err) return err; msg = nlmsg_alloc(); if(msg == NULL) { driver_disconnect(); return -NLE_NOMEM; } /* genlmsg_put will fill in the fields of the nlmsghdr and the genlmsghdr. */ genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, nf10_genl_family, 0, 0, NF10_GENL_C_REG_WR, NF10_GENL_FAMILY_VERSION); nla_put_u32(msg, NF10_GENL_A_ADDR32, addr); nla_put_u32(msg, NF10_GENL_A_REGVAL32, val); /* nl_send_auto will automatically fill in the PID and the sequence number, * and also add an NLM_F_REQUEST flag. It will also add an NLM_F_ACK * flag unless the netlink socket has the NL_NO_AUTO_ACK flag set. */ err = nl_send_auto(nf10_genl_sock, msg); if(err < 0) { nlmsg_free(msg); driver_disconnect(); return err; } nlmsg_free(msg); nl_socket_modify_cb(nf10_genl_sock, NL_CB_ACK, NL_CB_CUSTOM, nf10_reg_wr_recv_ack_cb, NULL); /* FIXME: this function will return even if there's no ACK in the buffer. I.E. it doesn't * seem to wait for the ACK to be received... Ideally we'd have the behavior that getting an * ACK tells us everything is OK, otherwise we time out on waiting for an ACK and tell this * to the user. */ err = nl_recvmsgs_default(nf10_genl_sock); driver_disconnect(); return err; }
int nf10_reg_rd(uint32_t addr, uint32_t *val_ptr) { struct nl_msg *msg; int err; err = driver_connect(); if(err) return err; msg = nlmsg_alloc(); if(msg == NULL) { driver_disconnect(); return -NLE_NOMEM; } /* genlmsg_put will fill in the fields of the nlmsghdr and the genlmsghdr. */ genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, nf10_genl_family, 0, 0, NF10_GENL_C_REG_RD, NF10_GENL_FAMILY_VERSION); nla_put_u32(msg, NF10_GENL_A_ADDR32, addr); /* nl_send_auto will automatically fill in the PID and the sequence number, * and also add an NLM_F_REQUEST flag. It will also add an NLM_F_ACK * flag unless the netlink socket has the NL_NO_AUTO_ACK flag set. */ err = nl_send_auto(nf10_genl_sock, msg); if(err < 0) { nlmsg_free(msg); driver_disconnect(); return err; } nlmsg_free(msg); nl_socket_modify_cb(nf10_genl_sock, NL_CB_VALID, NL_CB_CUSTOM, nf10_reg_rd_recv_msg_cb, (void*)val_ptr); err = nl_recvmsgs_default(nf10_genl_sock); driver_disconnect(); return err; }
int main(int argc, char *argv[]) { char tmp[1024]; if (odbc_read_login_info()) exit(1); /* try setting db name before connect */ printf("SQLConnect before 1..\n"); init_connect(); set_dbname("master"); normal_connect(); check_dbname("master"); /* check change after connection */ printf("SQLConnect after..\n"); set_dbname("tempdb"); check_dbname("tempdb"); printf("SQLConnect after not existing..\n"); strcpy(tmp, "IDontExist"); CHKSetConnectAttr(SQL_ATTR_CURRENT_CATALOG, (SQLPOINTER) tmp, strlen(tmp), "E"); check_dbname("tempdb"); odbc_disconnect(); /* try setting db name before connect */ printf("SQLConnect before 2..\n"); init_connect(); set_dbname("tempdb"); normal_connect(); check_dbname("tempdb"); odbc_disconnect(); /* try connect string with using DSN */ printf("SQLDriverConnect before 1..\n"); sprintf(tmp, "DSN=%s;UID=%s;PWD=%s;DATABASE=%s;", odbc_server, odbc_user, odbc_password, odbc_database); init_connect(); set_dbname("master"); driver_connect(tmp); check_dbname(odbc_database); odbc_disconnect(); /* try connect string with using DSN */ printf("SQLDriverConnect before 2..\n"); sprintf(tmp, "DSN=%s;UID=%s;PWD=%s;", odbc_server, odbc_user, odbc_password); init_connect(); set_dbname("tempdb"); driver_connect(tmp); check_dbname("tempdb"); odbc_disconnect(); if (failed) { printf("Some tests failed\n"); return 1; } printf("Done.\n"); return 0; }