int wall_main(int argc UNUSED_PARAM, char **argv) { struct utmpx *ut; char *msg; int fd; fd = STDIN_FILENO; if (argv[1]) { /* The applet is setuid. * Access to the file must be under user's uid/gid. */ fd = xopen_as_uid_gid(argv[1], O_RDONLY, getuid(), getgid()); } msg = xmalloc_read(fd, NULL); if (ENABLE_FEATURE_CLEAN_UP && argv[1]) close(fd); setutxent(); while ((ut = getutxent()) != NULL) { char *line; if (ut->ut_type != USER_PROCESS) continue; line = concat_path_file("/dev", ut->ut_line); xopen_xwrite_close(line, msg); free(line); } if (ENABLE_FEATURE_CLEAN_UP) { endutxent(); free(msg); } return EXIT_SUCCESS; }
int loadfont_main(int argc UNUSED_PARAM, char **argv) { size_t len; unsigned char *buffer; // no arguments allowed! opt_complementary = "=0"; getopt32(argv, ""); /* * We used to look at the length of the input file * with stat(); now that we accept compressed files, * just read the entire file. */ len = 32*1024; // can't be larger buffer = xmalloc_read(STDIN_FILENO, &len); // xmalloc_open_zipped_read_close(filename, &len); if (!buffer) bb_perror_msg_and_die("error reading input font"); do_load(get_console_fd_or_die(), buffer, len); return EXIT_SUCCESS; }
int wall_main(int argc UNUSED_PARAM, char **argv) { struct utmp *ut; char *msg; int fd = argv[1] ? xopen(argv[1], O_RDONLY) : STDIN_FILENO; msg = xmalloc_read(fd, NULL); if (ENABLE_FEATURE_CLEAN_UP && argv[1]) close(fd); setutent(); while ((ut = getutent()) != NULL) { char *line; if (ut->ut_type != USER_PROCESS) continue; line = concat_path_file("/dev", ut->ut_line); xopen_xwrite_close(line, msg); free(line); } if (ENABLE_FEATURE_CLEAN_UP) { endutent(); free(msg); } return EXIT_SUCCESS; }
static int sysctl_act_on_setting(char *setting) { int fd, retval = EXIT_SUCCESS; char *cptr, *outname; char *value = value; /* for compiler */ outname = xstrdup(setting); cptr = outname; while (*cptr) { if (*cptr == '/') *cptr = '.'; cptr++; } if (option_mask32 & FLAG_WRITE) { cptr = strchr(setting, '='); if (cptr == NULL) { bb_error_msg("error: '%s' must be of the form name=value", outname); retval = EXIT_FAILURE; goto end; } value = cptr + 1; /* point to the value in name=value */ if (setting == cptr || !*value) { bb_error_msg("error: malformed setting '%s'", outname); retval = EXIT_FAILURE; goto end; } *cptr = '\0'; outname[cptr - setting] = '\0'; /* procps 3.2.7 actually uses these flags */ fd = open(setting, O_WRONLY|O_CREAT|O_TRUNC, 0666); } else { fd = open(setting, O_RDONLY); } if (fd < 0) { switch (errno) { case ENOENT: if (option_mask32 & FLAG_SHOW_KEY_ERRORS) bb_error_msg("error: '%s' is an unknown key", outname); break; default: bb_perror_msg("error %sing key '%s'", option_mask32 & FLAG_WRITE ? "sett" : "read", outname); break; } retval = EXIT_FAILURE; goto end; } if (option_mask32 & FLAG_WRITE) { //TODO: procps 3.2.7 writes "value\n", note trailing "\n" xwrite_str(fd, value); close(fd); if (!(option_mask32 & FLAG_QUIET)) { if (option_mask32 & FLAG_SHOW_KEYS) printf("%s = ", outname); puts(value); } } else { char c; value = cptr = xmalloc_read(fd, NULL); close(fd); if (value == NULL) { bb_perror_msg("error reading key '%s'", outname); goto end; } /* dev.cdrom.info and sunrpc.transports, for example, * are multi-line. Try "sysctl sunrpc.transports" */ while ((c = *cptr) != '\0') { if (option_mask32 & FLAG_SHOW_KEYS) printf("%s = ", outname); while (1) { fputc(c, stdout); cptr++; if (c == '\n') break; c = *cptr; if (c == '\0') break; } } free(value); } end: free(outname); return retval; }