unsigned long parse_number(const char *numstr, const struct suffix_mult *suffixes) { const struct suffix_mult *sm; unsigned long int ret; int len; char *end; ret = strtoul(numstr, &end, 10); if (numstr == end) error_msg_and_die("invalid number `%s'", numstr); while (end[0] != '\0') { sm = suffixes; while ( sm != 0 ) { if(sm->suffix) { len = strlen(sm->suffix); if (strncmp(sm->suffix, end, len) == 0) { ret *= sm->mult; end += len; break; } sm++; } else sm = 0; } if (sm == 0) error_msg_and_die("invalid number `%s'", numstr); } return ret; }
/* ________________________________________________________________________ */ int deluser_main(int argc, char **argv) { /* int successful; */ int failure; if (argc != 2) { usage(deluser_usage); } else { failure = del_line_matching(argv[1], PASSWD_FILE); /* if (!successful) { */ if (failure) { error_msg_and_die("%s: User could not be removed from %s\n", argv[1], PASSWD_FILE); } #ifdef TLG_FEATURE_SHADOWPASSWDS failure = del_line_matching(argv[1], SHADOW_FILE); /* if (!successful) { */ if (failure) { error_msg_and_die("%s: User could not be removed from %s\n", argv[1], SHADOW_FILE); } #endif /* TLG_FEATURE_SHADOWPASSWDS */ failure = del_line_matching(argv[1], GROUP_FILE); /* if (!successful) { */ if (failure) { error_msg_and_die("%s: User could not be removed from %s\n", argv[1], GROUP_FILE); } } return (EXIT_SUCCESS); }
static struct name_id* parse_line(char *line) { char *p; int i; char id_buf[MAX_ID_LEN+1]; struct name_id *node; node = alloc_node(); p = line; i = 0; // Get name field while (*p != ':') { if (i > MAX_NAME_LEN) error_msg_and_die("Name field too long"); node->name[i++] = *p++; } node->name[i] = '\0'; p++; // Skip the second field while (*p != ':') p++; p++; // Get id field i = 0; while (*p != ':') { if (i > MAX_ID_LEN) error_msg_and_die("ID filed too long"); id_buf[i++] = *p++; } id_buf[i] = '\0'; node->id = atol(id_buf); return node; }
static int writeTarFile(const char* tarName, int verboseFlag, char **argv, char** excludeList) { int tarFd=-1; int errorFlag=FALSE; ssize_t size; struct TarBallInfo tbInfo; tbInfo.verboseFlag = verboseFlag; tbInfo.hlInfoHead = NULL; /* Make sure there is at least one file to tar up. */ if (*argv == NULL) error_msg_and_die("Cowardly refusing to create an empty archive"); /* Open the tar file for writing. */ if (!strcmp(tarName, "-")) tbInfo.tarFd = fileno(stdout); else tbInfo.tarFd = open (tarName, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (tbInfo.tarFd < 0) { perror_msg( "Error opening '%s'", tarName); freeHardLinkInfo(&tbInfo.hlInfoHead); return ( FALSE); } tbInfo.excludeList=excludeList; /* Store the stat info for the tarball's file, so * can avoid including the tarball into itself.... */ if (fstat(tbInfo.tarFd, &tbInfo.statBuf) < 0) error_msg_and_die(io_error, tarName, strerror(errno)); /* Read the directory/files and iterate over them one at a time */ while (*argv != NULL) { if (recursive_action(*argv++, TRUE, FALSE, FALSE, writeFileToTarball, writeFileToTarball, (void*) &tbInfo) == FALSE) { errorFlag = TRUE; } } /* Write two empty blocks to the end of the archive */ for (size=0; size<(2*TAR_BLOCK_SIZE); size++) { write(tbInfo.tarFd, "\0", 1); } /* To be pedantically correct, we would check if the tarball * is smaller than 20 tar blocks, and pad it if it was smaller, * but that isn't necessary for GNU tar interoperability, and * so is considered a waste of space */ /* Hang up the tools, close up shop, head home */ close(tarFd); if (errorFlag == TRUE) { error_msg("Error exit delayed from previous errors"); freeHardLinkInfo(&tbInfo.hlInfoHead); return(FALSE); } freeHardLinkInfo(&tbInfo.hlInfoHead); return( TRUE); }
/* device table entries take the form of: <path> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count> /dev/mem c 640 0 0 1 1 0 0 - type can be one of: f A regular file d Directory c Character special device file b Block special device file p Fifo (named pipe) I don't bother with symlinks (permissions are irrelevant), hard links (special cases of regular files), or sockets (why bother). Regular files must exist in the target root directory. If a char, block, fifo, or directory does not exist, it will be created. */ static int interpret_table_entry(char *line) { char *name; char path[4096], type; unsigned long mode = 0755, uid = 0, gid = 0, major = 0, minor = 0; unsigned long start = 0, increment = 1, count = 0; if (0 > sscanf(line, "%40s %c %lo %lu %lu %lu %lu %lu %lu %lu", path, &type, &mode, &uid, &gid, &major, &minor, &start, &increment, &count)) { return 1; } if (!strcmp(path, "/")) { error_msg_and_die("Device table entries require absolute paths"); } name = xstrdup(path+1); sprintf(path, "%s/%s\0", rootdir, name); switch (type) { case 'd': mode |= S_IFDIR; add_new_directory(name, path, uid, gid, mode); break; case 'f': mode |= S_IFREG; add_new_file(name, path, uid, gid, mode); break; case 'p': mode |= S_IFIFO; add_new_fifo(name, path, uid, gid, mode); break; case 'c': case 'b': mode |= (type == 'c') ? S_IFCHR : S_IFBLK; if (count > 0) { int i; dev_t rdev; char buf[80]; for (i = start; i < start+count; i++) { sprintf(buf, "%s%d", name, i); rdev = makedev(major, minor + (i * increment - start)); add_new_device(buf, path, uid, gid, mode, rdev); } } else { dev_t rdev = makedev(major, minor); add_new_device(name, path, uid, gid, mode, rdev); } break; default: error_msg_and_die("Unsupported file type"); } if (name) free(name); return 0; }
void ureport_server_config_load_basic_auth(struct ureport_server_config *config, const char *http_auth_pref) { if (http_auth_pref == NULL) return; map_string_t *settings = NULL; char *tmp_password = NULL; char *tmp_username = NULL; const char *username = NULL; const char *password = NULL; if (strcmp(http_auth_pref, "rhts-credentials") == 0) { settings = new_map_string(); char *local_conf = xasprintf("%s"USER_HOME_CONFIG_PATH"/rhtsupport.conf", getenv("HOME")); if (!load_plugin_conf_file("rhtsupport.conf", settings, /*skip key w/o values:*/ false) && !load_conf_file(local_conf, settings, /*skip key w/o values:*/ false)) error_msg_and_die("Could not get RHTSupport credentials"); free(local_conf); username = get_map_string_item_or_NULL(settings, "Login"); password = get_map_string_item_or_NULL(settings, "Password"); if (config->ur_url == NULL) ureport_server_config_set_url(config, xstrdup(RHSM_WEB_SERVICE_URL)); } else { username = tmp_username = xstrdup(http_auth_pref); password = strchr(tmp_username, ':'); if (password != NULL) /* It is "char *", see strchr() few lines above. */ *((char *)(password++)) = '\0'; } if (password == NULL) { char *message = xasprintf("Please provide uReport server password for user '%s':", username); password = tmp_password = ask_password(message); free(message); if (strcmp(password, "") == 0) error_msg_and_die("Cannot continue without uReport server password!"); } ureport_server_config_set_basic_auth(config, username, password); free(tmp_password); free(tmp_username); free_map_string(settings); }
static void add_new_file(char *name, char *path, unsigned long uid, unsigned long gid, unsigned long mode, struct directory_entry *parent) { int status; struct stat sb; time_t timestamp = time(NULL); struct filesystem_entry *new_entry; memset(&sb, 0, sizeof(struct stat)); status = lstat(path, &sb); if (status >= 0) { /* It is ok for some types of files to not exit on disk (such as * device nodes), but if they _do_ exist the specified mode had * better match the actual file or strange things will happen.... */ if ((mode & S_IFMT) != (sb.st_mode & S_IFMT)) error_msg_and_die("%s: file type does not match specified type!", path); timestamp = sb.st_mtime; } else { /* If this is a regular file, it _must_ exist on disk */ if ((mode & S_IFMT) == S_IFREG) { error_msg_and_die("%s: file is must exist on disk!", path); } } if (squash) { /* Squash all permissions so files are owned by * root, all timestamps are _right now_, and file * permissions have group and other write removed */ uid = gid = 0; if (!S_ISLNK(mode)) { mode &= ~(S_IWGRP | S_IWOTH); mode &= ~(S_ISUID | S_ISGID); } } if (fake_times) { timestamp = 0; } new_entry = xmalloc(sizeof(struct filesystem_entry)); memset(new_entry, 0, sizeof(struct filesystem_entry)); new_entry->name = xstrdup(name); new_entry->path = xstrdup(path); if (sb.st_ino != 0) memcpy(&(new_entry->sb), &sb, sizeof(struct stat)); new_entry->jffs2_ino = 1; new_entry->sb.st_uid = uid; new_entry->sb.st_gid = gid; new_entry->sb.st_mode = mode; new_entry->parent = parent; new_entry->sb.st_atime = new_entry->sb.st_ctime = new_entry->sb.st_mtime = timestamp; new_file_list_entry(new_entry); }
static int interpret_table_entry(char *line, struct entry *root, off_t *fslen_ub) { char type, *name = NULL; unsigned long mode = 0755, uid = 0, gid = 0, major = 0, minor = 0; unsigned long start = 0, increment = 1, count = 0; if (sscanf (line, "%" SCANF_PREFIX "s %c %lo %lu %lu %lu %lu %lu %lu %lu", SCANF_STRING(name), &type, &mode, &uid, &gid, &major, &minor, &start, &increment, &count) < 0) { return 1; } if (!strcmp(name, "/")) { error_msg_and_die("Device table entries require absolute paths"); } switch (type) { case 'd': mode |= S_IFDIR; modify_entry(name, uid, gid, mode, 0, root, fslen_ub); break; case 'f': mode |= S_IFREG; modify_entry(name, uid, gid, mode, 0, root, fslen_ub); break; case 'p': mode |= S_IFIFO; modify_entry(name, uid, gid, mode, 0, root, fslen_ub); break; case 'c': case 'b': mode |= (type == 'c') ? S_IFCHR : S_IFBLK; if (count > 0) { char *buf; unsigned long i; dev_t rdev; for (i = start; i < count; i++) { asprintf(&buf, "%s%lu", name, i); rdev = makedev(major, minor + (i * increment - start)); modify_entry(buf, uid, gid, mode, rdev, root, fslen_ub); free(buf); } } else { dev_t rdev = makedev(major, minor); modify_entry(name, uid, gid, mode, rdev, root, fslen_ub); } break; default: error_msg_and_die("Unsupported file type"); } free(name); return 0; }
int main(int argc, char **argv) { /* I18n */ setlocale(LC_ALL, ""); #if ENABLE_NLS bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); #endif abrt_init(argv); const char *dump_dir_name = "."; const char *root_dir = NULL; /* Can't keep these strings/structs static: _() doesn't support that */ const char *program_usage_string = _( "& [-v] -d DIR\n" "\n" "Save container metadata" ); enum { OPT_v = 1 << 0, OPT_d = 1 << 1, }; /* Keep enum above and order of options below in sync! */ struct options program_options[] = { OPT__VERBOSE(&g_verbose), OPT_STRING('d', NULL, &dump_dir_name, "DIR" , _("Problem directory")), OPT_STRING('r', NULL, &root_dir, "ROOTDIR" , _("Root directory for running container commands")), OPT_END() }; /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string); export_abrt_envvars(0); struct dump_dir *dd = dd_opendir(dump_dir_name, /* for writing */0); if (dd == NULL) xfunc_die(); char *container_cmdline = dd_load_text_ext(dd, FILENAME_CONTAINER_CMDLINE, DD_LOAD_TEXT_RETURN_NULL_ON_FAILURE); if (container_cmdline == NULL) error_msg_and_die("The crash didn't occur in container"); if (strstr("/docker ", container_cmdline) == 0) dump_docker_info(dd, root_dir); else if (strstr("/lxc-", container_cmdline) == 0) dump_lxc_info(dd, container_cmdline); else error_msg_and_die("Unsupported container technology"); free(container_cmdline); dd_close(dd); return 0; }
/* * Add numbers to SET according to STR specification. */ void qualify_tokens(const char *const str, struct number_set *const set, string_to_uint_func func, const char *const name) { /* Clear the set. */ clear_number_set_array(set, 1); /* * Each leading ! character means inversion * of the remaining specification. */ const char *s = str; while (*s == '!') { invert_number_set_array(set, 1); ++s; } if (strcmp(s, "none") == 0) { /* * No numbers are added to the set. * Subsequent is_number_in_set* invocations * will return set->not. */ return; } else if (strcmp(s, "all") == 0) { /* "all" == "!none" */ invert_number_set_array(set, 1); return; } /* * Split the string into comma separated tokens. * For each token, find out the corresponding number * by calling FUNC, and add that number to the set. * The absence of tokens or a negative answer * from FUNC is a fatal error. */ char *copy = xstrdup(s); char *saveptr = NULL; int number = -1; for (const char *token = strtok_r(copy, ",", &saveptr); token; token = strtok_r(NULL, ",", &saveptr)) { number = func(token); if (number < 0) error_msg_and_die("invalid %s '%s'", name, token); add_number_to_set(number, set); } free(copy); if (number < 0) error_msg_and_die("invalid %s '%s'", name, str); }
static void set_data_offset(struct entry *entry, char *base, unsigned long offset) { struct cramfs_inode *inode = (struct cramfs_inode *) (base + entry->dir_offset); if ((offset & 3) != 0) { error_msg_and_die("illegal offset of %lu bytes", offset); } if (offset >= (1 << (2 + CRAMFS_OFFSET_WIDTH))) { error_msg_and_die("filesystem too big"); } CRAMFS_SET_OFFSET(inode, offset >> 2); }
static char *parse_cmd_str(struct sed_cmd * const sed_cmd, const char *const cmdstr) { int idx = 0; /* parse the command * format is: [addr][,addr]cmd * |----||-----||-| * part1 part2 part3 */ /* first part (if present) is an address: either a number or a /regex/ */ if (isdigit(cmdstr[idx]) || cmdstr[idx] == '/') idx = get_address(sed_cmd, cmdstr, &sed_cmd->beg_line, &sed_cmd->beg_match); /* second part (if present) will begin with a comma */ if (cmdstr[idx] == ',') { idx++; idx += get_address(sed_cmd, &cmdstr[idx], &sed_cmd->end_line, &sed_cmd->end_match); } /* last part (mandatory) will be a command */ if (cmdstr[idx] == '\0') error_msg_and_die("missing command"); sed_cmd->cmd = cmdstr[idx]; /* if it was a single-letter command that takes no arguments (such as 'p' * or 'd') all we need to do is increment the index past that command */ if (strchr("pd", cmdstr[idx])) { idx++; } /* handle (s)ubstitution command */ else if (sed_cmd->cmd == 's') { idx += parse_subst_cmd(sed_cmd, &cmdstr[idx]); } /* handle edit cmds: (a)ppend, (i)nsert, and (c)hange */ else if (strchr("aic", sed_cmd->cmd)) { if ((sed_cmd->end_line || sed_cmd->end_match) && sed_cmd->cmd != 'c') error_msg_and_die("only a beginning address can be specified for edit commands"); idx += parse_edit_cmd(sed_cmd, &cmdstr[idx]); } /* handle file cmds: (r)ead */ else if (sed_cmd->cmd == 'r') { if (sed_cmd->end_line || sed_cmd->end_match) error_msg_and_die("Command only uses one address"); idx += parse_file_cmd(sed_cmd, &cmdstr[idx]); } else { error_msg_and_die("invalid command"); } /* give back whatever's left over */ return (char *)&cmdstr[idx]; }
static GHashTable *bodhi_query_list(const char *query, const char *release) { char *bodhi_url_bugs = xasprintf("%s/?%s", bodhi_url, query); post_state_t *post_state = new_post_state(POST_WANT_BODY | POST_WANT_SSL_VERIFY | POST_WANT_ERROR_MSG); const char *headers[] = { "Accept: application/json", NULL }; get(post_state, bodhi_url_bugs, "application/x-www-form-urlencoded", headers); if (post_state->http_resp_code != 200 && post_state->http_resp_code != 400) { char *errmsg = post_state->curl_error_msg; if (errmsg && errmsg[0]) error_msg_and_die("%s '%s'", errmsg, bodhi_url_bugs); } free(bodhi_url_bugs); // log_warning("%s", post_state->body); json_object *json = json_tokener_parse(post_state->body); if (is_error(json)) error_msg_and_die("fatal: unable parse response from bodhi server"); /* we must check the http_resp_code because only error responses contain * 'status' item. 'bodhi_read_value' function prints an error message in * the case it did not found the item */ if (post_state->http_resp_code != 200) { char *status_item = NULL; bodhi_read_value(json, "status", &status_item, BODHI_READ_STR); if (status_item != NULL && strcmp(status_item, "error") == 0) { free(status_item); bodhi_print_errors_from_json(json); json_object_put(json); xfunc_die(); // error_msg are printed in bodhi_print_errors_from_json } } GHashTable *bodhi_table = bodhi_parse_json(json, release); json_object_put(json); free_post_state(post_state); return bodhi_table; }
/* * Add syscall numbers to SETs for each supported personality * according to STR specification. */ void qualify_syscall_tokens(const char *const str, struct number_set *const set) { /* Clear all sets. */ clear_number_set_array(set, SUPPORTED_PERSONALITIES); /* * Each leading ! character means inversion * of the remaining specification. */ const char *s = str; while (*s == '!') { invert_number_set_array(set, SUPPORTED_PERSONALITIES); ++s; } if (strcmp(s, "none") == 0) { /* * No syscall numbers are added to sets. * Subsequent is_number_in_set* invocations * will return set[p]->not. */ return; } else if (strcmp(s, "all") == 0) { /* "all" == "!none" */ invert_number_set_array(set, SUPPORTED_PERSONALITIES); return; } /* * Split the string into comma separated tokens. * For each token, call qualify_syscall that will take care * if adding appropriate syscall numbers to sets. * The absence of tokens or a negative return code * from qualify_syscall is a fatal error. */ char *copy = xstrdup(s); char *saveptr = NULL; bool done = false; for (const char *token = strtok_r(copy, ",", &saveptr); token; token = strtok_r(NULL, ",", &saveptr)) { done = qualify_syscall(token, set); if (!done) error_msg_and_die("invalid system call '%s'", token); } free(copy); if (!done) error_msg_and_die("invalid system call '%s'", str); }
static void map_entry(struct entry *entry) { if (entry->path) { entry->fd = open(entry->path, O_RDONLY); if (entry->fd < 0) { error_msg_and_die("open failed: %s", entry->path); } entry->uncompressed = mmap(NULL, entry->size, PROT_READ, MAP_PRIVATE, entry->fd, 0); if (entry->uncompressed == MAP_FAILED) { error_msg_and_die("mmap failed: %s", entry->path); } } }
/* gets a gid given a user name */ long my_getpwnamegid(const char *name) { struct group *mygroup; struct passwd *myuser; myuser=getpwnam(name); if (myuser==NULL) error_msg_and_die("unknown user name: %s", name); mygroup = getgrgid(myuser->pw_gid); if (mygroup==NULL) error_msg_and_die("unknown gid %ld", (long)myuser->pw_gid); return mygroup->gr_gid; }
int chmod_main(int argc, char **argv) { int i; int opt; int recursiveFlag = FALSE; int opt_eq_modeFlag = FALSE; /* do normal option parsing */ while ((opt = getopt(argc, argv, "Rrwxst")) > 0) { switch (opt) { case 'R': recursiveFlag = TRUE; break; case 'r': case 'w': case 'x': case 's': case 't': opt_eq_modeFlag = TRUE; break; default: show_usage(); } } if (opt_eq_modeFlag == TRUE) { optind--; } if (argc > optind && argc > 2 && argv[optind]) { /* Parse the specified mode */ mode_t mode; if (parse_mode(argv[optind], &mode) == FALSE) { error_msg_and_die( "unknown mode: %s", argv[optind]); } } else { error_msg_and_die(too_few_args); } /* Ok, ready to do the deed now */ for (i = optind + 1; i < argc; i++) { if (recursive_action (argv[i], recursiveFlag, FALSE, FALSE, fileAction, fileAction, argv[optind]) == FALSE) { return EXIT_FAILURE; } } return EXIT_SUCCESS; }
static void parse_device_table(FILE * file) { char *line; size_t length = 256; int len = 0; if((line = (char *)malloc(length)) == NULL) { error_msg_and_die(memory_exhausted); } /* Looks ok so far. The general plan now is to read in one * line at a time, trim off leading and trailing whitespace, * check for leading comment delimiters ('#') or a blank line, * then try and parse the line as a device table entry. If we fail * to parse things, try and help the poor fool to fix their * device table with a useful error msg... */ while ((len = getline(&line, &length, file)) != -1) { /* First trim off any whitespace */ /* trim trailing whitespace */ while (len > 0 && isspace(line[len - 1])) line[--len] = '\0'; /* trim leading whitespace */ memmove(line, &line[strspn(line, " \n\r\t\v")], len + 1); /* If this is NOT a comment or an empty line, try to interpret it */ if (*line != '#' && *line != '\0') interpret_table_entry(line); } if (line) free(line); }
static unsigned long convert2guid(char *id_buf, struct name_id *search_list) { char *p; int isnum; struct name_id *node; p = id_buf; isnum = 1; while (*p != '\0') { if (!isdigit(*p)) { isnum = 0; break; } p++; } if (isnum) { // Check for bad user/group name node = search_list; while (node != NULL) { if (!strncmp(node->name, id_buf, strlen(id_buf))) { fprintf(stderr, "WARNING: Bad user/group name %s detected\n", id_buf); break; } node = node->next; } return (unsigned long)atol(id_buf); } else { node = search_list; while (node != NULL) { if (!strncmp(node->name, id_buf, strlen(id_buf))) return node->id; node = node->next; } error_msg_and_die("No entry for %s in search list", id_buf); } }
static void get_list_from_file(FILE *file, struct name_id **plist) { char *line; int len = 0; size_t length = 256; struct name_id *node, *cur; if((line = (char *)malloc(length)) == NULL) { error_msg_and_die(memory_exhausted); } while ((len = getline(&line, &length, file)) != -1) { node = parse_line(line); if (*plist == NULL) { *plist = node; cur = *plist; } else { cur->next = node; cur = cur->next; } } if (line) free(line); }
int add_sum_mem(union jffs2_sum_mem *item) { if (!sum_collected->sum_list_head) sum_collected->sum_list_head = (union jffs2_sum_mem *) item; if (sum_collected->sum_list_tail) sum_collected->sum_list_tail->u.next = (union jffs2_sum_mem *) item; sum_collected->sum_list_tail = (union jffs2_sum_mem *) item; switch (je16_to_cpu(item->u.nodetype)) { case JFFS2_NODETYPE_INODE: sum_collected->sum_size += JFFS2_SUMMARY_INODE_SIZE; sum_collected->sum_num++; break; case JFFS2_NODETYPE_DIRENT: sum_collected->sum_size += JFFS2_SUMMARY_DIRENT_SIZE(item->d.nsize); sum_collected->sum_num++; break; case JFFS2_NODETYPE_XATTR: sum_collected->sum_size += JFFS2_SUMMARY_XATTR_SIZE; sum_collected->sum_num++; break; case JFFS2_NODETYPE_XREF: sum_collected->sum_size += JFFS2_SUMMARY_XREF_SIZE; sum_collected->sum_num++; break; default: error_msg_and_die("__jffs2_add_sum_mem(): UNKNOWN node type %d\n", je16_to_cpu(item->u.nodetype)); } return 0; }
int main(int argc, char **argv) { int ret; process_options(argc,argv); if ((in_fd == -1) || (out_fd == -1)) { if(in_fd != -1) close(in_fd); if(out_fd != -1) close(out_fd); fprintf(stderr,helptext); error_msg_and_die("You must specify input and output files!\n"); } init_buffers(); init_sumlist(); while ((ret = load_next_block())) { create_summed_image(ret); } flush_buffers(); clean_buffers(); clean_sumlist(); if (in_fd != -1) close(in_fd); if (out_fd != -1) close(out_fd); return 0; }
static int find_type(char *type) { int mask = 0; switch (type[0]) { case 'b': mask = S_IFBLK; break; case 'c': mask = S_IFCHR; break; case 'd': mask = S_IFDIR; break; case 'p': mask = S_IFIFO; break; case 'f': mask = S_IFREG; break; case 'l': mask = S_IFLNK; break; case 's': mask = S_IFSOCK; break; } if (mask == 0 || type[1] != '\0') error_msg_and_die("invalid argument `%s' to `-type'", type); return mask; }
static void do_loadfont(int fd, char *inbuf, int unit, int fontsize) { char buf[16384]; int i; memset(buf, 0, sizeof(buf)); if (unit < 1 || unit > 32) error_msg_and_die("Bad character size %d", unit); for (i = 0; i < fontsize; i++) memcpy(buf + (32 * i), inbuf + (unit * i), unit); #if defined( PIO_FONTX ) && !defined( __sparc__ ) { struct consolefontdesc cfd; cfd.charcount = fontsize; cfd.charheight = unit; cfd.chardata = buf; if (ioctl(fd, PIO_FONTX, &cfd) == 0) return; /* success */ perror_msg("PIO_FONTX ioctl error (trying PIO_FONT)"); } #endif if (ioctl(fd, PIO_FONT, buf)) perror_msg_and_die("PIO_FONT ioctl error"); }
/* die or return bug id; each bug must have bug id otherwise xml is corrupted */ int rhbz_get_bug_id_from_array0(xmlrpc_value* xml, unsigned ver) { func_entry(); xmlrpc_env env; xmlrpc_env_init(&env); xmlrpc_value *item = NULL; xmlrpc_array_read_item(&env, xml, 0, &item); if (env.fault_occurred) abrt_xmlrpc_die(&env); const char *id; if (ver >= BUGZILLA_VERSION(4,2,0)) id = "id"; else id = "bug_id"; xmlrpc_value *bug; bug = rhbz_get_member(id, item); xmlrpc_DECREF(item); if (!bug) error_msg_and_die("Can't get member '%s' from bug data", id); int bug_id = -1; xmlrpc_read_int(&env, bug, &bug_id); xmlrpc_DECREF(bug); if (env.fault_occurred) abrt_xmlrpc_die(&env); VERB3 log("found bug_id %i", bug_id); return bug_id; }
void set_status(const unsigned int status_node_num, const char *new_value, const int position) { const unsigned int new_value_len = strlen(new_value); const unsigned int new_value_num = search_name_hashtable(new_value); unsigned int want = get_status(status_node_num, 1); unsigned int flag = get_status(status_node_num, 2); unsigned int status = get_status(status_node_num, 3); int want_len = strlen(name_hashtable[want]); int flag_len = strlen(name_hashtable[flag]); int status_len = strlen(name_hashtable[status]); char *new_status; switch (position) { case (1): want = new_value_num; want_len = new_value_len; break; case (2): flag = new_value_num; flag_len = new_value_len; break; case (3): status = new_value_num; status_len = new_value_len; break; default: error_msg_and_die("DEBUG ONLY: this shouldnt happen"); } new_status = (char *) xmalloc(want_len + flag_len + status_len + 3); sprintf(new_status, "%s %s %s", name_hashtable[want], name_hashtable[flag], name_hashtable[status]); status_hashtable[status_node_num]->status = search_name_hashtable(new_status); free(new_status); return; }
static char *rpm_get_nvr_by_pkg_name(const char *pkg_name) { int status = rpmReadConfigFiles((const char *) NULL, (const char *) NULL); if (status) error_msg_and_die("error reading RPM rc files"); char *nvr = NULL; rpmts ts = rpmtsCreate(); rpmdbMatchIterator iter = rpmtsInitIterator(ts, RPMTAG_NAME, pkg_name, 0); Header header = rpmdbNextIterator(iter); if (!header) goto error; const char *errmsg = NULL; nvr = headerFormat(header, "%{name}-%{version}-%{release}", &errmsg); if (!nvr && errmsg) error_msg("cannot get nvr. reason: %s", errmsg); error: rpmdbFreeIterator(iter); rpmtsFree(ts); rpmFreeRpmrc(); rpmFreeCrypto(); rpmFreeMacros(NULL); return nvr; }
static xmlrpc_value *rhbz_search_duphash(struct abrt_xmlrpc *ax, const char *product, const char *version, const char *component, const char *duphash) { struct strbuf *query = strbuf_new(); strbuf_append_strf(query, "ALL whiteboard:\"%s\"", duphash); if (product) strbuf_append_strf(query, " product:\"%s\"", product); if (version) strbuf_append_strf(query, " version:\"%s\"", version); if (component) strbuf_append_strf(query, " component:\"%s\"", component); char *s = strbuf_free_nobuf(query); VERB3 log("search for '%s'", s); xmlrpc_value *search = abrt_xmlrpc_call(ax, "Bug.search", "({s:s})", "quicksearch", s); free(s); xmlrpc_value *bugs = rhbz_get_member("bugs", search); xmlrpc_DECREF(search); if (!bugs) error_msg_and_die(_("Bug.search(quicksearch) return value did not contain member 'bugs'")); return bugs; }
int main(int argc, char **argv) { const char *s; applet_name = argv[0]; if (applet_name[0] == '-') applet_name++; for (s = applet_name; *s != '\0';) { if (*s++ == '/') applet_name = s; } #ifdef CONFIG_LOCALE_SUPPORT #ifdef CONFIG_INIT if(getpid()!=1) /* Do not set locale for `init' */ #endif { setlocale(LC_ALL, ""); } #endif run_applet_by_name(applet_name, argc, argv); error_msg_and_die("applet not found"); }
char *problem_data_get_content_or_die(problem_data_t *problem_data, const char *key) { struct problem_item *item = problem_data_get_item_or_NULL(problem_data, key); if (!item) error_msg_and_die(_("Essential element '%s' is missing, can't continue"), key); return item->content; }