source: src-sh/pbi-manager10/wrapper/main.c @ 651bd28

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2
Last change on this file since 651bd28 was 651bd28, checked in by Kris Moore <kris@…>, 11 months ago

Add a new pbi-manager10 copy, this will be used for FreeBSD > 10

  • Property mode set to 100644
File size: 4.0 KB
Line 
1#include <sys/types.h>
2#include <sys/fcntl.h>
3#include <sys/param.h>
4#include <sys/sysctl.h>
5#include <err.h>
6#include <stdlib.h>
7#include <stdint.h>
8#include <stdio.h>
9#include <string.h>
10#include <unistd.h>
11#include <paths.h>
12
13#define MAX_SIZE 9012
14
15int main(int argc, char **argv)
16{
17    // Setup our vars
18    char *progdir = NULL;
19    char *progtarget = NULL;
20    char newpath[MAX_SIZE];
21    char newlibdir[MAX_SIZE];
22    char newtarget[MAX_SIZE];
23
24    // Setup working variables
25    char bfile[PATH_MAX];
26    char tfilepath[PATH_MAX];
27    FILE *tfile; 
28    char *optline;
29    char *bufptr;
30    char buf[1024];
31    char cmpstr[1024];
32
33    if ( strlen(argv[0]) > PATH_MAX ) {
34       exit(2);
35    }
36
37    // Lets use sysctl to figure out where we are
38    int mib[4];
39    mib[0] = CTL_KERN;
40    mib[1] = KERN_PROC;
41    mib[2] = KERN_PROC_PATHNAME;
42    mib[3] = -1;
43    char mypath[1024];
44    size_t cb = sizeof(mypath);
45    sysctl(mib, 4, mypath, &cb, NULL, 0);
46
47    if ( mypath[0] == 0 )
48      strcpy(mypath, argv[0]);
49   
50    // Figure out where we are
51    if (realpath(mypath, bfile) == NULL) {
52       perror("Could not determine realpath...");
53       return -1;
54    }
55
56    // Set the target file path
57    strcpy(tfilepath, bfile);
58    strcat(tfilepath, ".pbiopt");
59
60    // Open target file
61    tfile = fopen(tfilepath, "r");
62    if ( tfile == NULL ) {
63       printf("Missing pbi options file: %s\n", tfilepath);
64       return -1;
65    }
66
67    // Read in .pbiopt file
68    while ( (optline = fgets(buf, sizeof(buf), tfile)) != NULL ) {
69       strcpy(cmpstr, "PROGDIR:"); 
70       if ( ! strncmp(cmpstr, buf, strlen(cmpstr))) {
71          bufptr = strdup(buf);
72          progdir = strsep(&bufptr, " ");
73          progdir = strsep(&bufptr, " ");
74       }
75
76       strcpy(cmpstr, "TARGET:"); 
77       if ( ! strncmp(cmpstr, buf, strlen(cmpstr))) {
78          bufptr = strdup(buf);
79          progtarget = strsep(&bufptr, " ");
80          progtarget = strsep(&bufptr, " ");
81       }
82   
83    }
84    fclose(tfile);
85
86    if ( progdir == NULL ) {
87       printf("Missing PROGDIR:");
88       return -1;
89    }
90    if ( progtarget == NULL ) {
91       printf("Missing TARGET:");
92       return -1;
93    }
94
95
96    // Now check for .ldhints file
97    strcpy(tfilepath, bfile);
98    strcat(tfilepath, ".ldhints");
99
100    // Open ldhints file
101    tfile = fopen(tfilepath, "r");
102    if ( tfile != NULL ) {
103      if( (optline = fgets(buf, sizeof(buf), tfile)) != NULL ) {
104         if ( (strlen(buf) + strlen(progdir) + 10) > MAX_SIZE ) {
105           printf("Error: ldhints overflow!");
106           exit(2);
107         }
108         strncpy(newlibdir, buf, (strlen(buf) -1));
109         strcat(newlibdir, ":"); 
110      }
111      fclose(tfile);
112    }
113
114    // Build the LDPATH
115    strncat(newlibdir, progdir, (strlen(progdir) -1 ));
116    strcat(newlibdir, "/lib"); 
117
118    // Sanity check newpath size before allocating
119    if ( MAX_SIZE < ((strlen(progdir) + 10) * 3) + strlen(getenv("PATH")) ) {
120       printf("PATH size overflow...");
121       exit(2);
122    }
123
124    // Build the PATH
125    strncpy(newpath, progdir, (strlen(progdir) -1 ));
126    strcat(newpath, "/bin:");
127    strncat(newpath, progdir, (strlen(progdir) -1 ));
128    strcat(newpath, "/sbin:");
129    strncat(newpath, progdir, (strlen(progdir) -1 ));
130    strcat(newpath, "/libexec:");
131    strcat(newpath, getenv("PATH"));
132
133    // Set environment vars
134    setenv("PATH", newpath, 1);
135    setenv("LD_LIBRARY_PATH", newlibdir, 1);
136    setenv("LD_32_LIBRARY_PATH", newlibdir, 1);
137
138    // Set the target
139    strncpy(newtarget, progdir, strlen(progdir) -1 );
140    strcat(newtarget, "/");
141    strncat(newtarget, progtarget, strlen(progtarget) -1 );
142
143    // Enable for debug
144    //printf( "PATH: %s\n", newpath);
145    //printf( "LDPATH: %s\n", newlibdir);
146    //printf( "Running: %s \n", newtarget);
147    //return system(newtarget);
148    //strncpy(argv[0], newtarget);
149
150    // Build new target argv
151    char *targv[argc+1];
152    targv[0] = newtarget;
153    int i=1;
154    while(i < argc){
155      targv[i] = argv[i];
156      //printf( "Arg: %s \n", targv[i]);
157      i++;
158    }
159    targv[i] = '\0';
160
161    return execv(newtarget, targv);
162}
Note: See TracBrowser for help on using the repository browser.