My slstatus configuration
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /* See LICENSE file for copyright and license details. */
  2. #if defined(__linux__)
  3. #include <errno.h>
  4. #include <ifaddrs.h>
  5. #include <linux/wireless.h>
  6. #include <sys/socket.h>
  7. #include <stdio.h>
  8. #include <limits.h>
  9. #include <string.h>
  10. #include <sys/ioctl.h>
  11. #include <unistd.h>
  12. #include "../util.h"
  13. const char *
  14. wifi_perc(const char *iface)
  15. {
  16. int i, cur;
  17. float perc;
  18. int total = 70; /* the max of /proc/net/wireless */
  19. char *p, *datastart;
  20. char path[PATH_MAX];
  21. char status[5];
  22. FILE *fp;
  23. snprintf(path, sizeof(path), "%s%s%s", "/sys/class/net/", iface,
  24. "/operstate");
  25. fp = fopen(path, "r");
  26. if (fp == NULL) {
  27. fprintf(stderr, "fopen '%s': %s\n", path,
  28. strerror(errno));
  29. return NULL;
  30. }
  31. p = fgets(status, 5, fp);
  32. fclose(fp);
  33. if(!p || strcmp(status, "up\n") != 0) {
  34. return NULL;
  35. }
  36. fp = fopen("/proc/net/wireless", "r");
  37. if (fp == NULL) {
  38. fprintf(stderr, "fopen '/proc/net/wireless': %s\n",
  39. strerror(errno));
  40. return NULL;
  41. }
  42. for (i = 0; i < 3; i++) {
  43. if (!(p = fgets(buf, sizeof(buf) - 1, fp)))
  44. break;
  45. }
  46. fclose(fp);
  47. if (i < 2 || !p)
  48. return NULL;
  49. if ((datastart = strstr(buf, iface)) == NULL)
  50. return NULL;
  51. datastart = (datastart+(strlen(iface)+1));
  52. sscanf(datastart + 1, " %*d %d %*d %*d\t\t %*d\t "
  53. "%*d\t\t%*d\t\t %*d\t %*d\t\t %*d", &cur);
  54. perc = (float)cur / total * 100.0;
  55. return bprintf("%.0f", perc);
  56. }
  57. const char *
  58. wifi_essid(const char *iface)
  59. {
  60. static char id[IW_ESSID_MAX_SIZE+1];
  61. int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  62. struct iwreq wreq;
  63. memset(&wreq, 0, sizeof(struct iwreq));
  64. wreq.u.essid.length = IW_ESSID_MAX_SIZE+1;
  65. snprintf(wreq.ifr_name, sizeof(wreq.ifr_name), "%s", iface);
  66. if (sockfd == -1) {
  67. fprintf(stderr, "socket 'AF_INET': %s\n",
  68. strerror(errno));
  69. return NULL;
  70. }
  71. wreq.u.essid.pointer = id;
  72. if (ioctl(sockfd,SIOCGIWESSID, &wreq) == -1) {
  73. fprintf(stderr, "ioctl 'SIOCGIWESSID': %s\n",
  74. strerror(errno));
  75. close(sockfd);
  76. return NULL;
  77. }
  78. close(sockfd);
  79. if (strcmp(id, "") == 0)
  80. return NULL;
  81. else
  82. return id;
  83. }
  84. #elif defined(__OpenBSD__)
  85. /* unimplemented */
  86. #endif