void *thread_send(void *data) { int sock, fds[3], pipe_fds[2] = {-1, -1}; ssize_t len; sock = connect_unix_sock(sockpath); if (sock < 0) { fail("Unable to connect to unix socket at %s", sockpath); goto error; } if (pipe(pipe_fds) < 0) { fail("Unable to create pipe"); goto error; } /* First send regular data. */ len = send_unix_sock(sock, "hello", 4); if (len < 0) { fail("Sending regular data."); goto error; } /* * We are going to pass 3 fds, two of them are pipse in position 0 and 2 * and the inet socket is at position 1. */ fds[0] = pipe_fds[0]; fds[1] = *((int *)data); fds[2] = pipe_fds[1]; len = send_fds_unix_sock(sock, fds, 3); if (len < 0) { fail("Send inet socket through Unix sock"); goto error; } OK(len == 1, "Inet socket %d sent successfully.", fds[1]); error: if (sock >= 0) { close(sock); } if (pipe_fds[0] >= 0) { close(pipe_fds[0]); } if (pipe_fds[1] >= 0) { close(pipe_fds[1]); } return NULL; }
int main(int argc, char** argv) { int c; char* sock_name; int sock_type; int s; struct binrpc_cmd cmd; struct id_list* sock_id; char* format; char* line; char* l; quit=0; format=0; line=0; s=-1; sock_name=0; sock_type=UNIXS_SOCK; opterr=0; while((c=getopt(argc, argv, "UVhs:D:R:vf:"))!=-1){ switch(c){ case 'V': printf("version: %s\n", version); printf("%s compiled on %s \n", __FILE__, compiled); exit(0); break; case 'h': printf("version: %s\n", version); printf("%s", help_msg); exit(0); break; case 's': sock_name=optarg; break; case 'R': reply_socket=optarg; break; case 'D': sock_dir=optarg; break; case 'U': sock_type=UDP_SOCK; break; case 'v': verbose++; break; case 'f': format=str_escape(optarg); if (format==0){ fprintf(stderr, "ERROR: memory allocation failure\n"); goto error; } break; case '?': if (isprint(optopt)) fprintf(stderr, "Unknown option `-%c'.\n", optopt); else fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt); goto error; case ':': fprintf(stderr, "Option `-%c' requires an argument.\n", optopt); goto error; default: abort(); } } if (sock_name==0){ sock_name=DEFAULT_CTL_SOCKET; } /* init the random number generator */ srand(getpid()+time(0)); /* we don't need very strong random numbers */ if (sock_name==0){ fprintf(stderr, "ERROR: no server socket address specified\n"); goto error; } sock_id=parse_listen_id(sock_name, strlen(sock_name), sock_type); if (sock_id==0){ fprintf(stderr, "ERROR: error parsing server socket address %s\n", sock_name); goto error; } switch(sock_id->proto){ case UDP_SOCK: case TCP_SOCK: if (sock_id->port==0){ sock_id->port=DEFAULT_CTL_PORT; /* fprintf(stderr, "ERROR: no port specified: %s:<port>\n", sock_name); goto error; */ } if ((s=connect_tcpudp_socket(sock_id->name, sock_id->port, (sock_id->proto==UDP_SOCK)?SOCK_DGRAM: SOCK_STREAM))<0){ goto error; } break; case UNIXS_SOCK: case UNIXD_SOCK: if ((s=connect_unix_sock(sock_id->name, (sock_id->proto==UNIXD_SOCK)?SOCK_DGRAM: SOCK_STREAM))<0) goto error; break; case UNKNOWN_SOCK: fprintf(stderr, "ERROR: Bad socket type for %s\n", sock_name); goto error; } free(sock_id); /* not needed anymore */ sock_id=0; if (optind>=argc){ /*fprintf(stderr, "ERROR: no command specified\n"); goto error; */ }else{ if (parse_cmd(&cmd, &argv[optind], argc-optind)<0) goto error; if (run_cmd(s, &cmd, format)<0) goto error; goto end; } /* interactive mode */ if (get_kamcmd_list(s)==0){ #ifdef USE_CFG_VARS get_cfgvars_list(s); #endif /* USE_CFG_VARS */ #ifdef USE_COUNTERS get_counters_list(s); #endif /* USE_COUNTERS */ } /* banners */ printf("%s %s\n", NAME, VERSION); printf("%s\n", COPYRIGHT); printf("%s\n", DISCLAIMER); #ifdef USE_READLINE /* initialize readline */ /* allow conditional parsing of the ~/.inputrc file*/ rl_readline_name=NAME; rl_completion_entry_function=kamcmd_generator; rl_attempted_completion_function=kamcmd_completion; while(!quit){ line=readline(NAME "> "); if (line==0) /* EOF */ break; l=trim_ws(line); /* trim whitespace */ if (*l){ add_history(l); run_line(s, l, format); } free(line); line=0; } #else line=malloc(MAX_LINE_SIZE); if (line==0){ fprintf(stderr, "memory allocation error\n"); goto error; } printf(NAME "> "); fflush(stdout); /* prompt */ while(!quit && fgets(line, MAX_LINE_SIZE, stdin)){ l=trim_ws(line); if (*l){ run_line(s, l, format); } printf(NAME "> "); fflush(stdout); /* prompt */ }; free(line); line=0; #endif /* USE_READLINE */ end: /* normal exit */ if (line) free(line); if (format) free(format); if (rpc_array) free_rpc_array(rpc_array, rpc_no); #ifdef USE_CFG_VARS if (cfg_grp_lst) free_cfg_grp_lst(); if (cfg_vars_array){ free_rpc_array(cfg_vars_array, cfg_vars_no); cfg_vars_array=0; cfg_vars_no=0; } #endif /* USE_CFG_VARS */ #ifdef USE_COUNTERS if (cnt_grp_lst) free_cnt_grp_lst(); if (cnt_grps_array){ free_rpc_array(cnt_grps_array, cnt_grps_no); cnt_grps_array=0; cnt_grps_no=0; } #endif /* USE_COUNTERS */ cleanup(); exit(0); error: if (line) free(line); if (format) free(format); if (rpc_array) free_rpc_array(rpc_array, rpc_no); #ifdef USE_CFG_VARS if (cfg_grp_lst) free_cfg_grp_lst(); if (cfg_vars_array){ free_rpc_array(cfg_vars_array, cfg_vars_no); cfg_vars_array=0; cfg_vars_no=0; } #endif /* USE_CFG_VARS */ #ifdef USE_COUNTERS if (cnt_grp_lst) free_cnt_grp_lst(); if (cnt_grps_array){ free_rpc_array(cnt_grps_array, cnt_grps_no); cnt_grps_array=0; cnt_grps_no=0; } #endif /* USE_COUNTERS */ cleanup(); exit(-1); }
int binrpc_open_connection(struct binrpc_handle* handle, char* name, int port, int proto, char* reply_socket, char* sock_dir) { struct sockaddr_un mysun; binrpc_last_errs[0] = '\0'; binrpc_last_errs[sizeof(binrpc_last_errs)-1] = '\0'; /* snprintf safe terminator */ handle->socket = -1; handle->buf = NULL; mysun.sun_path[0] = '\0'; /* init the random number generator */ srand(getpid()+time(0)); /* we don't need very strong random numbers */ if (name == NULL) { snprintf(binrpc_last_errs, sizeof(binrpc_last_errs)-1, "open_connection: invalid IP address or socket name"); goto error; } handle->proto = proto; switch(proto) { case UDP_SOCK: case TCP_SOCK: if (port == 0) { port=DEFAULT_CTL_PORT; } handle->sock_type = (proto == UDP_SOCK) ? SOCK_DGRAM : SOCK_STREAM; if ((handle->socket = connect_tcpudp_socket(name, port, handle->sock_type)) < 0) { goto error; } break; case UNIXS_SOCK: case UNIXD_SOCK: handle->sock_type = (proto == UNIXD_SOCK) ? SOCK_DGRAM : SOCK_STREAM; if ((handle->socket = connect_unix_sock(name, handle->sock_type, &mysun, reply_socket, sock_dir)) < 0) { goto error; } break; case UNKNOWN_SOCK: snprintf(binrpc_last_errs, sizeof(binrpc_last_errs)-1, "open_connection: Bad socket type for %s\n", name); /*vm zmenit*/ goto error; } if (handle->sock_type == SOCK_DGRAM) { handle->buf_size = 8192; /* max size of datagram, < SSIZE_MAX, TODO: does a platform dependent constant exist ? */ } else { handle->buf_size = BINRPC_MAX_HDR_SIZE; } handle->buf = binrpc_malloc(handle->buf_size); if (!handle->buf) { snprintf(binrpc_last_errs, sizeof(binrpc_last_errs)-1, "open_connection: not enough memory to allocate buffer. Needed %d bytes", handle->buf_size); binrpc_close_connection(handle); } cleanup(&mysun); return 0; error: cleanup(&mysun); return FATAL_ERROR; }