亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? parser.c

?? linux下獲取一些環境信息的代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * Copyright 1998-2003 by Albert Cahalan; all rights reserved. * This file may be used subject to the terms and conditions of the * GNU Library General Public License Version 2, or any later version * at your option, as published by the Free Software Foundation. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. *//* Ought to have debug print stuff like this: * #define Print(fmt, args...) printf("Debug: " fmt, ## args) */#include <stdlib.h>#include <stdio.h>#include <string.h>/* username lookups */#include <sys/types.h>#include <pwd.h>#include <grp.h>#include <sys/stat.h>#include <unistd.h>#include "common.h"#include "../proc/version.h"#define ARG_GNU  0#define ARG_END  1#define ARG_PGRP 2#define ARG_SYSV 3#define ARG_PID  4#define ARG_BSD  5#define ARG_FAIL 6#define ARG_SESS 7static int w_count = 0;static int ps_argc;    /* global argc */static char **ps_argv; /* global argv */static int thisarg;    /* index into ps_argv */static char *flagptr;  /* current location in ps_argv[thisarg] */static int not_pure_unix = 0;  /* set by BSD and GNU options */static int force_bsd = 0;  /* set when normal parsing fails */#define exclusive(x) if((ps_argc != 2) || strcmp(ps_argv[1],x))\  return "The " x " option is exclusive."/********** utility functions **********//* * Both "-Oppid" and "-O ppid" should be legal, though Unix98 * does not require it. BSD and Digital Unix allow both. * Return the argument or NULL; */static const char *get_opt_arg(void){  if(*(flagptr+1)){     /* argument is part of ps_argv[thisarg] */    not_pure_unix = 1;    return flagptr+1;  }  if(thisarg+2 > ps_argc) return NULL;   /* there is nothing left */  /* argument follows ps_argv[thisarg] */  if(*(ps_argv[thisarg+1]) == '\0') return NULL;  return ps_argv[++thisarg];}/********** parse lists (of UID, tty, GID, PID...) **********/static const char *parse_pid(char *str, sel_union *ret){  char *endp;  unsigned long num;  static const char pidrange[]  = "Process ID out of range.";  static const char pidsyntax[] = "Process ID list syntax error.";  num = strtoul(str, &endp, 0);  if(*endp != '\0')      return pidsyntax;  if(num<1)              return pidrange;  if(num > 0x7fffffffUL) return pidrange;  ret->pid = num;  return 0;}static const char *parse_uid(char *str, sel_union *ret){  struct passwd *passwd_data;  char *endp;  unsigned long num;  static const char uidrange[] = "User ID out of range.";  static const char uidexist[] = "User name does not exist.";  num = strtoul(str, &endp, 0);  if(*endp != '\0'){  /* hmmm, try as login name */    passwd_data = getpwnam(str);    if(!passwd_data)    return uidexist;    num = passwd_data->pw_uid;  }  if(num > 0xfffffffeUL) return uidrange;  ret->uid = num;  return 0;}static const char *parse_gid(char *str, sel_union *ret){  struct group *group_data;  char *endp;  unsigned long num;  static const char gidrange[] = "Group ID out of range.";  static const char gidexist[] = "Group name does not exist.";  num = strtoul(str, &endp, 0);  if(*endp != '\0'){  /* hmmm, try as login name */    group_data = getgrnam(str);    if(!group_data)    return gidexist;    num = group_data->gr_gid;  }  if(num > 0xfffffffeUL) return gidrange;  ret->gid = num;  return 0;}static const char *parse_cmd(char *str, sel_union *ret){  strncpy(ret->cmd, str, sizeof ret->cmd);  // strncpy pads to end  return 0;}static const char *parse_tty(char *str, sel_union *ret){  struct stat sbuf;  static const char missing[] = "TTY could not be found.";  static const char not_tty[] = "List member was not a TTY.";  char path[4096];  if(str[0]=='/'){    if(stat(str, &sbuf) >= 0) goto found_it;    return missing;  }#define lookup(p) \  snprintf(path,4096,p,str); \  if(stat(path, &sbuf) >= 0) goto found_it  lookup("/dev/pts/%s");  /* New Unix98 ptys go first */  lookup("/dev/%s");  lookup("/dev/tty%s");  lookup("/dev/pty%s");  lookup("/dev/%snsole"); /* "co" means "console", maybe do all VCs too? */  if(!strcmp(str,"-")){   /* "-" means no tty (from AIX) */    ret->tty = 0;  /* processes w/o tty */    return 0;  }  if(!strcmp(str,"?")){   /* "?" means no tty, which bash eats (Reno BSD?) */    ret->tty = 0;  /* processes w/o tty */    return 0;  }  if(!*(str+1) && (stat(str,&sbuf)>=0)){  /* Kludge! Assume bash ate '?'. */    ret->tty = 0;  /* processes w/o tty */    return 0;  }#undef lookup  return missing;found_it:  if(!S_ISCHR(sbuf.st_mode)) return not_tty;  ret->tty = sbuf.st_rdev;  return 0;}/* * Used to parse lists in a generic way. (function pointers) */static const char *parse_list(const char *arg, const char *(*parse_fn)(char *, sel_union *) ){  selection_node *node;  char *buf;                      /* temp copy of arg to hack on */  char *sep_loc;                  /* separator location: " \t," */  char *walk;  int items;  int need_item;  const char *err;       /* error code that could or did happen */  /*** prepare to operate ***/  node = malloc(sizeof(selection_node));  node->u = malloc(strlen(arg)*sizeof(sel_union)); /* waste is insignificant */  node->n = 0;  buf = malloc(strlen(arg)+1);  strcpy(buf, arg);  /*** sanity check and count items ***/  need_item = 1; /* true */  items = 0;  walk = buf;  err = "Improper list.";  do{    switch(*walk){    case ' ': case ',': case '\t': case '\0':      if(need_item) goto parse_error;      need_item=1;      break;    default:      if(need_item) items++;      need_item=0;    }  } while (*++walk);  if(need_item) goto parse_error;  node->n = items;  /*** actually parse the list ***/  walk = buf;  while(items--){    sep_loc = strpbrk(walk," ,\t");    if(sep_loc) *sep_loc = '\0';    if(( err=(parse_fn)(walk, node->u+items) )) goto parse_error;    walk = sep_loc + 1; /* point to next item, if any */  }  free(buf);  node->next = selection_list;  selection_list = node;  return NULL;parse_error:  free(buf);  free(node->u);  free(node);  return err;}/***************** parse SysV options, including Unix98  *****************/static const char *parse_sysv_option(void){  const char *arg;  const char *err;  flagptr = ps_argv[thisarg];  while(*++flagptr){    // Find any excuse to ignore stupid Unix98 misfeatures.    //    // This list of options is ONLY for those defined by the    // "IEEE Std 1003.1, 2004 Edition", "ISO/IEC 9945:2003",    // or "Version 2 of the Single Unix Specification".    //    // It may be time to re-think the existance of this list.    // In the meantime, please do not add to it. The list is    // intended to ONLY contain flags defined by the POSIX and UNIX    // standards published by The Open Group, IEEE, and ISO.    if(!strchr("aAdefgGlnoptuU", *flagptr)) not_pure_unix = 1;  // dude, -Z ain't in POSIX    switch(*flagptr){    case 'A':      trace("-A selects all processes.\n");      all_processes = 1;      break;    case 'C': /* end */      trace("-C select by process name.\n");  /* Why only HP/UX and us? */      arg=get_opt_arg();      if(!arg) return "List of command names must follow -C.";      err=parse_list(arg, parse_cmd);      if(err) return err;      selection_list->typecode = SEL_COMM;      return NULL; /* can't have any more options */    case 'F':  /* DYNIX/ptx -f plus sz,rss,psr=ENG between c and stime */      trace("-F does fuller listing\n");      format_modifiers |= FM_F;      format_flags |= FF_Uf;      unix_f_option = 1; /* does this matter? */      break;    case 'G': /* end */      trace("-G select by RGID (supports names)\n");      arg=get_opt_arg();      if(!arg) return "List of real groups must follow -G.";      err=parse_list(arg, parse_gid);      if(err) return err;      selection_list->typecode = SEL_RGID;      return NULL; /* can't have any more options */    case 'H':     /* another nice HP/UX feature */      trace("-H Process hierarchy (like ASCII art forest option)\n");      forest_type = 'u';      break;#if 0    case 'J':  // specify list of job IDs in hex (IRIX) -- like HP "-R" maybe?      trace("-J select by job ID\n");  // want a JID ("jid") for "-j" too      arg=get_opt_arg();      if(!arg) return "List of jobs must follow -J.";      err=parse_list(arg, parse_jid);      if(err) return err;      selection_list->typecode = SEL_JID;      return NULL; /* can't have any more options */#endif    case 'L':  /*  */      /* In spite of the insane 2-level thread system, Sun appears to       * have made this option Linux-compatible. If a process has N       * threads, ps will produce N lines of output. (not N+1 lines)       * Zombies are the only exception, with NLWP==0 and 1 output line.       * SCO UnixWare uses -L too.       */      trace("-L Print LWP (thread) info.\n");      thread_flags |= TF_U_L;//      format_modifiers |= FM_L;      break;    case 'M':  // typically the SE Linux context      trace("-M Print security label for Mandatory Access Control.\n");      format_modifiers |= FM_M;      break;    case 'N':      trace("-N negates.\n");      negate_selection = 1;      break;    case 'O': /* end */      trace("-O is preloaded -o.\n");      arg=get_opt_arg();      if(!arg) return "Format or sort specification must follow -O.";      defer_sf_option(arg, SF_U_O);      return NULL; /* can't have any more options */    case 'P':     /* SunOS 5 "psr" or unknown HP/UX feature */      trace("-P adds columns of PRM info (HP-UX), PSR (SunOS), or capabilities (IRIX)\n");      format_modifiers |= FM_P;      break;#if 0    case 'R':    // unknown HP/UX feature, like IRIX "-J" maybe?      trace("-R select by PRM group\n");      arg=get_opt_arg();      if(!arg) return "List of PRM groups must follow -R.";      err=parse_list(arg, parse_prm);      if(err) return err;      selection_list->typecode = SEL_PRM;      return NULL; /* can't have any more options */#endif    case 'T':      /* IRIX 6.5 docs suggest POSIX threads get shown individually.       * This would make -T be like -L, -m, and m. (but an extra column)       * Testing (w/ normal processes) shows 1 line/process, not 2.       * Also, testing shows PID==SPID for all normal processes.       */      trace("-T adds strange SPID column (old sproc() threads?)\n");      thread_flags |= TF_U_T;//      format_modifiers |= FM_T;      break;    case 'U': /* end */      trace("-U select by RUID (supports names).\n");      arg=get_opt_arg();      if(!arg) return "List of real groups must follow -U.";      err=parse_list(arg, parse_uid);      if(err) return err;      selection_list->typecode = SEL_RUID;      return NULL; /* can't have any more options */    case 'V': /* single */      trace("-V prints version.\n");      exclusive("-V");      display_version();      exit(0);    // This must be verified against SVR4-MP. (UnixWare or Powermax)    // Leave it undocumented until that problem is solved.    case 'Z':     /* full Mandatory Access Control level info */      trace("-Z shows full MAC info\n");      format_modifiers |= FM_M;      break;    case 'a':      trace("-a select all with a tty, but omit session leaders.\n");      simple_select |= SS_U_a;      break;    case 'c':      /* HP-UX and SunOS 5 scheduling info modifier */      trace("-c changes scheduling info.\n");      format_modifiers |= FM_c;      break;    case 'd':      trace("-d select all, but omit session leaders.\n");      simple_select |= SS_U_d;      break;    case 'e':      trace("-e selects all processes.\n");      all_processes = 1;      break;    case 'f':      trace("-f does full listing\n");      format_flags |= FF_Uf;      unix_f_option = 1; /* does this matter? */      break;    case 'g': /* end */      trace("-g selects by session leader OR by group name\n");      arg=get_opt_arg();      if(!arg) return "List of session leaders OR effective group names must follow -g.";      err=parse_list(arg, parse_pid);      if(!err){        selection_list->typecode = SEL_SESS;        return NULL; /* can't have any more options */      }      err=parse_list(arg, parse_gid);      if(!err){        selection_list->typecode = SEL_EGID;        return NULL; /* can't have any more options */      }      return "List of session leaders OR effective group IDs was invalid.";    case 'j':      trace("-j jobs format.\n");      /* old Debian used RD_j and Digital uses JFMT */      if(sysv_j_format) format_flags |= FF_Uj;      else format_modifiers |= FM_j;      break;    case 'l':      trace("-l long format.\n");      format_flags |= FF_Ul;      break;    case 'm':      trace("-m shows threads.\n");      /* note that AIX shows 2 lines for a normal process */      thread_flags |= TF_U_m;      break;    case 'n': /* end */      trace("-n sets namelist file.\n");      arg=get_opt_arg();      if(!arg) return "Alternate System.map file must follow -n.";      namelist_file = arg;      return NULL; /* can't have any more options */    case 'o': /* end */      /* Unix98 has gross behavior regarding this. From the following: */      /*            ps -o pid,nice=NICE,tty=TERMINAL,comm              */      /* The result must be 2 columns: "PID NICE,tty=TERMINAL,comm"    */      /* Yes, the second column has the name "NICE,tty=TERMINAL,comm"  */      /* This parser looks for any excuse to ignore that braindamage.  */      trace("-o user-defined format.\n");      arg=get_opt_arg();      if(!arg) return "Format specification must follow -o.";      not_pure_unix |= defer_sf_option(arg, SF_U_o);      return NULL; /* can't have any more options */    case 'p': /* end */      trace("-p select by PID.\n");      arg=get_opt_arg();      if(!arg) return "List of process IDs must follow -p.";      err=parse_list(arg, parse_pid);      if(err) return err;      selection_list->typecode = SEL_PID;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久亚洲综合色| 亚洲美女屁股眼交| 日本vs亚洲vs韩国一区三区二区 | 麻豆精品视频在线| 欧美久久久久中文字幕| 亚洲主播在线观看| 91国产精品成人| 亚洲激情图片qvod| 在线观看一区二区精品视频| 一区二区三区电影在线播| 91福利精品视频| 亚洲无线码一区二区三区| 欧美日韩不卡一区二区| 日韩高清电影一区| 欧美xxx久久| 韩国女主播一区| 久久久www成人免费毛片麻豆| 国产又黄又大久久| 欧美国产日本视频| 波多野结衣中文一区| 亚洲丝袜制服诱惑| 在线一区二区视频| 天天综合网天天综合色| 欧美成人一级视频| 国产一区二区电影| 亚洲欧美综合另类在线卡通| 色婷婷av一区| 五月婷婷综合激情| 日韩精品最新网址| 岛国一区二区三区| 亚洲精品成人精品456| 精品视频123区在线观看| 喷水一区二区三区| 久久精品一区八戒影视| 99久久er热在这里只有精品66| 亚洲欧美电影院| 欧美精选在线播放| 国内精品伊人久久久久av一坑| 国产精品色哟哟| 在线观看www91| 久久爱另类一区二区小说| 久久精品网站免费观看| 91老司机福利 在线| 三级影片在线观看欧美日韩一区二区 | 日韩一区二区三区视频在线| 极品美女销魂一区二区三区| 国产精品久久久久影院老司| 91福利精品视频| 麻豆久久久久久| 国产精品美女久久福利网站| 欧美三级电影在线看| 国产在线精品国自产拍免费| 国产精品久线在线观看| 884aa四虎影成人精品一区| 国产另类ts人妖一区二区| 亚洲欧美成人一区二区三区| 欧美一区二区高清| 成人午夜看片网址| 亚洲精品成人精品456| 日韩精品一区二区三区蜜臀| 97精品久久久午夜一区二区三区 | 久久久综合激的五月天| 91精彩视频在线观看| 久久精品国产免费看久久精品| 国产精品视频免费| 欧美一级理论性理论a| 成人动漫一区二区| 日本色综合中文字幕| 欧美国产综合一区二区| 欧美麻豆精品久久久久久| 成人毛片老司机大片| 午夜精品久久久久| 国产精品久久久久影院| 婷婷久久综合九色国产成人 | 国产精品热久久久久夜色精品三区| 在线观看视频一区| 丰满岳乱妇一区二区三区| 丝袜美腿亚洲一区| 亚洲欧洲日韩一区二区三区| 日韩一级二级三级| 91黄色免费观看| 国产精品影视在线| 日本大胆欧美人术艺术动态| 亚洲天堂中文字幕| 国产婷婷精品av在线| 亚洲在线中文字幕| 国产午夜亚洲精品午夜鲁丝片| 欧美卡1卡2卡| 91免费在线播放| 丰满亚洲少妇av| 久久9热精品视频| 亚洲大片在线观看| 成人欧美一区二区三区在线播放| 精品国产乱码久久久久久图片| 欧美亚洲丝袜传媒另类| 成人性生交大合| 国模冰冰炮一区二区| 婷婷成人激情在线网| 一区二区欧美在线观看| 中文字幕乱码亚洲精品一区| 精品国产一区二区亚洲人成毛片| 欧美日韩综合色| 91国产福利在线| 95精品视频在线| 成人h动漫精品一区二区| 国产一区二区三区香蕉| 美腿丝袜亚洲三区| 日韩不卡一区二区| 亚洲6080在线| 亚洲妇女屁股眼交7| 亚洲欧美乱综合| 亚洲日本乱码在线观看| 国产精品女主播av| 中文在线免费一区三区高中清不卡| 欧美videossexotv100| 91精品蜜臀在线一区尤物| 欧美日韩视频在线观看一区二区三区| 99久久99久久免费精品蜜臀| 成人av综合在线| kk眼镜猥琐国模调教系列一区二区| 国产成人综合精品三级| 国产乱码精品1区2区3区| 黄色日韩三级电影| 国产在线国偷精品产拍免费yy | 亚洲一区二区三区中文字幕| 中文字幕一区二区在线观看| 中文字幕第一区综合| 国产农村妇女毛片精品久久麻豆| 久久影院午夜片一区| 久久蜜臀精品av| 国产三级精品三级在线专区| 国产亲近乱来精品视频| 国产日韩欧美精品一区| 国产亚洲成年网址在线观看| 欧美激情一区二区三区全黄| 欧美激情一区三区| 国产精品久久久久久久浪潮网站| 中文欧美字幕免费| 中文字幕一区二区三区在线观看| 亚洲天堂2016| 1024成人网| 亚洲精品你懂的| 亚洲无人区一区| 免费高清不卡av| 国产在线精品一区二区不卡了| 国产精品1024| 成人激情视频网站| 一道本成人在线| 欧美人伦禁忌dvd放荡欲情| 91精品国产综合久久久久久久久久 | 久久综合九色欧美综合狠狠| 久久影院视频免费| 国产精品色在线观看| 亚洲精品免费一二三区| 亚洲午夜久久久久久久久电影网| 亚洲成a天堂v人片| 免费观看91视频大全| 国产精品亚洲专一区二区三区 | 波波电影院一区二区三区| 99久久亚洲一区二区三区青草| 91免费版在线| 制服丝袜在线91| 久久久久免费观看| 亚洲欧美日韩国产一区二区三区 | 麻豆久久久久久| 懂色av一区二区三区蜜臀| 色欧美88888久久久久久影院| 欧美老肥妇做.爰bbww| 精品国产一区二区三区久久影院| 欧美经典一区二区| 一区二区三区中文在线| 日本不卡一二三| 成人18视频日本| 欧美日韩免费视频| 久久久99免费| 亚洲综合图片区| 免费亚洲电影在线| 成人av网在线| 欧美精品自拍偷拍动漫精品| 久久久久久97三级| 亚洲午夜私人影院| 国产一区二区精品久久| 在线视频欧美精品| 精品久久久久久久久久久久久久久久久 | 中日韩av电影| 亚洲成人777| 国产成人免费视频网站| 欧美专区亚洲专区| 国产喂奶挤奶一区二区三区| 亚洲综合一二区| 国产精品资源在线观看| 在线观看91视频| 国产日韩欧美精品综合| 亚洲成a人片在线不卡一二三区 | 麻豆成人综合网| 99视频一区二区三区| 欧美大尺度电影在线| 亚洲精品乱码久久久久久黑人| 看电影不卡的网站| 91国产免费看|