static void print_media_word(int ifmw, int print_toptype) { struct ifmedia_description *desc; struct ifmedia_type_to_subtype *ttos; int seen_option = 0, i; /* Find the top-level interface type. */ desc = get_toptype_desc(ifmw); ttos = get_toptype_ttos(ifmw); if (desc->ifmt_string == NULL) { printf("<unknown type>"); return; } else if (print_toptype) { printf("%s", desc->ifmt_string); } /* * Don't print the top-level type; it's not like we can * change it, or anything. */ /* Find subtype. */ desc = get_subtype_desc(ifmw, ttos); if (desc == NULL) { printf("<unknown subtype>"); return; } if (print_toptype) putchar(' '); printf("%s", desc->ifmt_string); if (print_toptype) { desc = get_mode_desc(ifmw, ttos); if (desc != NULL && strcasecmp("autoselect", desc->ifmt_string)) printf(" mode %s", desc->ifmt_string); } /* Find options. */ for (i = 0; ttos->options[i].desc != NULL; i++) { if (ttos->options[i].alias) continue; for (desc = ttos->options[i].desc; desc->ifmt_string != NULL; desc++) { if (ifmw & desc->ifmt_word) { if (seen_option == 0) printf(" <"); printf("%s%s", seen_option++ ? "," : "", desc->ifmt_string); } } } printf("%s", seen_option ? ">" : ""); if (print_toptype && IFM_INST(ifmw) != 0) printf(" instance %d", IFM_INST(ifmw)); }
// ---------------------------------------------------------------- void multi_lrec_writer_output_srec(multi_lrec_writer_t* pmlw, lrec_t* poutrec, char* filename_or_command, file_output_mode_t file_output_mode, int flush_every_record, context_t* pctx) { lrec_writer_and_fp_t* pstate = lhmsv_get(pmlw->pnames_to_lrec_writers_and_fps, filename_or_command); if (pstate == NULL) { pstate = mlr_malloc_or_die(sizeof(lrec_writer_and_fp_t)); pstate->plrec_writer = lrec_writer_alloc(pmlw->pwriter_opts); MLR_INTERNAL_CODING_ERROR_IF(pstate->plrec_writer == NULL); pstate->filename_or_command = mlr_strdup_or_die(filename_or_command); char* mode_string = get_mode_string(file_output_mode); char* mode_desc = get_mode_desc(file_output_mode); if (file_output_mode == MODE_PIPE) { pstate->is_popen = TRUE; pstate->output_stream = popen(filename_or_command, mode_string); if (pstate->output_stream == NULL) { perror("popen"); fprintf(stderr, "%s: failed popen for %s on \"%s\".\n", MLR_GLOBALS.bargv0, mode_desc, filename_or_command); exit(1); } } else { pstate->is_popen = FALSE; pstate->output_stream = fopen(filename_or_command, mode_string); if (pstate->output_stream == NULL) { perror("fopen"); fprintf(stderr, "%s: failed fopen for %s on \"%s\".\n", MLR_GLOBALS.bargv0, mode_desc, filename_or_command); exit(1); } } lhmsv_put(pmlw->pnames_to_lrec_writers_and_fps, mlr_strdup_or_die(filename_or_command), pstate, FREE_ENTRY_KEY); } pstate->plrec_writer->pprocess_func(pstate->plrec_writer->pvstate, pstate->output_stream, poutrec, pctx); if (poutrec != NULL) { if (flush_every_record) fflush(pstate->output_stream); } else { if (pstate->is_popen) { // Sadly, pclose returns an error even on well-formed commands. For example, if the popened // command was "grep nonesuch" and the string "nonesuch" was not encountered, grep returns // non-zero and popen flags it as an error. We cannot differentiate these from genuine // failure cases so the best choice is to simply call pclose and ignore error codes. // If a piped-to command does fail then it should have some output to stderr which the // user can take advantage of. (void)pclose(pstate->output_stream); } else { if (fclose(pstate->output_stream) != 0) { perror("fclose"); fprintf(stderr, "%s: fclose error on \"%s\".\n", MLR_GLOBALS.bargv0, filename_or_command); exit(1); } } pstate->output_stream = NULL; } }
void print_media_word_ifconfig(int ifmw) { struct ifmedia_description *desc; struct ifmedia_type_to_subtype *ttos; int seen_option = 0, i; /* Find the top-level interface type. */ desc = get_toptype_desc(ifmw); ttos = get_toptype_ttos(ifmw); if (desc->ifmt_string == NULL) { printf("<unknown type>"); return; } /* * Don't print the top-level type; it's not like we can * change it, or anything. */ /* Find subtype. */ desc = get_subtype_desc(ifmw, ttos); if (desc == NULL) { printf("<unknown subtype>"); return; } printf("media %s", desc->ifmt_string); desc = get_mode_desc(ifmw, ttos); if (desc != NULL) printf(" mode %s", desc->ifmt_string); /* Find options. */ for (i = 0; ttos->options[i].desc != NULL; i++) { if (ttos->options[i].alias) continue; for (desc = ttos->options[i].desc; desc->ifmt_string != NULL; desc++) { if (ifmw & desc->ifmt_word) { if (seen_option == 0) printf(" mediaopt "); printf("%s%s", seen_option++ ? "," : "", desc->ifmt_string); } } } if (IFM_INST(ifmw) != 0) printf(" instance %d", IFM_INST(ifmw)); }
static void print_media_word_ifconfig(int ifmw) { struct ifmedia_description *desc; struct ifmedia_type_to_subtype *ttos; int i; /* Find the top-level interface type. */ desc = get_toptype_desc(ifmw); ttos = get_toptype_ttos(ifmw); if (desc->ifmt_string == NULL) { printf("<unknown type>"); return; } /* * Don't print the top-level type; it's not like we can * change it, or anything. */ /* Find subtype. */ desc = get_subtype_desc(ifmw, ttos); if (desc != NULL) goto got_subtype; /* Falling to here means unknown subtype. */ printf("<unknown subtype>"); return; got_subtype: printf("media %s", desc->ifmt_string); desc = get_mode_desc(ifmw, ttos); if (desc != NULL) printf(" mode %s", desc->ifmt_string); /* Find options. */ for (i = 0; ttos->options[i].desc != NULL; i++) { if (ttos->options[i].alias) continue; for (desc = ttos->options[i].desc; desc->ifmt_string != NULL; desc++) { if (ifmw & desc->ifmt_word) { printf(" mediaopt %s", desc->ifmt_string); } } } }