0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 
0013 
0014 
0015 
0016 
0017 
0018 
0019 
0020 
0021 
0022 
0023 
0024 
0025 
0026 
0027 
0028 
0029 
0030 
0031 
0032 
0033 
0034 #define __USE_POSIX_IMPLICITLY
0035 #include <ndrstandard.h>
0036 #include <unistd.h>
0037 #include <pscript.h>
0038 #include <time.h>
0039 #include <stdlib.h>
0040 #include <stdio.h>
0041 #include <psstdexutil.h>
0042 #include <ndebug.h>
0043 #include <nstdutil.h>
0044 #include <userlog.h>
0045 #include <string.h>
0046 #include <ndrx_config.h>
0047 #include <sys/stat.h>
0048 #include <errno.h>
0049 #include <netdb.h>
0050 
0051 
0052 #define _XOPEN_SOURCE_EXTENDED 1
0053 #include <libgen.h>
0054 
0055 extern "C" const char ndrx_G_resource_WizardBase[];
0056 
0057 
0058 
0059 static PSInteger _exutil_getline(HPSCRIPTVM v)
0060 {
0061     char ln[PATH_MAX+1];
0062     
0063     ndrx_fgets_stdin_strip(ln, sizeof(ln));
0064     
0065     ps_pushstring(v,ln,-1);
0066 
0067     return 1;
0068 }
0069 
0070 
0071 static PSInteger _exutil_getosname(HPSCRIPTVM v)
0072 {
0073     ps_pushstring(v,NDRX_BUILD_OS_NAME,-1);
0074     
0075     return 1;
0076 }
0077 
0078 
0079 static PSInteger _exutil_getpoller(HPSCRIPTVM v)
0080 {
0081     ps_pushstring(v,EX_POLLER_STR,-1);
0082     
0083     return 1;
0084 }
0085 
0086 
0087 static PSInteger _exutil_getwizardbase(HPSCRIPTVM v)
0088 {
0089     ps_pushstring(v,ndrx_G_resource_WizardBase,-1);
0090     
0091     return 1;
0092 }
0093 
0094 
0095 
0096 
0097 static PSInteger _exutil_getcwd(HPSCRIPTVM v)
0098 {
0099     char* ret;
0100     char buff[PATH_MAX + 1];
0101     
0102     ret = getcwd( buff, sizeof(buff) );
0103      
0104     ps_pushstring(v,ret,-1);
0105     
0106     
0107     return 1;
0108 }
0109 
0110 
0111 
0112 static PSInteger _exutil_fileexists(HPSCRIPTVM v)
0113 {
0114     const PSChar *s;
0115     PSBool b;
0116     
0117     if(PS_SUCCEEDED(ps_getstring(v,2,&s))) {
0118         
0119         if (ndrx_file_exists((char *)s))
0120         {
0121             b = PSTrue;
0122         }
0123         else
0124         {
0125             b = PSFalse;
0126         }
0127         
0128         ps_pushbool(v, b);
0129     }
0130     
0131     return 1;
0132 }
0133 
0134 
0135 
0136 static PSInteger _exutil_userlog(HPSCRIPTVM v)
0137 {
0138     const PSChar *s;
0139     if(PS_SUCCEEDED(ps_getstring(v,2,&s))){
0140         
0141         userlog_const (s);
0142         
0143         return 1;
0144     }
0145     return 0;
0146 }
0147 
0148 static PSInteger _exutil_chmod(HPSCRIPTVM v)
0149 {
0150     const PSChar *file;
0151     const PSChar *mode;
0152     char err[256];
0153     
0154     if(PS_SUCCEEDED(ps_getstring(v,2,&file)) &&
0155         PS_SUCCEEDED(ps_getstring(v,3,&mode))) {
0156         
0157         int mod;
0158         sscanf(mode, "%o", &mod);
0159         
0160         if (EXSUCCEED!=chmod(file, mod))
0161         {
0162             snprintf(err, sizeof(err), "chmod failed: %d:%s", 
0163                     errno, strerror(errno));
0164             return ps_throwerror(v,err);
0165         }
0166         
0167         
0168         return 1;
0169     }
0170     return 0;
0171 }
0172 
0173 
0174 
0175 
0176 
0177 static PSInteger _exutil_mkdir(HPSCRIPTVM v)
0178 {
0179     const PSChar *s;
0180     char err[256];
0181     struct stat sb;
0182     
0183     if(PS_SUCCEEDED(ps_getstring(v,2,&s)))
0184     {
0185         
0186         if (stat(s, &sb) != 0 || !S_ISDIR(sb.st_mode))
0187         {
0188             if (EXSUCCEED!=mkdir(s, 0777))
0189             {
0190                 snprintf(err, sizeof(err), "mkdir [%s] failed: %d:%s", 
0191                         s, errno, strerror(errno));
0192                 return ps_throwerror(v,err);
0193             }
0194         }
0195         
0196         return 1;
0197     }
0198     return 0;
0199 }
0200 
0201 
0202 
0203 
0204 
0205 
0206 static PSInteger _exutil_rmdir(HPSCRIPTVM v)
0207 {
0208     const PSChar *s;
0209     char err[256];
0210     
0211     if(PS_SUCCEEDED(ps_getstring(v,2,&s)))
0212     {
0213         if (EXSUCCEED!=rmdir(s))
0214         {
0215             snprintf(err, sizeof(err), "rmdir [%s] failed: %d:%s", 
0216                     s, errno, strerror(errno));
0217             return ps_throwerror(v,err);
0218         }
0219         
0220         return 1;
0221     }
0222     return 0;
0223 }
0224 
0225 
0226 
0227 
0228 
0229 
0230 static PSInteger _exutil_unlink(HPSCRIPTVM v)
0231 {
0232     const PSChar *s;
0233     char err[256];
0234     
0235     if(PS_SUCCEEDED(ps_getstring(v,2,&s)))
0236     {
0237         if (EXSUCCEED!=unlink(s))
0238         {
0239             snprintf(err, sizeof(err), "unlink [%s] failed: %d:%s", 
0240                     s, errno, strerror(errno));
0241             return ps_throwerror(v,err);
0242         }
0243         
0244         return 1;
0245     }
0246     return 0;
0247 }
0248 
0249 
0250 
0251 
0252 
0253 
0254 static PSInteger _exutil_basename(HPSCRIPTVM v)
0255 {
0256     const PSChar *str;
0257     PSInteger memsize;
0258     PSChar * stemp;
0259     
0260     ps_getstring(v,2,&str);
0261     memsize = (ps_getsize(v,2)+1)*sizeof(PSChar);
0262     stemp = ps_getscratchpad(v,memsize);
0263     memcpy(stemp, str, memsize);
0264     
0265     ps_pushstring(v,basename(stemp),-1);
0266     
0267     return 1;
0268 }
0269 
0270 
0271 
0272 
0273 
0274 
0275 static PSInteger _exutil_dirname(HPSCRIPTVM v)
0276 {
0277     const PSChar *str;
0278     PSInteger memsize;
0279     PSChar * stemp;
0280     
0281     ps_getstring(v,2,&str);
0282     memsize = (ps_getsize(v,2)+1)*sizeof(PSChar);
0283     stemp = ps_getscratchpad(v,memsize);
0284     memcpy(stemp, str, memsize);
0285     
0286     ps_pushstring(v,dirname(stemp),-1);
0287     
0288     return 1;
0289 }
0290 
0291 
0292 
0293 
0294 
0295 
0296 
0297 static PSInteger _exutil_hex2int(HPSCRIPTVM v)
0298 {
0299     const PSChar *hex;
0300     long l;
0301     PSInteger ret=EXFAIL;
0302     
0303     ps_getstring(v,2,&hex);
0304     
0305     sscanf(hex, "%lx", &l);
0306     
0307     ret = l;
0308     
0309 out:
0310     
0311     ps_pushinteger(v, ret);
0312 
0313     return 1;
0314 }
0315 
0316 
0317 
0318 
0319 
0320 
0321 
0322 static PSInteger _exutil_rands(HPSCRIPTVM v)
0323 {
0324     PSChar *stemp;
0325     PSInteger len;
0326     char table[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
0327     int i, tablen;
0328     
0329     ps_getinteger(v,2,&len);
0330     
0331     PSInteger memsize = (len+1)*sizeof(PSChar);
0332     stemp = ps_getscratchpad(v,memsize);
0333     
0334     memset(stemp, 0, (len+1)*sizeof(PSChar));
0335     
0336     tablen = strlen(table);
0337     for (i=0; i<len; i++)
0338     {
0339         stemp[i]= table[ndrx_rand() % tablen];
0340     }
0341     
0342     ps_pushstring(v,stemp,-1);
0343     
0344     return 1;
0345 }
0346 
0347 
0348 
0349 
0350 
0351 
0352 
0353 
0354 
0355 
0356 static PSInteger _exutil_parseclopt(HPSCRIPTVM v, int nr_groups)
0357 {
0358     int ret = PS_OK;
0359     const PSChar *argv, *optstring, *optstring2;
0360     int c;
0361     char *token=NULL;
0362     PSInteger memsize;
0363     PSChar * stemp;
0364     char seps[] = NDRX_CMDLINE_SEP; 
0365     char quotes[] = "\"";
0366     ndrx_growlist_t list;
0367     int index;
0368     int bufsz;
0369     int i;
0370     ps_getstring(v,2,&argv);
0371     ps_getstring(v,3,&optstring);
0372     
0373     if (nr_groups > 1)
0374     {
0375         ps_getstring(v,4,&optstring2);
0376     }
0377     
0378     bufsz = strlen(argv)+1;
0379     memsize = (bufsz)*sizeof(PSChar);
0380     stemp = ps_getscratchpad(v,memsize);
0381     
0382     ndrx_growlist_init(&list, 10, sizeof(char *));
0383     
0384     
0385     if (EXSUCCEED!=ndrx_growlist_append(&list, (void *)&token))
0386     {
0387         NDRX_LOG(log_error, "ndrx_growlist_append() failed - oom?");
0388         ret=PS_ERROR;
0389         goto out;
0390     }
0391     
0392     
0393     NDRX_STRCPY_SAFE_DST(stemp, argv, bufsz);
0394     
0395     
0396     token = ndrx_strtokblk(stemp, seps, quotes);
0397     while( token != NULL )
0398     {
0399         
0400         if (EXSUCCEED!=ndrx_growlist_append(&list, (void *)&token))
0401         {
0402             NDRX_LOG(log_error, "ndrx_growlist_append() failed - oom?");
0403             ret=PS_ERROR;
0404             goto out;
0405         }
0406         
0407         
0408         token = ndrx_strtokblk( NULL, seps, quotes);
0409     }
0410     
0411 #ifdef __GNU_LIBRARY__
0412     optind=0; 
0413 #else
0414     optind=1; 
0415 #endif
0416     
0417     
0418 
0419 
0420     ps_newtable(v);
0421     
0422     for (i=0; i<nr_groups; i++)
0423     {
0424         char key[16];
0425         const PSChar *p_opts = optstring;
0426         
0427         if (i==1)
0428         {
0429             p_opts = optstring2;
0430         }
0431         
0432         snprintf(key, sizeof(key), "args%d", i+1);
0433         
0434         
0435         ps_pushstring(v, key,-1);
0436         
0437         ps_newarray(v, 0);
0438 
0439         while ((c = getopt (list.maxindexused+1, (char **)list.mem, (const char *)p_opts)) != -1)
0440         {
0441             char opt[2] = {(char)c, EXEOS};
0442             
0443             
0444             ps_newtable(v);
0445 
0446             ps_pushstring(v,"opt",-1);
0447             ps_pushstring(v,opt,-1);
0448             ps_newslot(v,-3,PSFalse);
0449 
0450             if (NULL!=optarg)
0451             {
0452                 ps_pushstring(v,"val",-1);
0453                 ps_pushstring(v,optarg,-1);
0454                 ps_newslot(v,-3,PSFalse);
0455             }
0456 
0457             ps_arrayappend(v,-2);
0458         }
0459         ps_newslot(v,-3,PSFalse);
0460     }
0461     
0462     
0463     ps_pushstring(v,"freeargs",-1);
0464     
0465     
0466     ps_newarray(v, 0);
0467     
0468     for (index = optind; index < list.maxindexused+1; index++)
0469     {
0470         ps_pushstring(v,((char **)list.mem)[index],-1);
0471         ps_arrayappend(v,-2);
0472     }
0473 
0474     ps_newslot(v,-3,PSFalse);
0475     
0476 out:
0477     
0478     ndrx_growlist_free(&list);
0479 
0480     if (PS_OK==ret)
0481     {
0482         return 1;
0483     }
0484     else
0485     {
0486         return ps_throwerror(v, "Failed to process");
0487     }
0488 }
0489 
0490 
0491 
0492 
0493 
0494 
0495 
0496 static PSInteger _exutil_parseclopt1(HPSCRIPTVM v)
0497 {
0498     return _exutil_parseclopt(v, 1);
0499 }
0500 
0501 
0502 
0503 
0504 
0505 
0506 
0507 
0508 static PSInteger _exutil_parseclopt2(HPSCRIPTVM v)
0509 {
0510     return _exutil_parseclopt(v, 2);
0511 }
0512 
0513 
0514 
0515 
0516 
0517 
0518 static PSInteger _exutil_chk_confirm(HPSCRIPTVM v)
0519 {
0520     const PSChar *str;
0521     PSInteger ret;
0522     
0523     ps_getstring(v,2,&str);
0524     
0525     ret = ndrx_chk_confirm((char *)str, EXFALSE);
0526 
0527     ps_pushinteger(v, ret);
0528     return 1;
0529 }
0530 
0531 
0532 
0533 
0534 
0535 
0536 static PSInteger _exutil_print_stdout(HPSCRIPTVM v)
0537 {
0538     const PSChar *str;
0539     
0540     ps_getstring(v,2,&str);
0541     
0542     fprintf(stdout, "%s", str);    
0543     return 1;
0544 }
0545 
0546 
0547 
0548 
0549 
0550 
0551 static PSInteger _exutil_print_stderr(HPSCRIPTVM v)
0552 {
0553     const PSChar *str;
0554     
0555     ps_getstring(v,2,&str);
0556     
0557     fprintf(stdout, "%s", str);    
0558     return 1;
0559 }
0560 
0561 #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_exutil_##name,nparams,pmask}
0562 static PSRegFunction exutillib_funcs[]={
0563     _DECL_FUNC(getline,1,_SC(".s")),
0564         _DECL_FUNC(getcwd,1,_SC(".s")),
0565         _DECL_FUNC(getosname,1,_SC(".s")),
0566         _DECL_FUNC(getpoller,1,_SC(".s")),
0567         _DECL_FUNC(getwizardbase,1,_SC(".s")),
0568         _DECL_FUNC(userlog,2,_SC(".s")),
0569         _DECL_FUNC(mkdir,2,_SC(".s")),
0570         _DECL_FUNC(rmdir,2,_SC(".s")),
0571         _DECL_FUNC(unlink,2,_SC(".s")),
0572         _DECL_FUNC(fileexists,2,_SC(".s")),
0573         _DECL_FUNC(chmod,3,_SC(".ss")),
0574         _DECL_FUNC(basename,2,_SC(".s")),
0575         _DECL_FUNC(dirname,2,_SC(".s")),
0576         _DECL_FUNC(rands,2,_SC(".n")),
0577         _DECL_FUNC(parseclopt1,3,_SC(".ss")),
0578         _DECL_FUNC(parseclopt2,4,_SC(".sss")),
0579         _DECL_FUNC(hex2int,2,_SC(".s")),
0580         _DECL_FUNC(chk_confirm,2,_SC(".s")),
0581         _DECL_FUNC(print_stdout,2,_SC(".s")),
0582         _DECL_FUNC(print_stderr,2,_SC(".s")),
0583     {0,0}
0584 };
0585 #undef _DECL_FUNC
0586 
0587 PSInteger psstd_register_exutillib(HPSCRIPTVM v)
0588 {
0589     PSInteger i=0;
0590     while(exutillib_funcs[i].name!=0)
0591     {
0592         ps_pushstring(v,exutillib_funcs[i].name,-1);
0593         ps_newclosure(v,exutillib_funcs[i].f,0);
0594         ps_setparamscheck(v,exutillib_funcs[i].nparamscheck,exutillib_funcs[i].typemask);
0595         ps_setnativeclosurename(v,-1,exutillib_funcs[i].name);
0596         ps_newslot(v,-3,PSFalse);
0597         i++;
0598     }
0599     return 1;
0600 }
0601