rendered paste body#include<iostream>
#include<stdio.h>
#include<cstdlib>
#include<string>
#include<cctype>
#include<sys/types.h>
using namespace std;
void addf(string ,string ,string);
int main(int argc, char *argv[])
{
string cmd("emerge -puDN ");
string::size_type p0;
string cmd0;
if (argc>=2) {
for(int i=1;i<argc;i++) cmd0 += string(argv[i])+" ";
} else {
cmd0= "world";
}
if(cmd0.size() >=256) {
cout<<"illegal input "<<cmd0<<endl;
exit(0);
}
string cesc(";&|[]\\\0");
for(int ii=0;ii<cesc.size();ii++){
p0=cmd0.find(cesc[ii],0);
if(p0 != string::npos || cmd0.find(">>",0) !=string::npos || cmd0.find("<<",0)!=string::npos) {
cout<<"illegal input("<<cesc[ii]<<"1) "<<cmd0<<endl;
exit(0);
}
}
for(int ii=0;ii<cmd0.size();ii++){
unsigned char c0=cmd0.at(ii);
if ( !( isalnum(c0) || c0== (unsigned char) '-' || c0== (unsigned char) '/' || c0== (unsigned char) '_' || c0==(unsigned char) '+'|| c0=='.' || c0 ==' ')) {
cout<<"illegal input("<<c0<<"2) "<<cmd0<<endl;
exit(0);
}
}
cmd0 =cmd+cmd0;
cmd = cmd0 +" |egrep -e \"no ebuilds|masked by\"";
FILE *f0;
char *linebuf=NULL;
size_t ln=0,ln2;
string s1_last;
do{
f0=popen(cmd.c_str(),"r");
if(f0==NULL) {
cout<<"Can not run cmd: "<<cmd<<endl;
}
ln2=getline(&linebuf, &ln,f0);
pclose(f0);
string s0(linebuf);
string s00("qatom");
size_t i;
p0=s0.find('-',(unsigned int) 0);
if (p0== string::npos) break;
p0+=1;
p0=s0.find(' ',(unsigned int) p0);
if (p0== string::npos) break;
string::size_type p1=s0.find(' ',(unsigned int) p0+1);
if (p1== string::npos) break;
s00 += s0.substr(p0,p1-p0);
f0=popen(s00.c_str(),"r");
if(f0==NULL) {
cout<<"Can not run cmd: "<<s00<<endl;
}
ln2=getline(&linebuf, &ln,f0);
pclose(f0);
string s2=string(linebuf);
//cout<<"s0= "<<s0<<endl;
p0=s2.find(' ',(unsigned int) p0);
if (p0== string::npos) break;
p1=s2.find(' ',(unsigned int) p0+1);
if (p1== string::npos) break;
string s1=s2.substr(0,p0)+'/'+s2.substr(p0+1,p1-p0-1);
if( s1==s1_last) {
cout<<" atom "<<s1<<" is repeated\n";
exit(0);
}
int addk=0,addm=0;
string smissing("missing keyword"),sk("keyword"),sm(".mask");
p0=s0.find(smissing,p1);
if( p0 != string::npos) addf(s1,string(".keywords"),string(" **")); else {
p0=s0.find(sk,p1);
if( p0 != string::npos) addf(s1,string(".keywords"),string(""));
}
p0=s0.find(sm,p1);
if( p0 != string::npos) addf(s1,string(".unmask"),string(""));
s1_last=s1;
} while (ln2>2);
system(cmd0.c_str());
return 0;
}
void addf(string s1,string fp0,string keywords)
{
//cout<<"s00= "<<s00<<endl;
static string s1_last;
cout<<"Adding "<<s1<<" to package"<<fp0<<" : "<<keywords<<endl;
string fp1("/etc/portage/package");
fp1 +=fp0;
string cmd2("tail -1 ");
cmd2 += fp1;
FILE *f0=popen(cmd2.c_str(),"r");
if(f0==NULL) {
cout<<"Can not run cmd: "<<cmd2<<endl;
}
char *linebuf=NULL;
size_t ln=0;
size_t ln2=getline(&linebuf, &ln,f0);
pclose(f0);
string s2(linebuf);
s2=s2.substr(0,s2.size()-1);
//cout<<"s1= "<<s1<<" s2= "<<s2<<endl;
//cout<<"s1= "<<s1.size()<<" s2= "<<s2.size()<<endl;
FILE *f2;
f2=fopen(fp1.c_str(),"a+");
fprintf(f2,"%s%s\n",s1.c_str(),keywords.c_str());
fclose(f2);
}