static void try_to_open_dso(struct dso *dso, struct machine *machine) { enum dso_binary_type binary_type_data[] = { DSO_BINARY_TYPE__BUILD_ID_CACHE, DSO_BINARY_TYPE__SYSTEM_PATH_DSO, DSO_BINARY_TYPE__NOT_FOUND, }; int i = 0; if (dso->data.fd >= 0) return; if (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND) { dso->data.fd = open_dso(dso, machine); goto out; } do { dso->binary_type = binary_type_data[i++]; dso->data.fd = open_dso(dso, machine); if (dso->data.fd >= 0) goto out; } while (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND); out: if (dso->data.fd >= 0) dso->data.status = DSO_DATA_STATUS_OK; else dso->data.status = DSO_DATA_STATUS_ERROR; }
int dso__data_fd(struct dso *dso, struct machine *machine) { static enum dso_binary_type binary_type_data[] = { DSO_BINARY_TYPE__BUILD_ID_CACHE, DSO_BINARY_TYPE__SYSTEM_PATH_DSO, DSO_BINARY_TYPE__NOT_FOUND, }; int i = 0; if (dso->data_type != DSO_BINARY_TYPE__NOT_FOUND) return open_dso(dso, machine); do { int fd; dso->data_type = binary_type_data[i++]; fd = open_dso(dso, machine); if (fd >= 0) return fd; } while (dso->data_type != DSO_BINARY_TYPE__NOT_FOUND); return -EINVAL; }
int TwsDL::setup( const ConfigTwsdo &c ) { cfg = c; pacingControl.setPacingTime( cfg.tws_maxRequests, cfg.tws_pacingInterval, cfg.tws_minPacingTime ); pacingControl.setViolationPause( cfg.tws_violationPause ); // try loading DSOs before anything else if( cfg.strat_file ) { // for the moment we assume that the lt's load path is // set up correctly or that the user has given an // absolute file, if not just do fuckall if( (strat = open_dso( cfg.strat_file, this )) == NULL ) { return -1; } } if( initWork() < 0 ) { return -1; } return 0; }
static int undo_one (void **p, void *info) { struct prelink_entry *ent = * (struct prelink_entry **) p; DSO *dso; struct stat64 st; struct prelink_link *hardlink; char *move = NULL; size_t movelen = 0; if (ent->done != 2) return 1; if (ent->type != ET_DYN && (ent->type != ET_EXEC || libs_only)) return 1; dso = open_dso (ent->canon_filename); if (dso == NULL) goto error_out; if (fstat64 (dso->fd, &st) < 0) { error (0, errno, "%s changed during prelinking", ent->filename); goto error_out; } if (st.st_dev != ent->dev || st.st_ino != ent->ino) { error (0, 0, "%s changed during prelinking", ent->filename); goto error_out; } if (verbose) { if (dry_run) printf ("Would undo %s\n", ent->canon_filename); else printf ("Undoing %s\n", ent->canon_filename); } if (prelink_undo (dso)) goto error_out; if (dry_run) close_dso (dso); else { if (update_dso (dso, NULL)) { dso = NULL; goto error_out; } } dso = NULL; /* Redo hardlinks. */ for (hardlink = ent->hardlink; hardlink; hardlink = hardlink->next) { size_t len; if (lstat64 (hardlink->canon_filename, &st) < 0) { error (0, 0, "Could not stat %s (former hardlink to %s)", hardlink->canon_filename, ent->canon_filename); continue; } if (st.st_dev != ent->dev || st.st_ino != ent->ino) { error (0, 0, "%s is no longer hardlink to %s", hardlink->canon_filename, ent->canon_filename); continue; } if (verbose) { if (dry_run) printf ("Would link %s to %s\n", hardlink->canon_filename, ent->canon_filename); else printf ("Linking %s to %s\n", hardlink->canon_filename, ent->canon_filename); } len = strlen (hardlink->canon_filename); if (len + sizeof (".#prelink#") > movelen) { movelen = len + sizeof (".#prelink#"); move = realloc (move, movelen); if (move == NULL) { error (0, ENOMEM, "Could not hardlink %s to %s", hardlink->canon_filename, ent->canon_filename); movelen = 0; continue; } } memcpy (mempcpy (move, hardlink->canon_filename, len), ".#prelink#", sizeof (".#prelink#")); if (rename (hardlink->canon_filename, move) < 0) { error (0, errno, "Could not hardlink %s to %s", hardlink->canon_filename, ent->canon_filename); continue; } if (link (ent->canon_filename, hardlink->canon_filename) < 0) { error (0, errno, "Could not hardlink %s to %s", hardlink->canon_filename, ent->canon_filename); if (rename (move, hardlink->canon_filename) < 0) { error (0, errno, "Could not rename %s back to %s", move, hardlink->canon_filename); } continue; } if (unlink (move) < 0) { error (0, errno, "Could not unlink %s", move); continue; } } free (move); return 1; error_out: if (dso) close_dso (dso); (*(int *)info)++; return 1; }
int rpmDoDigest(int algo, const char * fn,int asAscii, unsigned char * digest, rpm_loff_t * fsizep) { const char * path; urltype ut = urlPath(fn, &path); unsigned char * dig = NULL; size_t diglen; unsigned char buf[32*BUFSIZ]; FD_t fd; rpm_loff_t fsize = 0; pid_t pid = 0; int rc = 0; int fdno; fdno = open_dso(path, &pid, &fsize); if (fdno < 0) { rc = 1; goto exit; } switch(ut) { case URL_IS_PATH: case URL_IS_UNKNOWN: case URL_IS_HTTPS: case URL_IS_HTTP: case URL_IS_FTP: case URL_IS_HKP: case URL_IS_DASH: default: /* Either use the pipe to prelink -y or open the URL. */ fd = (pid != 0) ? fdDup(fdno) : Fopen(fn, "r.ufdio"); (void) close(fdno); if (fd == NULL || Ferror(fd)) { rc = 1; if (fd != NULL) (void) Fclose(fd); break; } fdInitDigest(fd, algo, 0); fsize = 0; while ((rc = Fread(buf, sizeof(buf[0]), sizeof(buf), fd)) > 0) fsize += rc; fdFiniDigest(fd, algo, (void **)&dig, &diglen, asAscii); if (dig == NULL || Ferror(fd)) rc = 1; (void) Fclose(fd); break; } /* Reap the prelink -y helper. */ if (pid) { int status; (void) waitpid(pid, &status, 0); if (!WIFEXITED(status) || WEXITSTATUS(status)) rc = 1; } exit: if (fsizep) *fsizep = fsize; if (!rc) memcpy(digest, dig, diglen); dig = _free(dig); return rc; }