void world_tree_remove_app(graph_view_handle view, uint64_t id) { GtkTreeIter view_iter; GtkTreeIter app_iter; const char * view_name; const char * app_name; GtkTreePath * path; if (!find_app(view, id, &view_iter, &app_iter)) { log_error("removed app not found"); return; } path = gtk_tree_model_get_path(GTK_TREE_MODEL(g_treestore), &view_iter); gtk_tree_model_get(GTK_TREE_MODEL(g_treestore), &view_iter, COL_NAME, &view_name, -1); gtk_tree_model_get(GTK_TREE_MODEL(g_treestore), &app_iter, COL_NAME, &app_name, -1); log_info("removing app '%s' from '%s'", app_name, view_name); gtk_tree_view_expand_row(GTK_TREE_VIEW(g_world_tree_widget), path, false); gtk_tree_store_remove(g_treestore, &app_iter); gtk_tree_path_free(path); }
int print_all_timers(dldev_t *dev, char *file) { FILE *fp; int i; u16 add_addr, o; timer_rec_t rec; u8 at_end, num_recs; /* find the application */ if((i = find_app(dev, app_name)) < 0){ ERROR("%s application not found", app_name); return -1; } if(!(fp = fopen(file, "w"))){ ERROR("%s: open failed", file); return -1; } /* application database data */ add_addr = dev->app[i].acb.add_addr; /* number of records */ if(read_abs_addr(dev, add_addr+5, ext_mem, (u8 *)&num_recs, 1)){ ERROR("read_abs_addr"); return -1; } if(!is_countdn){ if(read_abs_addr(dev, add_addr+8, ext_mem, (u8 *)&at_end, 1)){ ERROR("read_abs_addr"); return -1; } fprintf(fp, "%s\n", timer_at_end[at_end]); } o = header_size; for(i = 0; i < num_recs; i++){ if(read_abs_addr(dev, add_addr+o+13*i, ext_mem, (u8 *)&rec, 13)){ ERROR("read_abs_addr"); return -1; } print_rdm(rec.msg, 9, fp); fprintf(fp, "\t%02d:%02d:%02d", debcd(rec.hours), debcd(rec.minutes), debcd(rec.seconds)); if(is_countdn) fprintf(fp, "\t%s", timer_at_end[rec.at_end]); if(rec.halfway_reminder) fprintf(fp, "\thalfway reminder"); fprintf(fp, "\n"); } fclose(fp); return 0; }
gboolean gst_packages_install (GtkWindow *window, const gchar *packages[]) { gchar *path; pid_t pid; gboolean retval = FALSE; g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE); if (!find_app (window, "synaptic") || !find_app (window, "gksudo")) return FALSE; path = create_temp_file (packages); if (spawn_synaptic (window, path, &pid)) retval = wait_for_synaptic (window, pid); unlink (path); g_free (path); return retval; }
/* too slow */ int read_timer_mem(dldev_t *dev, tymer_t *db) { int i, j; u16 add_addr, o; timer_rec_t *rec; /* find the application */ if((i = find_app(dev, app_name)) < 0){ ERROR("%s application not found", app_name); return -1; } /* application database data */ add_addr = dev->app[i].acb.add_addr; /* allocation size */ o = header_size; if(read_abs_addr(dev, add_addr, ext_mem, (u8 *)&db->hdr, o)){ ERROR("read_abs_addr"); return -1; } db->head = db->tail = NULL; for(i = 0; i < db->hdr.num_recs; i++){ rec = (timer_rec_t *)malloc(sizeof(timer_rec_t)); if(read_abs_addr(dev, add_addr+o+13*i, ext_mem, (u8 *)rec, 13)){ ERROR("read_abs_addr"); return -1; } /* TODO: Timex software bug? Some character values are * unpredictably greater than 0x69 and it should be & ~(1 << 7) * to be compared with dl's index. */ for(j = 0; j < 9; j++) rec->msg[j] &= ~(1 << 7); rec->prev = rec->next = NULL; if(db->head){ rec->prev = db->tail; db->tail->next = rec; db->tail = rec; }else db->head = db->tail = rec; } return 0; }
void world_tree_app_state_changed(graph_view_handle view, uint64_t id, const char * app_name, bool running, bool terminal, const char * level) { GtkTreeIter view_iter; GtkTreeIter app_iter; const char * view_name; GtkTreePath * path; char * app_name_with_status; if (!find_app(view, id, &view_iter, &app_iter)) { log_error("removed app not found"); return; } path = gtk_tree_model_get_path(GTK_TREE_MODEL(g_treestore), &view_iter); gtk_tree_model_get(GTK_TREE_MODEL(g_treestore), &view_iter, COL_NAME, &view_name, -1); log_info("changing app state '%s':'%s'", view_name, app_name); app_name_with_status = get_app_name_string(app_name, running, terminal, level); if (app_name_with_status == NULL) { goto free_path; } gtk_tree_view_expand_row(GTK_TREE_VIEW(g_world_tree_widget), path, false); gtk_tree_store_set( g_treestore, &app_iter, COL_NAME, app_name_with_status, COL_RUNNING, running, COL_TERMINAL, terminal, COL_LEVEL, level, -1); free(app_name_with_status); free_path: gtk_tree_path_free(path); }
int main(int argc, char *argv[]) { int ret = 1, i, idx; dldev_t dev; tymer_t db; u8 *data; u16 len; /* for data security */ /* umask(S_IRWXG | S_IRWXO); */ i = strlen(argv[0]) - 1; for(; i >= 0 && argv[0][i] != '/'; i--); i++; if(strstr(argv[0] + i, "interval")){ set_timer(POR_INTERVAL); is_countdn = 0; } while((i = getopt(argc, argv, "hd:")) != -1){ switch(i){ case 'd': dev_file = optarg; break; case 'h': default: usage(); break; } } argc -= optind; argv += optind; #ifdef USB_USBHID dev.usb.file = dev_file; #endif if(open_dev(&dev)){ ERROR("open_dev"); goto exit; } if(start_session(&dev)){ ERROR("read_app_info"); goto exit; } /******************************************************************************/ #ifdef DEBUG for(i = 0; i < NUM_APPS; i++){ if(!dev.app[i].acd.app_idx) continue; printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i, dev.app[i].acd.app_idx, dev.app[i].acd.code_loc, dev.app[i].acd.db_loc, dev.app[i].acd.code_invalid, dev.app[i].acd.db_modified, dev.app[i].acd.db_invalid, dev.app[i].acd.passwd_req, dev.app[i].acd.mode_name, dev.app[i].acb.app_type, dev.app[i].acb.app_inst, dev.app[i].acb.asd_addr, dev.app[i].acb.add_addr, dev.app[i].acb.state_mgr_addr, dev.app[i].acb.refresh_addr, dev.app[i].acb.banner_addr, dev.app[i].acb.code_addr, dev.app[i].banner ); } #endif /******************************************************************************/ if((idx = find_app(&dev, uapp_name)) < 0){ ERROR("%s application not found", uapp_name); goto end; } if(dump_add(&dev, idx, &data, &len)){ ERROR("dump_add"); goto end; } read_timer(&db, data); free(data); print_timer(&db, stdout); free_timer(&db); /******************************************************************************/ end: if(end_session(&dev)){ ERROR("end_session"); goto exit; } ret = 0; exit: close_dev(&dev); exit(ret); }
int main(int argc, char *argv[]) { int ret = 1, i; dldev_t dev; note_t db; u8 *data; u16 len; /* for data security */ /* umask(S_IRWXG | S_IRWXO); */ while((i = getopt(argc, argv, "hd:u:e:")) != -1){ switch(i){ case 'd': dev_file = optarg; break; case 'u': unused_recs = atoi(optarg); if(unused_recs < 0) unused_recs = 0; break; case 'e': extra_msg_len = atoi(optarg); if(extra_msg_len < 0) extra_msg_len = 0; break; case 'h': default: usage(); break; } } argc -= optind; argv += optind; set_note_unused_recs(unused_recs); set_note_extra_len(extra_msg_len); #ifdef USB_USBHID dev.usb.file = dev_file; #endif if(open_dev(&dev)){ ERROR("open_dev"); goto exit; } if(start_session(&dev)){ ERROR("read_app_info"); goto exit; } /******************************************************************************/ #ifdef DEBUG for(i = 0; i < NUM_APPS; i++){ if(!dev.app[i].acd.app_idx) continue; printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i, dev.app[i].acd.app_idx, dev.app[i].acd.code_loc, dev.app[i].acd.db_loc, dev.app[i].acd.code_invalid, dev.app[i].acd.db_modified, dev.app[i].acd.db_invalid, dev.app[i].acd.passwd_req, dev.app[i].acd.mode_name, dev.app[i].acb.app_type, dev.app[i].acb.app_inst, dev.app[i].acb.asd_addr, dev.app[i].acb.add_addr, dev.app[i].acb.state_mgr_addr, dev.app[i].acb.refresh_addr, dev.app[i].acb.banner_addr, dev.app[i].acb.code_addr, dev.app[i].banner ); } #endif /******************************************************************************/ if(read_note_mem(&dev, &db)){ ERROR("read_note_mem"); goto end; } create_note(&db, &data, &len); if(load_add(&dev, find_app(&dev, "NOTE"), data)){ ERROR("load_add"); goto end; } free(data); print_note(&db, stdout); free_note(&db); /******************************************************************************/ end: if(end_session(&dev)){ ERROR("end_session"); goto exit; } ret = 0; exit: close_dev(&dev); exit(ret); }
int main(int argc, char *argv[]) { int ret = 1, istty, i, idx; char *msg = NULL, *timer = NULL, *at_end = NULL, *halfway = NULL; dldev_t dev; tymer_t db; u8 *data; u16 len; /* for data security */ /* umask(S_IRWXG | S_IRWXO); */ istty = isatty(0); i = strlen(argv[0]) - 1; for(; i >= 0 && argv[0][i] != '/'; i--); i++; if(strstr(argv[0] + i, "interval")){ set_timer(POR_INTERVAL); is_countdn = 0; } while((i = getopt(argc, argv, "hd:")) != -1){ switch(i){ case 'd': dev_file = optarg; break; case 'h': default: usage(); break; } } argc -= optind; argv += optind; #ifdef USB_USBHID dev.usb.file = dev_file; #endif BEGIN_OPT() OPT("msg", msg) OPT("timer", timer) OPT("at_end", at_end) OPT("halfway", halfway) END_OPT() /* allows the user to change only at_end in interval timer */ if(istty && ((!msg || !timer) && (is_countdn || !at_end))) usage(); if(open_dev(&dev)){ ERROR("open_dev"); goto exit; } if(start_session(&dev)){ ERROR("read_app_info"); goto exit; } /******************************************************************************/ #ifdef DEBUG for(i = 0; i < NUM_APPS; i++){ if(!dev.app[i].acd.app_idx) continue; printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i, dev.app[i].acd.app_idx, dev.app[i].acd.code_loc, dev.app[i].acd.db_loc, dev.app[i].acd.code_invalid, dev.app[i].acd.db_modified, dev.app[i].acd.db_invalid, dev.app[i].acd.passwd_req, dev.app[i].acd.mode_name, dev.app[i].acb.app_type, dev.app[i].acb.app_inst, dev.app[i].acb.asd_addr, dev.app[i].acb.add_addr, dev.app[i].acb.state_mgr_addr, dev.app[i].acb.refresh_addr, dev.app[i].acb.banner_addr, dev.app[i].acb.code_addr, dev.app[i].banner ); } #endif /******************************************************************************/ if((idx = find_app(&dev, uapp_name)) < 0){ ERROR("%s application not found", uapp_name); goto end; } if(dump_add(&dev, idx, &data, &len)){ ERROR("dump_add"); goto end; } read_timer(&db, data); free(data); if(!istty) add_timer_file(&db, stdin); if(msg && timer){ char buf[BUFSIZ]; timer_data_t rec; sprintf(buf, "%s\t%s\t%s%s", msg, timer, (at_end ? at_end : "stop"), (halfway && strcmp(halfway, "no") ? "\thalfway" : "")); if(read_timer_line(&rec, buf)) fprintf(stderr, "add_%s: format error!\n", lapp_name); else if(find_timer(&db, &rec) < 0) add_timer(&db, &rec); } if(!is_countdn && at_end){ int i; for(i = 0; i < 3 && strcmp(at_end, timer_at_end[i]); i++); if(i < 3){ set_timer_at_end(i); update_timer_at_end(&db); } } create_timer(&db, &data, &len); if(load_add(&dev, idx, data)){ ERROR("load_add"); goto end; } free(data); print_timer(&db, stdout); free_timer(&db); /******************************************************************************/ end: if(end_session(&dev)){ ERROR("end_session"); goto exit; } ret = 0; exit: close_dev(&dev); exit(ret); }
int main(int argc, char *argv[]) { int ret = 1, i, idx, fd, num_apps = 0; char *dev_file = "/dev/uhid0", *banner, *file; dldev_t dev; appinfo *app = NULL; u8 *data; u16 len; /* for data security */ /* umask(S_IRWXG | S_IRWXO); */ while((i = getopt(argc, argv, "hd:")) != -1){ switch(i){ case 'd': dev_file = optarg; break; case 'h': default: usage(); break; } } argc -= optind; argv += optind; #ifdef USB_USBHID dev.usb.file = dev_file; #endif BEGIN_OPT() APP_OPT("rom", -3) APP_OPT("eeprom", -2) APP_OPT("wristapp", -1) APP_OPT("contact", APP_CONTACT) APP_OPT("note", APP_NOTE) APP_OPT("appt", APP_APPT) APP_OPT("alarm", APP_ALARM) APP_OPT("schedule", APP_SCHEDULE) APP_OPT("occasion", APP_OCCASION) APP_OPT("chrono", APP_CHRONO) APP_OPT("countdn", APP_TIMER) APP_OPT("interval", APP_TIMER | 0x100) #if 0 APP_OPT("synchro", APP_SYNCHRO) #endif APP_OPT("option", APP_OPTION) END_OPT() if(!num_apps) usage(); if(open_dev(&dev)){ ERROR("open_dev"); goto exit; } tucp_progress(1); if(start_session(&dev)){ ERROR("read_app_info"); goto exit; } /******************************************************************************/ #ifdef DEBUG for(i = 0; i < NUM_APPS; i++){ if(!dev.app[i].acd.app_idx) continue; printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i, dev.app[i].acd.app_idx, dev.app[i].acd.code_loc, dev.app[i].acd.db_loc, dev.app[i].acd.code_invalid, dev.app[i].acd.db_modified, dev.app[i].acd.db_invalid, dev.app[i].acd.passwd_req, dev.app[i].acd.mode_name, dev.app[i].acb.app_type, dev.app[i].acb.app_inst, dev.app[i].acb.asd_addr, dev.app[i].acb.add_addr, dev.app[i].acb.state_mgr_addr, dev.app[i].acb.refresh_addr, dev.app[i].acb.banner_addr, dev.app[i].acb.code_addr, dev.app[i].banner ); } #endif /******************************************************************************/ for(i = 0; i < num_apps; i++){ if(app[i].file[0]) fprintf(stderr, "%s\n", app[i].file); else continue; banner = NULL; file = app[i].file; switch(app[i].app){ case -3: if(dump_rom(&dev, &data, &len)){ ERROR("dump_rom"); goto end; } break; case -2: if(dump_eeprom(&dev, &data, &len)){ ERROR("dump_eeprom"); goto end; } break; case -1: banner = file; for(; *file && *file != '='; file++); if(*file) *file++ = 0; if(!(*file)){ ERROR("%s: no file name specified", banner); goto end; } for(; *banner; banner++) *banner = toupper(*banner); banner = app[i].file; break; case APP_CONTACT: banner = "CONTACT"; break; case APP_NOTE: banner = "NOTE"; break; case APP_APPT: banner = "APPT"; break; case APP_ALARM: banner = "ALARM"; break; case APP_SCHEDULE: banner = "SCHEDULE"; break; case APP_OCCASION: banner = "OCCASION"; break; case APP_CHRONO: banner = "CHRONO"; break; case APP_TIMER: banner = "COUNTDN TIMER"; break; case APP_TIMER | 0x100: banner = "INTERVAL TIMER"; break; #if 0 case APP_SYNCHRO: banner = "SYNCHRO"; break; #endif case APP_OPTION: len = 15; data = (u8 *)malloc(len); if(read_abs_addr(&dev, dev.sysmap.opt_addr, int_mem, data, len)){ ERROR("read_abs_addr"); goto end; } break; } if(banner){ if((idx = find_app(&dev, banner)) < 0){ ERROR("%s application not found", banner); goto end; } if(dump_add(&dev, idx, &data, &len)){ ERROR("dump_add"); goto end; } } if((fd = open(file, O_WRITE, S_IRWUSR)) < 0){ ERROR("%s: open failed", file); goto end; } if(write(fd, data, len) != len){ ERROR("%s: write failed", file); goto end; } close(fd); free(data); } /******************************************************************************/ end: if(end_session(&dev)){ ERROR("end_session"); goto exit; } tucp_progress(0); ret = 0; exit: close_dev(&dev); exit(ret); }
int main(int argc, char *argv[]) { int ret = 1, istty, i, idx, delete_all = 0, updated = 0; dldev_t dev; contact_t db; contact_data_t rec; u8 *data; u16 len; /* for data security */ /* umask(S_IRWXG | S_IRWXO); */ istty = isatty(0); while((i = getopt(argc, argv, "hd:a")) != -1){ switch(i){ case 'd': dev_file = optarg; break; case 'a': delete_all = 1; break; case 'h': default: usage(); break; } } argc -= optind; argv += optind; #ifdef USB_USBHID dev.usb.file = dev_file; #endif memset(&rec, 0, sizeof(contact_data_t)); BEGIN_OPT() OPT("msg", rec.msg) OPT("type", rec.type) OPT("area", rec.area) OPT("number", rec.number) END_OPT() if(delete_all){ fprintf(stderr, "WARNING: DELETE ALL CONTACTS IN THE WATCH (Y/N)? "); if(tolower(getchar()) != 'y') exit(0); }else if(istty && (!rec.msg || !rec.type || !rec.area || !rec.number)) usage(); /* TODO: long phone number extending to the next or previous record */ if(open_dev(&dev)){ ERROR("open_dev"); goto exit; } if(start_session(&dev)){ ERROR("read_app_info"); goto exit; } /******************************************************************************/ #ifdef DEBUG for(i = 0; i < NUM_APPS; i++){ if(!dev.app[i].acd.app_idx) continue; printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i, dev.app[i].acd.app_idx, dev.app[i].acd.code_loc, dev.app[i].acd.db_loc, dev.app[i].acd.code_invalid, dev.app[i].acd.db_modified, dev.app[i].acd.db_invalid, dev.app[i].acd.passwd_req, dev.app[i].acd.mode_name, dev.app[i].acb.app_type, dev.app[i].acb.app_inst, dev.app[i].acb.asd_addr, dev.app[i].acb.add_addr, dev.app[i].acb.state_mgr_addr, dev.app[i].acb.refresh_addr, dev.app[i].acb.banner_addr, dev.app[i].acb.code_addr, dev.app[i].banner ); } #endif /******************************************************************************/ if((idx = find_app(&dev, "CONTACT")) < 0){ ERROR("CONTACT application not found"); goto end; } if(dump_add(&dev, idx, &data, &len)){ ERROR("dump_add"); goto end; } read_contact(&db, data); free(data); if(delete_all){ while(!del_contact(&db, 0)) updated = 1; }else{ if(!istty && !del_contact_file(&db, stdin)) updated = 1; if(rec.msg && rec.type && rec.area && rec.number && (i = find_contact(&db, &rec)) >= 0 && !del_contact(&db, i)) updated = 1; } if(updated){ create_contact(&db, &data, &len); if(load_add(&dev, idx, data)){ ERROR("load_add"); goto end; } free(data); } print_contact(&db, stdout); free_contact(&db); /******************************************************************************/ end: if(end_session(&dev)){ ERROR("end_session"); goto exit; } ret = 0; exit: close_dev(&dev); exit(ret); }
int print_all_schedules(dldev_t *dev, char *file) { FILE *fp; int i, j; u16 add_addr, offset, offset2; schedule_hdr_t hdr; schedule_grp_hdr_t grp_hdr; schedule_rec_t rec; u8 grp[101], msg[101]; /* find the application */ if((i = find_app(dev, "SCHEDULE")) < 0){ ERROR("SCHEDULE application not found"); return -1; } if(!(fp = fopen(file, "w"))){ ERROR("%s: open failed", file); return -1; } /* application database data */ add_addr = dev->app[i].acb.add_addr; if(read_abs_addr(dev, add_addr, ext_mem, (u8 *)&hdr, 27)){ ERROR("read_abs_addr"); return -1; } print_rdm(hdr.msg, hdr.msg_len, fp); fprintf(fp, "\t%s\n", get_schedule_grp_type_str(hdr.grp_type)); for(i = 0; i < hdr.num_grps; i++){ if(read_abs_addr(dev, add_addr+5+22+2*i, ext_mem, (u8 *)&offset, 2)){ ERROR("read_abs_addr"); return -1; } offset += add_addr + 27; if(read_abs_addr(dev, offset, ext_mem, (u8 *)&grp_hdr, 8)){ ERROR("read_abs_addr"); return -1; } if(read_abs_addr(dev, offset+8, ext_mem, grp, grp_hdr.msg_len)){ ERROR("read_abs_addr"); return -1; } for(j = 0; j < grp_hdr.num_recs; j++){ if(read_abs_addr(dev, offset+8+grp_hdr.msg_len+2*j, ext_mem, (u8 *)&offset2, 2)){ ERROR("read_abs_addr"); return -1; } offset2 += offset + 8 + grp_hdr.msg_len; if(read_abs_addr(dev, offset2, ext_mem, (u8 *)&rec, 7)){ ERROR("read_abs_addr"); return -1; } if(read_abs_addr(dev, offset2+7, ext_mem, msg, rec.msg_len)){ ERROR("read_abs_addr"); return -1; } print_rdm(grp, grp_hdr.msg_len, fp); fprintf(fp, "\t"); print_rdm(msg, rec.msg_len, fp); fprintf(fp, "\t"); switch(hdr.grp_type){ case date: fprintf(fp, "%d-%02d-%02d", 2000 + debcd(rec.year), debcd(rec.month), debcd(rec.day)); break; case dow_time: fprintf(fp, "%s %02d:%02d", schedule_dow[rec.dow], debcd(rec.hour), debcd(rec.minute)); break; case date_time: fprintf(fp, "%d-%02d-%02d %02d:%02d", 2000 + debcd(rec.year), debcd(rec.month), debcd(rec.day), debcd(rec.hour), debcd(rec.minute)); break; } fprintf(fp, "\n"); } } fclose(fp); return 0; }
/* too slow */ int read_schedule_mem(dldev_t *dev, schedule_t *db) { int i, j, k; u16 add_addr, offset, offset2; schedule_grp_t *grp; schedule_rec_t *rec; /* find the application */ if((i = find_app(dev, "SCHEDULE")) < 0){ ERROR("SCHEDULE application not found"); return -1; } /* application database data */ add_addr = dev->app[i].acb.add_addr; /* allocation size */ if(read_abs_addr(dev, add_addr, ext_mem, (u8 *)&db->hdr, 27)){ ERROR("read_abs_addr"); return -1; } db->head = db->tail = NULL; for(i = 0; i < db->hdr.num_grps; i++){ grp = (schedule_grp_t *)malloc(sizeof(schedule_grp_t)); if(read_abs_addr(dev, add_addr+27+2*i, ext_mem, (u8 *)&offset, 2)){ ERROR("read_abs_addr"); return -1; } offset += add_addr + 27; if(read_abs_addr(dev, offset, ext_mem, (u8 *)&grp->hdr, 8)){ ERROR("read_abs_addr"); return -1; } grp->hdr.msg = (u8 *)malloc(grp->hdr.msg_len); if(read_abs_addr(dev, offset+8, ext_mem, grp->hdr.msg, grp->hdr.msg_len)){ ERROR("read_abs_addr"); return -1; } /* TODO: Timex software bug? Some character values are * unpredictably greater than 0x69 and it should be & * ~(1 << 7) to be compared with dl's index. */ for(k = 0; k < grp->hdr.msg_len; k++) grp->hdr.msg[k] &= ~(1 << 7); grp->head = grp->tail = NULL; for(j = 0; j < grp->hdr.num_recs; j++){ rec = (schedule_rec_t *)malloc(sizeof(schedule_rec_t)); if(read_abs_addr(dev, offset+8+grp->hdr.msg_len+2*j, ext_mem, (u8 *)&offset2, 2)){ ERROR("read_abs_addr"); return -1; } offset2 += offset + 8 + grp->hdr.msg_len; if(read_abs_addr(dev, offset2, ext_mem, (u8 *)rec, 7)){ ERROR("read_abs_addr"); return -1; } rec->msg = (u8 *)malloc(rec->msg_len); if(read_abs_addr(dev, offset2+7, ext_mem, rec->msg, rec->msg_len)){ ERROR("read_abs_addr"); return -1; } /* TODO: Timex software bug? Some character values are * unpredictably greater than 0x69 and it should be & * ~(1 << 7) to be compared with dl's index. */ for(k = 0; k < rec->msg_len && rec->msg[k] != DM_SENTINEL; k++) rec->msg[k] &= ~(1 << 7); /* recalculate the length of the message */ rec->msg_len = k + 1; rec->prev = rec->next = NULL; if(grp->head){ rec->prev = grp->tail; grp->tail->next = rec; grp->tail = rec; }else grp->head = grp->tail = rec; } grp->prev = grp->next = NULL; if(db->head){ grp->prev = db->tail; db->tail->next = grp; db->tail = grp; }else db->head = db->tail = grp; } grp_type = db->hdr.grp_type; return 0; }