Example #1
0
File: main.c Project: petabi/pkgsrc
static int
add_depends_of(const char *pkgname, void *cookie)
{
    FILE *fp;
    plist_t *p;
    package_t plist;
    char *path;

    path = pkgdb_pkg_file(pkgname, CONTENTS_FNAME);
    if ((fp = fopen(path, "r")) == NULL)
        errx(EXIT_FAILURE, "Cannot read %s of package %s",
             CONTENTS_FNAME, pkgname);
    free(path);
    read_plist(&plist, fp);
    fclose(fp);

    for (p = plist.head; p; p = p->next) {
        if (p->type == PLIST_PKGDEP)
            add_required_by(p->name, pkgname);
    }

    free_plist(&plist);

    return 0;
}
Example #2
0
File: main.c Project: petabi/pkgsrc
static void
add_required_by(const char *pattern, const char *required_by)
{
    char *best_installed, *path;
    int fd;
    size_t len;

    best_installed = find_best_matching_installed_pkg(pattern);
    if (best_installed == NULL) {
        warnx("Dependency %s of %s unresolved", pattern, required_by);
        return;
    }

    path = pkgdb_pkg_file(best_installed, REQUIRED_BY_FNAME);
    free(best_installed);

    if ((fd = open(path, O_WRONLY | O_APPEND | O_CREAT, 0644)) == -1)
        errx(EXIT_FAILURE, "Cannot write to %s", path);
    free(path);

    len = strlen(required_by);
    if (write(fd, required_by, len) != (ssize_t)len ||
            write(fd, "\n", 1) != 1 ||
            close(fd) == -1)
        errx(EXIT_FAILURE, "Cannot write to %s", path);
}
Example #3
0
File: main.c Project: petabi/pkgsrc
static int
remove_required_by(const char *pkgname, void *cookie)
{
    char *path;

    path = pkgdb_pkg_file(pkgname, REQUIRED_BY_FNAME);

    if (unlink(path) == -1 && errno != ENOENT)
        err(EXIT_FAILURE, "Cannot remove %s", path);

    free(path);

    return 0;
}
Example #4
0
static FILE *
fopen_contents(const char *pkgname, const char *mode)
{
    char *fname;
    FILE *f;

    fname = pkgdb_pkg_file(pkgname, CONTENTS_FNAME);
    f = fopen(fname, mode);
    if (f == NULL) {
        err(EXIT_FAILURE, "%s", fname);
        /* NOTREACHED */
    }
    free(fname);
    return f;
}
Example #5
0
int
mark_as_automatic_installed(const char *pkg, int value)
{
	char *filename;
	int retval;

	assert(pkg[0] != '/');

	filename = pkgdb_pkg_file(pkg, INSTALLED_INFO_FNAME);

	retval = var_set(filename, AUTOMATIC_VARNAME, value ? "yes" : NULL);

	free(filename);

	return retval;
}
Example #6
0
File: main.c Project: petabi/pkgsrc
static int
set_installed_info_var(const char *name, void *cookie)
{
    struct set_installed_info_arg *arg = cookie;
    char *filename;
    int retval;

    filename = pkgdb_pkg_file(name, INSTALLED_INFO_FNAME);

    retval = var_set(filename, arg->variable, arg->value);

    free(filename);
    arg->got_match = 1;

    return retval;
}
Example #7
0
Boolean
is_automatic_installed(const char *pkg)
{
	char *filename, *value;
	Boolean ret;

	assert(pkg[0] != '/');

	filename = pkgdb_pkg_file(pkg, INSTALLED_INFO_FNAME);

	value = var_get(filename, AUTOMATIC_VARNAME);

	if (value && strcasecmp(value, "yes") == 0)
	    ret = TRUE;
	else
	    ret = FALSE;
	
	free(value);
	free(filename);

	return ret;
}
Example #8
0
File: main.c Project: petabi/pkgsrc
/*
 * add1pkg(<pkg>)
 *	adds the files listed in the +CONTENTS of <pkg> into the
 *	pkgdb.byfile.db database file in the current package dbdir.  It
 *	returns the number of files added to the database file.
 */
static int
add_pkg(const char *pkgdir, void *vp)
{
    FILE	       *f;
    plist_t	       *p;
    package_t	Plist;
    char 	       *contents;
    char *PkgName, *dirp;
    char 		file[MaxPathSize];
    struct pkgdb_count *count;

    if (!pkgdb_open(ReadWrite))
        err(EXIT_FAILURE, "cannot open pkgdb");

    count = vp;
    ++count->packages;

    contents = pkgdb_pkg_file(pkgdir, CONTENTS_FNAME);
    if ((f = fopen(contents, "r")) == NULL)
        errx(EXIT_FAILURE, "%s: can't open `%s'", pkgdir, CONTENTS_FNAME);
    free(contents);

    read_plist(&Plist, f);
    if ((p = find_plist(&Plist, PLIST_NAME)) == NULL) {
        errx(EXIT_FAILURE, "Package `%s' has no @name, aborting.", pkgdir);
    }

    PkgName = p->name;
    dirp = NULL;
    for (p = Plist.head; p; p = p->next) {
        switch(p->type) {
        case PLIST_FILE:
            if (dirp == NULL) {
                errx(EXIT_FAILURE, "@cwd not yet found, please send-pr!");
            }
            (void) snprintf(file, sizeof(file), "%s/%s", dirp, p->name);
            if (!(isfile(file) || islinktodir(file))) {
                if (isbrokenlink(file)) {
                    warnx("%s: Symlink `%s' exists and is in %s but target does not exist!",
                          PkgName, file, CONTENTS_FNAME);
                } else {
                    warnx("%s: File `%s' is in %s but not on filesystem!",
                          PkgName, file, CONTENTS_FNAME);
                }
            } else {
                pkgdb_store(file, PkgName);
                ++count->files;
            }
            break;
        case PLIST_PKGDIR:
            add_pkgdir(PkgName, dirp, p->name);
            ++count->directories;
            break;
        case PLIST_CWD:
            if (strcmp(p->name, ".") != 0)
                dirp = p->name;
            else
                dirp = pkgdb_pkg_dir(pkgdir);
            break;
        case PLIST_IGNORE:
            p = p->next;
            break;
        case PLIST_SHOW_ALL:
        case PLIST_SRC:
        case PLIST_CMD:
        case PLIST_CHMOD:
        case PLIST_CHOWN:
        case PLIST_CHGRP:
        case PLIST_COMMENT:
        case PLIST_NAME:
        case PLIST_UNEXEC:
        case PLIST_DISPLAY:
        case PLIST_PKGDEP:
        case PLIST_DIR_RM:
        case PLIST_OPTION:
        case PLIST_PKGCFL:
        case PLIST_BLDDEP:
            break;
        }
    }
    free_plist(&Plist);
    fclose(f);
    pkgdb_close();

    return 0;
}
Example #9
0
/*
 * Assumes CWD is in /var/db/pkg/<pkg>!
 */
static void 
check1pkg(const char *pkgdir, int *filecnt, int *pkgcnt)
{
	FILE   *f;
	plist_t *p;
	package_t Plist;
	char   *PkgName, *dirp = NULL, *md5file;
	char    file[MaxPathSize];
	char   *content;

	content = pkgdb_pkg_file(pkgdir, CONTENTS_FNAME);
	f = fopen(content, "r");
	if (f == NULL)
		err(EXIT_FAILURE, "can't open %s", content);
	free(content);

	read_plist(&Plist, f);
	p = find_plist(&Plist, PLIST_NAME);
	if (p == NULL)
		errx(EXIT_FAILURE, "Package %s has no @name, aborting.",
		    pkgdir);
	PkgName = p->name;
	for (p = Plist.head; p; p = p->next) {
		switch (p->type) {
		case PLIST_FILE:
			if (dirp == NULL) {
				warnx("dirp not initialized, please send-pr!");
				abort();
			}
			
			(void) snprintf(file, sizeof(file), "%s/%s", dirp, p->name);

			if (isfile(file) || islinktodir(file)) {
				if (p->next && p->next->type == PLIST_COMMENT) {
					if (strncmp(p->next->name, CHECKSUM_HEADER, ChecksumHeaderLen) == 0) {
						if ((md5file = MD5File(file, NULL)) != NULL) {
							/* Mismatch? */
							if (strcmp(md5file, p->next->name + ChecksumHeaderLen) != 0)
								printf("%s fails MD5 checksum\n", file);

							free(md5file);
						}
					} else if (strncmp(p->next->name, SYMLINK_HEADER, SymlinkHeaderLen) == 0) {
						char	buf[MaxPathSize + SymlinkHeaderLen];
						int	cc;

						(void) strlcpy(buf, SYMLINK_HEADER, sizeof(buf));
						if ((cc = readlink(file, &buf[SymlinkHeaderLen],
							  sizeof(buf) - SymlinkHeaderLen - 1)) < 0) {
							warnx("can't readlink `%s'", file);
						} else {
							buf[SymlinkHeaderLen + cc] = 0x0;
							if (strcmp(buf, p->next->name) != 0) {
								printf("symlink (%s) is not same as recorded value, %s: %s\n",
								    file, buf, p->next->name);
							}
						}
					}
				}
				
				(*filecnt)++;
			} else if (isbrokenlink(file)) {
				warnx("%s: Symlink `%s' exists and is in %s but target does not exist!", PkgName, file, CONTENTS_FNAME);
			} else {
				warnx("%s: File `%s' is in %s but not on filesystem!", PkgName, file, CONTENTS_FNAME);
			}
			break;
		case PLIST_CWD:
			if (strcmp(p->name, ".") != 0)
				dirp = p->name;
			else
				dirp = pkgdb_pkg_dir(pkgdir);
			break;
		case PLIST_IGNORE:
			p = p->next;
			break;
		case PLIST_SHOW_ALL:
		case PLIST_SRC:
		case PLIST_CMD:
		case PLIST_CHMOD:
		case PLIST_CHOWN:
		case PLIST_CHGRP:
		case PLIST_COMMENT:
		case PLIST_NAME:
		case PLIST_UNEXEC:
		case PLIST_DISPLAY:
		case PLIST_PKGDEP:
		case PLIST_DIR_RM:
		case PLIST_OPTION:
		case PLIST_PKGCFL:
		case PLIST_BLDDEP:
		case PLIST_PKGDIR:
			break;
		}
	}
	free_plist(&Plist);
	fclose(f);
	(*pkgcnt)++;
}