/* Processes incoming requests for 'server'. */ static void poll_server(int fd UNUSED, short int events UNUSED, void *server_) { struct vlog_server *server = server_; for (;;) { char cmd_buf[512]; struct sockaddr_un un; socklen_t un_len; char *reply; int error; error = recv_with_creds(server, cmd_buf, sizeof cmd_buf, &un, &un_len); if (error > 0) { if (error != EAGAIN && error != EWOULDBLOCK) { fprintf(stderr, "vlog: reading configuration socket: %s", strerror(errno)); } break; } else if (error < 0) { continue; } /* Process message and send reply. */ if (!strncmp(cmd_buf, "set ", 4)) { char *msg = vlog_set_levels_from_string(cmd_buf + 4); reply = msg ? msg : xstrdup("ack"); } else if (!strcmp(cmd_buf, "list")) { reply = vlog_get_levels(); } else if (!strcmp(cmd_buf, "reopen")) { int error = vlog_reopen_log_file(); reply = (error ? xasprintf("could not reopen log file \"%s\": %s", vlog_get_log_file(), strerror(error)) : xstrdup("ack")); } else { reply = xstrdup("nak"); } sendto(server->fd, reply, strlen(reply), 0, (struct sockaddr*) &un, un_len); free(reply); } server->waiter = poll_fd_callback(server->fd, POLLIN, poll_server, server); }
int main(void) { int exit_code = 0; struct ds in; ds_init(&in); vlog_set_levels_from_string("odp_util:console:dbg"); while (!ds_get_line(&in, stdin)) { enum odp_key_fitness fitness; struct ofpbuf odp_key; struct flow flow; struct ds out; int error; char *s; /* Delete comments, skip blank lines. */ s = ds_cstr(&in); if (*s == '#') { puts(s); continue; } if (strchr(s, '#')) { *strchr(s, '#') = '\0'; } if (s[strspn(s, " ")] == '\0') { putchar('\n'); continue; } /* Convert string to OVS DP key. */ ofpbuf_init(&odp_key, 0); error = odp_flow_key_from_string(ds_cstr(&in), NULL, &odp_key); if (error) { printf("odp_flow_key_from_string: error\n"); goto next; } /* Convert odp_key to flow. */ fitness = odp_flow_key_to_flow(odp_key.data, odp_key.size, &flow); switch (fitness) { case ODP_FIT_PERFECT: break; case ODP_FIT_TOO_LITTLE: printf("ODP_FIT_TOO_LITTLE: "); break; case ODP_FIT_TOO_MUCH: printf("ODP_FIT_TOO_MUCH: "); break; case ODP_FIT_ERROR: printf("odp_flow_key_to_flow: error\n"); goto next; } /* Convert cls_rule back to odp_key. */ ofpbuf_uninit(&odp_key); ofpbuf_init(&odp_key, 0); odp_flow_key_from_flow(&odp_key, &flow); if (odp_key.size > ODPUTIL_FLOW_KEY_BYTES) { printf ("too long: %zu > %d\n", odp_key.size, ODPUTIL_FLOW_KEY_BYTES); exit_code = 1; } /* Convert odp_key to string. */ ds_init(&out); odp_flow_key_format(odp_key.data, odp_key.size, &out); puts(ds_cstr(&out)); ds_destroy(&out); next: ofpbuf_uninit(&odp_key); } ds_destroy(&in); return exit_code; }