|
17 | 17 | #define XPATH_BASE_ "/ietf-hardware:hardware" |
18 | 18 | #define HOSTAPD_CONF "/etc/hostapd-%s.conf" |
19 | 19 | #define HOSTAPD_CONF_NEXT HOSTAPD_CONF"+" |
| 20 | +#define GPSD_CONF "/etc/finit.d/available/gpsd.conf" |
| 21 | +#define GPSD_CONF_NEXT GPSD_CONF"+" |
| 22 | +#define GPSD_MAX_DEVICES 4 |
20 | 23 |
|
21 | 24 | static int dir_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) |
22 | 25 | { |
@@ -593,7 +596,7 @@ int hardware_change(sr_session_ctx_t *session, struct lyd_node *config, struct l |
593 | 596 | { |
594 | 597 | struct lyd_node *difs = NULL, *dif = NULL; |
595 | 598 | int rc = SR_ERR_OK; |
596 | | - int num_gps = 0; |
| 599 | + int gps_changed = 0; |
597 | 600 |
|
598 | 601 | if (!lydx_find_xpathf(diff, XPATH_BASE_)) |
599 | 602 | return SR_ERR_OK; |
@@ -709,15 +712,74 @@ int hardware_change(sr_session_ctx_t *session, struct lyd_node *config, struct l |
709 | 712 | wifi_iface_list = NULL; |
710 | 713 | wifi_iface_count = 0; |
711 | 714 | } else if (!strcmp(class, "infix-hardware:gps")) { |
712 | | - if (event != SR_EV_DONE) |
713 | | - continue; |
714 | | - num_gps++; |
715 | | - systemf("initctl -nbq enable gpsd"); |
| 715 | + gps_changed = 1; |
716 | 716 | } |
717 | 717 | } |
718 | 718 |
|
719 | | - if (!num_gps && event == SR_EV_DONE) |
720 | | - systemf("initctl -nbq disable gpsd"); |
| 719 | + if (gps_changed) { |
| 720 | + const char *gps_names[GPSD_MAX_DEVICES] = { NULL }; |
| 721 | + struct lyd_node *cifs, *comp; |
| 722 | + int num_gps = 0; |
| 723 | + |
| 724 | + switch (event) { |
| 725 | + case SR_EV_UPDATE: |
| 726 | + case SR_EV_ENABLED: |
| 727 | + case SR_EV_RPC: |
| 728 | + break; |
| 729 | + |
| 730 | + case SR_EV_ABORT: |
| 731 | + unlink(GPSD_CONF_NEXT); |
| 732 | + break; |
| 733 | + |
| 734 | + case SR_EV_CHANGE: |
| 735 | + cifs = lydx_get_descendant(config, "hardware", "component", NULL); |
| 736 | + LYX_LIST_FOR_EACH(cifs, comp, "component") { |
| 737 | + const char *cls = lydx_get_cattr(comp, "class"); |
| 738 | + |
| 739 | + if (strcmp(cls, "infix-hardware:gps")) |
| 740 | + continue; |
| 741 | + if (num_gps < GPSD_MAX_DEVICES) |
| 742 | + gps_names[num_gps] = lydx_get_cattr(comp, "name"); |
| 743 | + else |
| 744 | + return SR_ERR_INTERNAL; |
| 745 | + num_gps++; |
| 746 | + } |
| 747 | + if (num_gps > 0) { |
| 748 | + FILE *fp; |
| 749 | + |
| 750 | + fp = fopen(GPSD_CONF_NEXT, "w"); |
| 751 | + if (fp) { |
| 752 | + int i; |
| 753 | + |
| 754 | + fprintf(fp, "# Generated by confd, do not edit.\n"); |
| 755 | + fprintf(fp, "service"); |
| 756 | + fprintf(fp, " <!"); |
| 757 | + for (i = 0; i < num_gps && i < GPSD_MAX_DEVICES; i++) |
| 758 | + fprintf(fp, "%sdev/%s", i ? "," : "", gps_names[i]); |
| 759 | + fprintf(fp, ">"); |
| 760 | + fprintf(fp, " pid:!/run/gpsd.pid"); |
| 761 | + fprintf(fp, " env:-/etc/default/gpsd \\\n"); |
| 762 | + fprintf(fp, "\t[2345] gpsd -n"); |
| 763 | + for (i = 0; i < num_gps && i < GPSD_MAX_DEVICES; i++) |
| 764 | + fprintf(fp, " /dev/%s", gps_names[i]); |
| 765 | + fprintf(fp, " -P /run/gpsd.pid -- GPS Daemon\n"); |
| 766 | + fclose(fp); |
| 767 | + } |
| 768 | + } |
| 769 | + break; |
| 770 | + |
| 771 | + case SR_EV_DONE: |
| 772 | + if (fexist(GPSD_CONF_NEXT)) { |
| 773 | + unlink(GPSD_CONF); |
| 774 | + rename(GPSD_CONF_NEXT, GPSD_CONF); |
| 775 | + systemf("initctl -nbq enable gpsd"); |
| 776 | + } else { |
| 777 | + unlink(GPSD_CONF); |
| 778 | + systemf("initctl -nbq disable gpsd"); |
| 779 | + } |
| 780 | + break; |
| 781 | + } |
| 782 | + } |
721 | 783 | err: |
722 | 784 |
|
723 | 785 | return rc; |
|
0 commit comments