All pastes #1425947 Raw Edit

autounmask

public text v1 · immutable
#1425947 ·published 2009-05-17 23:54 UTC
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);
}