static int parse_header(const char* line, const mapinfo* prev, mapinfo** mi) { unsigned long start; unsigned long end; char name[128]; int name_pos; int is_bss = 0; if (sscanf(line, "%lx-%lx %*s %*x %*x:%*x %*d%n", &start, &end, &name_pos) != 2) { *mi = NULL; return -1; } while (isspace(line[name_pos])) { name_pos += 1; } if (line[name_pos]) { strncpy(name, line + name_pos, sizeof(name)); } else { if (prev && start == prev->end && is_library(prev->name)) { // anonymous mappings immediately adjacent to shared libraries // usually correspond to the library BSS segment, so we use the // library's own name strncpy(name, prev->name, sizeof(name)); is_bss = 1; } else { strncpy(name, "[anon]", sizeof(name)); } } name[sizeof(name) - 1] = '\0'; // Assure we're null-terminated. const int name_size = strlen(name) + 1; struct mapinfo* info = reinterpret_cast<mapinfo*>(calloc(1, sizeof(mapinfo) + name_size)); if (info == NULL) { fprintf(stderr, "out of memory\n"); exit(1); } info->start = start; info->end = end; info->is_bss = is_bss; info->count = 1; memcpy(info->name, name, name_size); *mi = info; return 0; }
/* save the PKGBUILD file */ static void save_PKGBUILD(char * directory) { char email_address[BLOCK_SIZE]; char project_name[BLOCK_SIZE]; char project_type[BLOCK_SIZE]; char version[BLOCK_SIZE]; char release[BLOCK_SIZE]; char description[BLOCK_SIZE]; char homepage[BLOCK_SIZE]; char license[BLOCK_SIZE]; char depends[BLOCK_SIZE]; char build_depends[BLOCK_SIZE]; char source_package[BLOCK_SIZE]; char filename[BLOCK_SIZE]; FILE * fp; char * package_list[MAX_FILES]; char optional_depends[BLOCK_SIZE]; int i, no_of_packages; sprintf(filename, "%s%cPKGBUILD", directory, DIRECTORY_SEPARATOR); fp = fopen(filename,"w"); if (!fp) return; get_setting("email", email_address); get_setting("project name", project_name); get_setting("project type", project_type); get_setting("version", version); get_setting("release", release); get_setting("description", description); get_setting("homepage",homepage); get_setting("license",license); get_setting("depends arch",depends); get_setting("suggests arch",optional_depends); get_setting("build arch",build_depends); get_setting("source package",source_package); fprintf(fp, "# Maintainer: %s\n", email_address); fprintf(fp, "pkgname=%s\n",project_name); fprintf(fp, "pkgver=%s\n", version); fprintf(fp, "pkgrel=%s\n", release); fprintf(fp, "pkgdesc=\"%s\"\n", description); if (is_script_language(project_type) == 0) { fprintf(fp, "%s", "arch=('i686' 'x86_64')\n"); } else { fprintf(fp, "%s", "arch=('any')\n"); } fprintf(fp, "url=\"%s\"\n",homepage); fprintf(fp, "license=('%s')\n",license); fprintf(fp, "%s","groups=()\n"); fprintf(fp, "%s", "depends=("); no_of_packages = separate_files(depends, package_list, MAX_FILES); for (i = 0; i < no_of_packages; i++) { if (i > 0) { fprintf(fp, "%s", " "); } fprintf(fp, "'%s'", package_list[i]); free(package_list[i]); } fprintf(fp,"%s",")\n"); fprintf(fp, "%s", "makedepends=("); no_of_packages = separate_files(build_depends, package_list, MAX_FILES); for (i = 0; i < no_of_packages; i++) { if (i > 0) { fprintf(fp, "%s", " "); } fprintf(fp, "'%s'", package_list[i]); free(package_list[i]); } fprintf(fp,"%s",")\n"); fprintf(fp, "%s", "optdepends=("); no_of_packages = separate_files(optional_depends, package_list, MAX_FILES); for (i = 0; i < no_of_packages; i++) { if (i > 0) { fprintf(fp, "%s", " "); } fprintf(fp, "'%s'", package_list[i]); free(package_list[i]); } fprintf(fp,"%s",")\n"); fprintf(fp, "%s", "provides=()\n"); fprintf(fp, "%s", "conflicts=()\n"); fprintf(fp, "%s", "replaces=()\n"); fprintf(fp, "%s", "backup=()\n"); fprintf(fp, "%s", "options=()\n"); fprintf(fp, "%s", "install=\n"); fprintf(fp, "%s", "changelog=\n"); if (strlen(source_package) == 0) { fprintf(fp, "%s", "source=($pkgname-$pkgver.tar.gz)\n"); } else { fprintf(fp, "source=(%s)\n",source_package); } fprintf(fp, "%s", "noextract=()\n"); fprintf(fp, "%s", "md5sums=()\n"); fprintf(fp, "%s", "build() {\n"); fprintf(fp, "%s", " cd \"$srcdir/$pkgname-$pkgver\"\n"); fprintf(fp, "%s", " ./configure --prefix=/usr\n"); fprintf(fp, "%s", " make\n"); fprintf(fp, "%s", "}\n"); fprintf(fp, "%s", "package() {\n"); fprintf(fp, "%s", " cd \"$srcdir/$pkgname-$pkgver\"\n"); if (is_library(project_name) == 0) { fprintf(fp, "%s", " make DESTDIR=\"$pkgdir/\" PREFIX=\"/usr\" install\n"); } else { fprintf(fp, "%s", " make DESTDIR=\"$pkgdir/\" PREFIX=\"/usr\" instlib\n"); } fprintf(fp, "%s", "}\n"); if (is_library(project_name) != 0) { fprintf(fp, "%s", "post_install() {\n"); fprintf(fp, "%s", " ln -sf /usr/lib/$pkgname-$pkgver.so.0.0.$pkgrel " \ "/usr/lib/$pkgname.so.0\n"); fprintf(fp, "%s", " ln -sf /usr/lib/$pkgname-$pkgver.so.0.0.$pkgrel " \ "/usr/lib/$pkgname.so\n"); fprintf(fp, "%s", " ldconfig\n"); fprintf(fp, "%s", "}\n"); fprintf(fp, "%s", "post_remove() {\n"); fprintf(fp, "%s", " ldconfig\n"); fprintf(fp, "%s", "}\n"); } fclose(fp); }
static int save_spec(char * project_directory, char * directory, int no_of_binaries, char ** binaries) { char filename[BLOCK_SIZE]; char project_name[BLOCK_SIZE]; char project_type[BLOCK_SIZE]; char version[BLOCK_SIZE]; char description_brief[BLOCK_SIZE]; char description[BLOCK_SIZE]; char homepage[BLOCK_SIZE]; char email_address[BLOCK_SIZE]; char requires[BLOCK_SIZE]; char requires_distro[BLOCK_SIZE]; char build_requires[BLOCK_SIZE]; char build_requires_distro[BLOCK_SIZE]; char license[BLOCK_SIZE]; char svg_filename[BLOCK_SIZE]; char source_package[BLOCK_SIZE]; char categories[BLOCK_SIZE]; char release[BLOCK_SIZE]; char commandline[BLOCK_SIZE]; char * directories[MAX_FILES]; char group_main[BLOCK_SIZE]; char group_additional[BLOCK_SIZE]; FILE * fp; int i,j=0,no_of_directories; const char * dayname[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; const char * monthname[] = { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" }; time_t rawtime; struct tm * timeinfo; int year,month,day,weekday; /* get the current year */ time(&rawtime); timeinfo = localtime(&rawtime); year = timeinfo->tm_year + 1900; month = timeinfo->tm_mon; day = timeinfo->tm_mday; weekday = timeinfo->tm_wday; get_setting("project name", project_name); if (strlen(project_name) == 0) return -1; sprintf(filename,"%s%c%s.spec", directory, DIRECTORY_SEPARATOR, project_name); /* don't overwrite existing spec file */ if (file_exists(filename) != 0) return 0; fp = fopen(filename,"w"); if (!fp) return -1; get_setting("version", version); get_setting("description brief", description_brief); get_setting("description", description); get_setting("license", license); get_setting("homepage", homepage); get_setting("email", email_address); get_setting("depends rpm", requires); get_setting("depends rpm distro", requires_distro); get_setting("build rpm", build_requires); get_setting("build rpm distro", build_requires_distro); get_setting("source package", source_package); get_setting("categories", categories); get_setting("release", release); get_setting("commandline", commandline); get_setting("project type", project_type); fprintf(fp, "Name: %s\n", project_name); fprintf(fp, "Version: %s\n", version); fprintf(fp, "Release: %s%%{?dist}\n", release); fprintf(fp, "Summary: %s\n", description_brief); fprintf(fp, "License: %s\n", license); fprintf(fp, "URL: %s\n", homepage); fprintf(fp, "Packager: %s\n", email_address); if (strlen(source_package) > 0) { fprintf(fp, "Source0: %s\n", source_package); } else { fprintf(fp, "%s", "Source0: http://yourdomainname.com/src/" \ "%{name}_%{version}.orig.tar.gz\n"); } if (is_script_language(project_type) != 0) { fprintf(fp, "%s", "BuildArch: noarch\n"); } if (strlen(categories) > 0) { parse_desktop_category(categories, group_main, group_additional); fprintf(fp, "Group: %s/%s\n", group_main,group_additional); } else { fprintf(fp,"%s","Group: Application/Utility\n"); } conditional_requires(fp, "Requires", requires, requires_distro); conditional_requires(fp, "BuildRequires", build_requires, build_requires_distro); fprintf(fp, "%s", "\n%description\n"); save_description(fp, description, 0); sprintf(svg_filename, "%s%cdesktop%cicon.svg", project_directory, DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR); fprintf(fp, "%s", "\n%prep\n"); fprintf(fp, "%s", "%setup -q\n\n"); fprintf(fp, "%s", "%build\n"); fprintf(fp, "%s", "%configure\n"); fprintf(fp, "%s", "make %{?_smp_mflags}\n\n"); fprintf(fp, "%s", "%install\n"); fprintf(fp, "%s", "rm -rf %{buildroot}\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/etc\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/etc/%{name}\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/bin\n"); /* create directories for binaries */ if (no_of_binaries > 0) { no_of_directories = get_directories(binaries, no_of_binaries, directories); for (i = 0; i < no_of_directories; i++) { if (get_subdirectory_string(directories[i]) != 0) { fprintf(fp, "mkdir -p \"%%{buildroot}/%s\"\n", get_subdirectory_string(directories[i])); } free(directories[i]); } } if (is_library(project_name) != 0) { fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/lib\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/lib/%{name}\n"); } fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/man\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/man/man1\n"); if (strlen(commandline) == 0) { fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/%{name}\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/applications\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/icons\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/icons/hicolor\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/icons/hicolor/24x24\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/icons/hicolor/24x24/apps\n\n"); if (strlen(svg_filename) > 0) { fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/pixmaps\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/icons/hicolor/scalable\n"); fprintf(fp, "%s", "mkdir -p %{buildroot}/usr/share/icons/hicolor/scalable/apps\n"); } } fprintf(fp, "%s", "# Make install but to the RPM BUILDROOT directory\n"); if (is_library(project_name) == 0) { fprintf(fp, "%s", "make install -B DESTDIR=%{buildroot} PREFIX=/usr\n\n"); } else { fprintf(fp, "%s", "make instlib -B DESTDIR=%{buildroot} PREFIX=/usr\n\n"); } fprintf(fp, "%s", "%files\n"); fprintf(fp, "%s", "%doc README.md LICENSE\n"); fprintf(fp, "%s", "%defattr(-,root,root,-)\n"); /* claim ownership of directories */ no_of_directories = get_directories(binaries, no_of_binaries, directories); for (i = 0; i < no_of_directories; i++) { if (get_subdirectory_string(directories[i]) != 0) { if (contains_char(get_subdirectory_string(directories[i]), ' ') == 0) { fprintf(fp, "%%dir /%s\n",get_subdirectory_string(directories[i])); } else { fprintf(fp, "%%dir \"/%s\"\n",get_subdirectory_string(directories[i])); } } free(directories[i]); } if (strlen(commandline) == 0) { fprintf(fp, "%s", "%dir /usr/share/%{name}\n"); fprintf(fp, "%s", "%dir /usr/share/applications\n"); fprintf(fp, "%s", "%dir /usr/share/icons/hicolor\n"); fprintf(fp, "%s", "%dir /usr/share/icons/hicolor/24x24\n"); fprintf(fp, "%s", "%dir /usr/share/icons/hicolor/24x24/apps\n"); if (strlen(svg_filename) > 0) { fprintf(fp, "%s", "%dir /usr/share/pixmaps\n"); fprintf(fp, "%s", "%dir /usr/share/icons/hicolor/scalable\n"); fprintf(fp, "%s", "%dir /usr/share/icons/hicolor/scalable/apps\n"); } } if (is_script_language(project_type) != 0) { fprintf(fp, "%s", "/usr/share/%{name}/*\n"); } fprintf(fp, "%s", "%{_bindir}/*\n"); fprintf(fp, "%s", "%{_mandir}/man1/*\n"); if (strlen(commandline) == 0) { fprintf(fp, "%s", "%attr(644,root,root) " \ "/usr/share/applications/%{name}.desktop\n"); fprintf(fp, "%s", "%attr(644,root,root) " \ "/usr/share/icons/hicolor/24x24/apps/%{name}.png\n"); if (file_exists(svg_filename) != 0) { fprintf(fp, "%s", "%attr(644,root,root) " \ "/usr/share/icons/hicolor/scalable/apps/%{name}.svg\n"); fprintf(fp, "%s", "%attr(644,root,root) " \ "/usr/share/pixmaps/%{name}.svg\n"); } } if (is_library(project_name) == 0) { /* install some binaries */ for (i = 0; i < no_of_binaries; i++) { if (contains_char(get_subdirectory_string(binaries[i]),' ') == 0) { fprintf(fp, "%%attr(755,root,root) /%s\n", get_subdirectory_string(binaries[i])); } else { fprintf(fp, "%%attr(755,root,root) \"/%s\"\n", get_subdirectory_string(binaries[i])); } } } else { /* install libraries */ for (i = 0; i < no_of_binaries; i++) { fprintf(fp, "%%attr(755,root,root) /usr/lib/%%{name}/%s\n", get_subdirectory_string(binaries[i])); } } fprintf(fp,"%s","\n"); if (is_library(project_name) != 0) { fprintf(fp, "%s", "%post\n"); fprintf(fp, "%s", "umask 007\n"); fprintf(fp, "%s", "ldconfig > /dev/null 2>&1\n"); for (i = 0; i < no_of_binaries; i++) { for (j = strlen(binaries[i])-1; j >= 0; j--) { if (binaries[i][j] == DIRECTORY_SEPARATOR) { j++; break; } } if (file_is_library(&binaries[i][j]) != 0) { fprintf(fp, "ln -sf /usr/lib/%s.0.0.1 /usr/lib/%%{name}/%s\n", &binaries[i][j], &binaries[i][j]); } } fprintf(fp, "%s", "\n"); fprintf(fp, "%s", "%postun\n"); fprintf(fp, "%s", "umask 007\n"); fprintf(fp, "%s", "ldconfig > /dev/null 2>&1\n"); for (i = 0; i < no_of_binaries; i++) { for (j = strlen(binaries[i])-1; j >= 0; j--) { if (binaries[i][j] == DIRECTORY_SEPARATOR) { j++; break; } } if (file_is_library(&binaries[i][j]) != 0) { fprintf(fp, "rm /usr/lib/%s\n", &binaries[i][j]); } } fprintf(fp, "%s", "\n"); } fprintf(fp, "%s", "%changelog\n"); fprintf(fp, "* %s %s %d %d %s\n", dayname[weekday], monthname[month], day, year, email_address); fprintf(fp, "%s", "- Spec file created\n"); fclose(fp); return 0; }
static bool is_linkable_library(const char * file_name){return is_library(file_name);}